From b6f9e6c979cd6e2e95f1d4cf357f4d91aba9f69c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Per=20=C3=85hgren?= Date: Tue, 12 Dec 2017 22:49:41 +0100 Subject: [PATCH] Added further ability to adjust the filter adaptation in AEC3 Bug: webrtc:8609 Change-Id: I079935bd782afc89146d98fd2248a1c6389871c9 Reviewed-on: https://webrtc-review.googlesource.com/32420 Commit-Queue: Gustaf Ullberg Reviewed-by: Gustaf Ullberg Cr-Commit-Position: refs/heads/master@{#21268} --- .../audio_processing/aec3/main_filter_update_gain.cc | 9 ++++++--- .../audio_processing/aec3/main_filter_update_gain.h | 4 +++- .../aec3/main_filter_update_gain_unittest.cc | 12 ++++++------ modules/audio_processing/aec3/subtractor.cc | 3 ++- modules/audio_processing/include/audio_processing.h | 1 + 5 files changed, 18 insertions(+), 11 deletions(-) diff --git a/modules/audio_processing/aec3/main_filter_update_gain.cc b/modules/audio_processing/aec3/main_filter_update_gain.cc index a9b4999faf..fb6e4b50f0 100644 --- a/modules/audio_processing/aec3/main_filter_update_gain.cc +++ b/modules/audio_processing/aec3/main_filter_update_gain.cc @@ -30,12 +30,14 @@ int MainFilterUpdateGain::instance_count_ = 0; MainFilterUpdateGain::MainFilterUpdateGain(float leakage_converged, float leakage_diverged, - float noise_gate_power) + float noise_gate_power, + float error_floor) : data_dumper_( new ApmDataDumper(rtc::AtomicOps::Increment(&instance_count_))), leakage_converged_(leakage_converged), leakage_diverged_(leakage_diverged), noise_gate_power_(noise_gate_power), + error_floor_(error_floor), poor_excitation_counter_(kPoorExcitationCounterInitial) { H_error_.fill(kHErrorInitial); } @@ -113,8 +115,9 @@ void MainFilterUpdateGain::Compute( std::transform(erl.begin(), erl.end(), H_error_increase.begin(), H_error_increase.begin(), std::multiplies()); std::transform(H_error_.begin(), H_error_.end(), H_error_increase.begin(), - H_error_.begin(), - [&](float a, float b) { return std::max(a + b, 0.1f); }); + H_error_.begin(), [&](float a, float b) { + return std::max(a + b, error_floor_); + }); data_dumper_->DumpRaw("aec3_main_gain_H_error", H_error_); } diff --git a/modules/audio_processing/aec3/main_filter_update_gain.h b/modules/audio_processing/aec3/main_filter_update_gain.h index 138402dc17..241d063516 100644 --- a/modules/audio_processing/aec3/main_filter_update_gain.h +++ b/modules/audio_processing/aec3/main_filter_update_gain.h @@ -30,7 +30,8 @@ class MainFilterUpdateGain { public: MainFilterUpdateGain(float leakage_converged, float leakage_diverged, - float noise_gate_power); + float noise_gate_power, + float error_floor); ~MainFilterUpdateGain(); // Takes action in the case of a known echo path change. @@ -50,6 +51,7 @@ class MainFilterUpdateGain { const float leakage_converged_; const float leakage_diverged_; const float noise_gate_power_; + const float error_floor_; std::array H_error_; size_t poor_excitation_counter_; size_t call_counter_ = 0; diff --git a/modules/audio_processing/aec3/main_filter_update_gain_unittest.cc b/modules/audio_processing/aec3/main_filter_update_gain_unittest.cc index 297b9b1d33..fb088a3994 100644 --- a/modules/audio_processing/aec3/main_filter_update_gain_unittest.cc +++ b/modules/audio_processing/aec3/main_filter_update_gain_unittest.cc @@ -52,9 +52,9 @@ void RunFilterUpdateTest(int num_blocks_to_process, x_old.fill(0.f); ShadowFilterUpdateGain shadow_gain(config.filter.shadow_rate, config.filter.shadow_noise_gate); - MainFilterUpdateGain main_gain(config.filter.leakage_converged, - config.filter.leakage_diverged, - config.filter.main_noise_gate); + MainFilterUpdateGain main_gain( + config.filter.leakage_converged, config.filter.leakage_diverged, + config.filter.main_noise_gate, config.filter.error_floor); Random random_generator(42U); std::vector> x(3, std::vector(kBlockSize, 0.f)); std::vector y(kBlockSize, 0.f); @@ -193,9 +193,9 @@ TEST(MainFilterUpdateGain, NullDataOutputGain) { RenderDelayBuffer::Create(config, 3)); RenderSignalAnalyzer analyzer; SubtractorOutput output; - MainFilterUpdateGain gain(config.filter.leakage_converged, - config.filter.leakage_diverged, - config.filter.main_noise_gate); + MainFilterUpdateGain gain( + config.filter.leakage_converged, config.filter.leakage_diverged, + config.filter.main_noise_gate, config.filter.error_floor); EXPECT_DEATH(gain.Compute(*render_delay_buffer->GetRenderBuffer(), analyzer, output, filter, false, nullptr), ""); diff --git a/modules/audio_processing/aec3/subtractor.cc b/modules/audio_processing/aec3/subtractor.cc index cd2d9ac1c7..7a62f59c5c 100644 --- a/modules/audio_processing/aec3/subtractor.cc +++ b/modules/audio_processing/aec3/subtractor.cc @@ -55,7 +55,8 @@ Subtractor::Subtractor(const EchoCanceller3Config& config, shadow_filter_(config.filter.length_blocks, optimization, data_dumper_), G_main_(config.filter.leakage_converged, config.filter.leakage_diverged, - config.filter.main_noise_gate), + config.filter.main_noise_gate, + config.filter.error_floor), G_shadow_(config.filter.shadow_rate, config.filter.shadow_noise_gate) { RTC_DCHECK(data_dumper_); } diff --git a/modules/audio_processing/include/audio_processing.h b/modules/audio_processing/include/audio_processing.h index ab9d2cda77..28990b843e 100644 --- a/modules/audio_processing/include/audio_processing.h +++ b/modules/audio_processing/include/audio_processing.h @@ -1165,6 +1165,7 @@ struct EchoCanceller3Config { float shadow_rate = 0.5f; float leakage_converged = 0.01f; float leakage_diverged = 1.f / 60.f; + float error_floor = 0.1f; float main_noise_gate = 220075344.f; float shadow_noise_gate = 220075344.f; } filter;