From 8aaa604375a92d6ab41e70dae340a1fb92c6d62e Mon Sep 17 00:00:00 2001 From: Alessio Bazzica Date: Wed, 31 Mar 2021 15:16:05 +0200 Subject: [PATCH] AGC2 new data dumps Bug: webrtc:7494 Change-Id: Id288dd426e1c2754805bc548fbffe0eaeaacf3da Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/213420 Commit-Queue: Alessio Bazzica Reviewed-by: Jesus de Vicente Pena Cr-Commit-Position: refs/heads/master@{#33605} --- .../agc2/adaptive_digital_gain_applier.cc | 2 ++ .../agc2/adaptive_mode_level_estimator.cc | 6 +++++- modules/audio_processing/agc2/agc2_common.h | 1 + modules/audio_processing/agc2/limiter.cc | 8 +++++--- modules/audio_processing/gain_controller2.cc | 14 +++++++------- modules/audio_processing/gain_controller2.h | 8 ++++---- 6 files changed, 24 insertions(+), 15 deletions(-) diff --git a/modules/audio_processing/agc2/adaptive_digital_gain_applier.cc b/modules/audio_processing/agc2/adaptive_digital_gain_applier.cc index 36ef9be561..8a564647d2 100644 --- a/modules/audio_processing/agc2/adaptive_digital_gain_applier.cc +++ b/modules/audio_processing/agc2/adaptive_digital_gain_applier.cc @@ -136,6 +136,8 @@ void AdaptiveDigitalGainApplier::Process(const FrameInfo& info, } else if (frames_to_gain_increase_allowed_ > 0) { frames_to_gain_increase_allowed_--; } + apm_data_dumper_->DumpRaw("agc2_frames_to_gain_increase_allowed", + frames_to_gain_increase_allowed_); const float gain_change_this_frame_db = ComputeGainChangeThisFrameDb( target_gain_db, last_gain_db_, diff --git a/modules/audio_processing/agc2/adaptive_mode_level_estimator.cc b/modules/audio_processing/agc2/adaptive_mode_level_estimator.cc index 739997f5e3..9857471eb9 100644 --- a/modules/audio_processing/agc2/adaptive_mode_level_estimator.cc +++ b/modules/audio_processing/agc2/adaptive_mode_level_estimator.cc @@ -186,7 +186,7 @@ void AdaptiveModeLevelEstimator::ResetLevelEstimatorState( void AdaptiveModeLevelEstimator::DumpDebugData() const { apm_data_dumper_->DumpRaw("agc2_adaptive_level_estimate_dbfs", level_dbfs_); - apm_data_dumper_->DumpRaw("agc2_adaptive_num_adjacent_speech_frames_", + apm_data_dumper_->DumpRaw("agc2_adaptive_num_adjacent_speech_frames", num_adjacent_speech_frames_); apm_data_dumper_->DumpRaw("agc2_adaptive_preliminary_level_estimate_num", preliminary_state_.level_dbfs.numerator); @@ -194,6 +194,10 @@ void AdaptiveModeLevelEstimator::DumpDebugData() const { preliminary_state_.level_dbfs.denominator); apm_data_dumper_->DumpRaw("agc2_adaptive_preliminary_saturation_margin_db", preliminary_state_.saturation_protector.margin_db); + apm_data_dumper_->DumpRaw("agc2_adaptive_preliminary_time_to_full_buffer_ms", + preliminary_state_.time_to_full_buffer_ms); + apm_data_dumper_->DumpRaw("agc2_adaptive_reliable_time_to_full_buffer_ms", + reliable_state_.time_to_full_buffer_ms); } } // namespace webrtc diff --git a/modules/audio_processing/agc2/agc2_common.h b/modules/audio_processing/agc2/agc2_common.h index d0df43ffa6..db67113fa1 100644 --- a/modules/audio_processing/agc2/agc2_common.h +++ b/modules/audio_processing/agc2/agc2_common.h @@ -45,6 +45,7 @@ constexpr float kInitialSpeechLevelEstimateDbfs = -30.0f; // Robust VAD probability and speech decisions. constexpr int kDefaultVadRnnResetPeriodMs = 1500; +static_assert(kDefaultVadRnnResetPeriodMs % kFrameDurationMs == 0, ""); constexpr float kDefaultSmoothedVadProbabilityAttack = 1.0f; constexpr int kDefaultLevelEstimatorAdjacentSpeechFramesThreshold = 1; diff --git a/modules/audio_processing/agc2/limiter.cc b/modules/audio_processing/agc2/limiter.cc index 11473326e1..ed7d3ee5f2 100644 --- a/modules/audio_processing/agc2/limiter.cc +++ b/modules/audio_processing/agc2/limiter.cc @@ -125,9 +125,11 @@ void Limiter::Process(AudioFrameView signal) { last_scaling_factor_ = scaling_factors_.back(); // Dump data for debug. - apm_data_dumper_->DumpRaw("agc2_gain_curve_applier_scaling_factors", - samples_per_channel, - per_sample_scaling_factors_.data()); + apm_data_dumper_->DumpRaw("agc2_limiter_last_scaling_factor", + last_scaling_factor_); + apm_data_dumper_->DumpRaw( + "agc2_limiter_region", + static_cast(interp_gain_curve_.get_stats().region)); } InterpolatedGainCurve::Stats Limiter::GetGainCurveStats() const { diff --git a/modules/audio_processing/gain_controller2.cc b/modules/audio_processing/gain_controller2.cc index 44770653e5..bdb223b7d1 100644 --- a/modules/audio_processing/gain_controller2.cc +++ b/modules/audio_processing/gain_controller2.cc @@ -24,14 +24,13 @@ namespace webrtc { int GainController2::instance_count_ = 0; GainController2::GainController2() - : data_dumper_( - new ApmDataDumper(rtc::AtomicOps::Increment(&instance_count_))), + : data_dumper_(rtc::AtomicOps::Increment(&instance_count_)), gain_applier_(/*hard_clip_samples=*/false, /*initial_gain_factor=*/0.f), - limiter_(static_cast(48000), data_dumper_.get(), "Agc2"), + limiter_(static_cast(48000), &data_dumper_, "Agc2"), calls_since_last_limiter_log_(0) { if (config_.adaptive_digital.enabled) { - adaptive_agc_.reset(new AdaptiveAgc(data_dumper_.get())); + adaptive_agc_ = std::make_unique(&data_dumper_); } } @@ -43,12 +42,13 @@ void GainController2::Initialize(int sample_rate_hz) { sample_rate_hz == AudioProcessing::kSampleRate32kHz || sample_rate_hz == AudioProcessing::kSampleRate48kHz); limiter_.SetSampleRate(sample_rate_hz); - data_dumper_->InitiateNewSetOfRecordings(); - data_dumper_->DumpRaw("sample_rate_hz", sample_rate_hz); + data_dumper_.InitiateNewSetOfRecordings(); + data_dumper_.DumpRaw("sample_rate_hz", sample_rate_hz); calls_since_last_limiter_log_ = 0; } void GainController2::Process(AudioBuffer* audio) { + data_dumper_.DumpRaw("agc2_notified_analog_level", analog_level_); AudioFrameView float_frame(audio->channels(), audio->num_channels(), audio->num_frames()); // Apply fixed gain first, then the adaptive one. @@ -90,7 +90,7 @@ void GainController2::ApplyConfig( } gain_applier_.SetGainFactor(DbToRatio(config_.fixed_digital.gain_db)); if (config_.adaptive_digital.enabled) { - adaptive_agc_.reset(new AdaptiveAgc(data_dumper_.get(), config_)); + adaptive_agc_ = std::make_unique(&data_dumper_, config_); } else { adaptive_agc_.reset(); } diff --git a/modules/audio_processing/gain_controller2.h b/modules/audio_processing/gain_controller2.h index 31665bdeac..b62890d721 100644 --- a/modules/audio_processing/gain_controller2.h +++ b/modules/audio_processing/gain_controller2.h @@ -18,11 +18,11 @@ #include "modules/audio_processing/agc2/gain_applier.h" #include "modules/audio_processing/agc2/limiter.h" #include "modules/audio_processing/include/audio_processing.h" +#include "modules/audio_processing/logging/apm_data_dumper.h" #include "rtc_base/constructor_magic.h" namespace webrtc { -class ApmDataDumper; class AudioBuffer; // Gain Controller 2 aims to automatically adjust levels by acting on the @@ -30,6 +30,8 @@ class AudioBuffer; class GainController2 { public: GainController2(); + GainController2(const GainController2&) = delete; + GainController2& operator=(const GainController2&) = delete; ~GainController2(); void Initialize(int sample_rate_hz); @@ -41,15 +43,13 @@ class GainController2 { private: static int instance_count_; - std::unique_ptr data_dumper_; + ApmDataDumper data_dumper_; AudioProcessing::Config::GainController2 config_; GainApplier gain_applier_; std::unique_ptr adaptive_agc_; Limiter limiter_; int calls_since_last_limiter_log_; int analog_level_ = -1; - - RTC_DISALLOW_COPY_AND_ASSIGN(GainController2); }; } // namespace webrtc