From 389bf0feb88989175a9fd8cb03b9cc66625de568 Mon Sep 17 00:00:00 2001 From: Sam Zackrisson Date: Fri, 2 Oct 2020 21:13:13 +0200 Subject: [PATCH] AEC3: Move option for reverb model in nonlinaer mode into AEC3 config MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This adds a config parameter for reverb modelling in nonlinear mode. The killswitch is preserved, and will have the same effect before and after this CL. Tested: Bitexact on a large number of aecdumps both with and without WebRTC-Aec3NonlinearModeReverbKillSwitch. Bug: webrtc:8671 Change-Id: I7b2fa92307af5316dbe895392367abb8d15f06bf Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/183541 Commit-Queue: Sam Zackrisson Reviewed-by: Per Ã…hgren Cr-Commit-Position: refs/heads/master@{#32298} --- api/audio/echo_canceller3_config.h | 1 + api/audio/echo_canceller3_config_json.cc | 6 +++++- api/audio/test/echo_canceller3_config_json_unittest.cc | 3 +++ modules/audio_processing/aec3/echo_canceller3.cc | 4 ++++ .../audio_processing/aec3/residual_echo_estimator.cc | 10 +++------- .../audio_processing/aec3/residual_echo_estimator.h | 1 - 6 files changed, 16 insertions(+), 9 deletions(-) diff --git a/api/audio/echo_canceller3_config.h b/api/audio/echo_canceller3_config.h index a505625538..7f416c1639 100644 --- a/api/audio/echo_canceller3_config.h +++ b/api/audio/echo_canceller3_config.h @@ -143,6 +143,7 @@ struct RTC_EXPORT EchoCanceller3Config { float noise_gate_slope = 0.3f; size_t render_pre_window_size = 1; size_t render_post_window_size = 1; + bool model_reverb_in_nonlinear_mode = true; } echo_model; struct ComfortNoise { diff --git a/api/audio/echo_canceller3_config_json.cc b/api/audio/echo_canceller3_config_json.cc index f5c1249674..6a99630e85 100644 --- a/api/audio/echo_canceller3_config_json.cc +++ b/api/audio/echo_canceller3_config_json.cc @@ -302,6 +302,8 @@ void Aec3ConfigFromJsonString(absl::string_view json_string, &cfg.echo_model.render_pre_window_size); ReadParam(section, "render_post_window_size", &cfg.echo_model.render_post_window_size); + ReadParam(section, "model_reverb_in_nonlinear_mode", + &cfg.echo_model.model_reverb_in_nonlinear_mode); } if (rtc::GetValueFromJsonObject(aec3_root, "comfort_noise", §ion)) { @@ -585,7 +587,9 @@ std::string Aec3ConfigToJsonString(const EchoCanceller3Config& config) { ost << "\"render_pre_window_size\": " << config.echo_model.render_pre_window_size << ","; ost << "\"render_post_window_size\": " - << config.echo_model.render_post_window_size; + << config.echo_model.render_post_window_size << ","; + ost << "\"model_reverb_in_nonlinear_mode\": " + << (config.echo_model.model_reverb_in_nonlinear_mode ? "true" : "false"); ost << "},"; ost << "\"comfort_noise\": {"; diff --git a/api/audio/test/echo_canceller3_config_json_unittest.cc b/api/audio/test/echo_canceller3_config_json_unittest.cc index a149c17a76..4a952fe910 100644 --- a/api/audio/test/echo_canceller3_config_json_unittest.cc +++ b/api/audio/test/echo_canceller3_config_json_unittest.cc @@ -22,6 +22,7 @@ TEST(EchoCanceller3JsonHelpers, ToStringAndParseJson) { cfg.filter.refined.error_floor = 2.f; cfg.filter.coarse_initial.length_blocks = 3u; cfg.comfort_noise.noise_floor_dbfs = 100.f; + cfg.echo_model.model_reverb_in_nonlinear_mode = false; cfg.suppressor.normal_tuning.mask_hf.enr_suppress = .5f; cfg.suppressor.subband_nearend_detection.nearend_average_blocks = 3; cfg.suppressor.subband_nearend_detection.subband1 = {1, 3}; @@ -48,6 +49,8 @@ TEST(EchoCanceller3JsonHelpers, ToStringAndParseJson) { cfg_transformed.filter.refined.error_floor); EXPECT_EQ(cfg.comfort_noise.noise_floor_dbfs, cfg_transformed.comfort_noise.noise_floor_dbfs); + EXPECT_EQ(cfg.echo_model.model_reverb_in_nonlinear_mode, + cfg_transformed.echo_model.model_reverb_in_nonlinear_mode); EXPECT_EQ(cfg.suppressor.normal_tuning.mask_hf.enr_suppress, cfg_transformed.suppressor.normal_tuning.mask_hf.enr_suppress); EXPECT_EQ(cfg.suppressor.subband_nearend_detection.nearend_average_blocks, diff --git a/modules/audio_processing/aec3/echo_canceller3.cc b/modules/audio_processing/aec3/echo_canceller3.cc index d96abc979f..a3f14f1380 100644 --- a/modules/audio_processing/aec3/echo_canceller3.cc +++ b/modules/audio_processing/aec3/echo_canceller3.cc @@ -378,6 +378,10 @@ EchoCanceller3Config AdjustConfig(const EchoCanceller3Config& config) { adjusted_cfg.render_levels.active_render_limit = 30.f; } + if (field_trial::IsEnabled("WebRTC-Aec3NonlinearModeReverbKillSwitch")) { + adjusted_cfg.echo_model.model_reverb_in_nonlinear_mode = false; + } + // Field-trial based override for the whole suppressor tuning. const std::string suppressor_tuning_override_trial_name = field_trial::FindFullName("WebRTC-Aec3SuppressorTuningOverride"); diff --git a/modules/audio_processing/aec3/residual_echo_estimator.cc b/modules/audio_processing/aec3/residual_echo_estimator.cc index e0de375e21..46db233975 100644 --- a/modules/audio_processing/aec3/residual_echo_estimator.cc +++ b/modules/audio_processing/aec3/residual_echo_estimator.cc @@ -23,10 +23,6 @@ namespace webrtc { namespace { -bool ModelReverbInNonlinearMode() { - return !field_trial::IsEnabled("WebRTC-Aec3NonlinearModeReverbKillSwitch"); -} - constexpr float kDefaultTransparentModeGain = 0.f; float GetTransparentModeGain() { @@ -181,8 +177,7 @@ ResidualEchoEstimator::ResidualEchoEstimator(const EchoCanceller3Config& config, early_reflections_general_gain_( GetEarlyReflectionsDefaultModeGain(config_.ep_strength)), late_reflections_general_gain_( - GetLateReflectionsDefaultModeGain(config_.ep_strength)), - model_reverb_in_nonlinear_mode_(ModelReverbInNonlinearMode()) { + GetLateReflectionsDefaultModeGain(config_.ep_strength)) { Reset(); } @@ -250,7 +245,8 @@ void ResidualEchoEstimator::Estimate( NonLinearEstimate(echo_path_gain, X2, R2); } - if (model_reverb_in_nonlinear_mode_ && !aec_state.TransparentModeActive()) { + if (config_.echo_model.model_reverb_in_nonlinear_mode && + !aec_state.TransparentModeActive()) { AddReverb(ReverbType::kNonLinear, aec_state, render_buffer, R2); } } diff --git a/modules/audio_processing/aec3/residual_echo_estimator.h b/modules/audio_processing/aec3/residual_echo_estimator.h index 081cc063fc..8fe7a84f04 100644 --- a/modules/audio_processing/aec3/residual_echo_estimator.h +++ b/modules/audio_processing/aec3/residual_echo_estimator.h @@ -68,7 +68,6 @@ class ResidualEchoEstimator { const float late_reflections_transparent_mode_gain_; const float early_reflections_general_gain_; const float late_reflections_general_gain_; - const bool model_reverb_in_nonlinear_mode_; std::array X2_noise_floor_; std::array X2_noise_floor_counter_; ReverbModel echo_reverb_;