diff --git a/api/audio/echo_canceller3_config.h b/api/audio/echo_canceller3_config.h index 55281af93b..2ccc9acd34 100644 --- a/api/audio/echo_canceller3_config.h +++ b/api/audio/echo_canceller3_config.h @@ -90,6 +90,7 @@ struct RTC_EXPORT EchoCanceller3Config { bool conservative_initial_phase = false; bool enable_coarse_filter_output_usage = true; bool use_linear_filter = true; + bool high_pass_filter_echo_reference = false; bool export_linear_aec_output = false; } filter; diff --git a/api/audio/echo_canceller3_config_json.cc b/api/audio/echo_canceller3_config_json.cc index 9d10da9949..9e15e3a5c8 100644 --- a/api/audio/echo_canceller3_config_json.cc +++ b/api/audio/echo_canceller3_config_json.cc @@ -230,6 +230,8 @@ void Aec3ConfigFromJsonString(absl::string_view json_string, ReadParam(section, "enable_coarse_filter_output_usage", &cfg.filter.enable_coarse_filter_output_usage); ReadParam(section, "use_linear_filter", &cfg.filter.use_linear_filter); + ReadParam(section, "high_pass_filter_echo_reference", + &cfg.filter.high_pass_filter_echo_reference); ReadParam(section, "export_linear_aec_output", &cfg.filter.export_linear_aec_output); } @@ -513,6 +515,9 @@ std::string Aec3ConfigToJsonString(const EchoCanceller3Config& config) { << ","; ost << "\"use_linear_filter\": " << (config.filter.use_linear_filter ? "true" : "false") << ","; + ost << "\"high_pass_filter_echo_reference\": " + << (config.filter.high_pass_filter_echo_reference ? "true" : "false") + << ","; ost << "\"export_linear_aec_output\": " << (config.filter.export_linear_aec_output ? "true" : "false"); diff --git a/api/audio/test/echo_canceller3_config_json_unittest.cc b/api/audio/test/echo_canceller3_config_json_unittest.cc index 4a952fe910..d6edd07d2e 100644 --- a/api/audio/test/echo_canceller3_config_json_unittest.cc +++ b/api/audio/test/echo_canceller3_config_json_unittest.cc @@ -21,6 +21,8 @@ TEST(EchoCanceller3JsonHelpers, ToStringAndParseJson) { cfg.delay.log_warning_on_delay_changes = true; cfg.filter.refined.error_floor = 2.f; cfg.filter.coarse_initial.length_blocks = 3u; + cfg.filter.high_pass_filter_echo_reference = + !cfg.filter.high_pass_filter_echo_reference; 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; @@ -47,6 +49,8 @@ TEST(EchoCanceller3JsonHelpers, ToStringAndParseJson) { cfg_transformed.filter.coarse_initial.length_blocks); EXPECT_EQ(cfg.filter.refined.error_floor, cfg_transformed.filter.refined.error_floor); + EXPECT_EQ(cfg.filter.high_pass_filter_echo_reference, + cfg_transformed.filter.high_pass_filter_echo_reference); 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, diff --git a/modules/audio_processing/aec3/echo_canceller3.cc b/modules/audio_processing/aec3/echo_canceller3.cc index 98da232bba..0f8e35d09e 100644 --- a/modules/audio_processing/aec3/echo_canceller3.cc +++ b/modules/audio_processing/aec3/echo_canceller3.cc @@ -251,6 +251,10 @@ EchoCanceller3Config AdjustConfig(const EchoCanceller3Config& config) { adjusted_cfg.filter.initial_state_seconds = 2.0f; } + if (field_trial::IsEnabled("WebRTC-Aec3HighPassFilterEchoReference")) { + adjusted_cfg.filter.high_pass_filter_echo_reference = true; + } + if (field_trial::IsEnabled("WebRTC-Aec3EchoSaturationDetectionKillSwitch")) { adjusted_cfg.ep_strength.echo_can_saturate = false; } @@ -574,6 +578,7 @@ EchoCanceller3Config AdjustConfig(const EchoCanceller3Config& config) { class EchoCanceller3::RenderWriter { public: RenderWriter(ApmDataDumper* data_dumper, + const EchoCanceller3Config& config, SwapQueue>>, Aec3RenderQueueItemVerifier>* render_transfer_queue, size_t num_bands, @@ -590,7 +595,7 @@ class EchoCanceller3::RenderWriter { ApmDataDumper* data_dumper_; const size_t num_bands_; const size_t num_channels_; - HighPassFilter high_pass_filter_; + std::unique_ptr high_pass_filter_; std::vector>> render_queue_input_frame_; SwapQueue>>, Aec3RenderQueueItemVerifier>* render_transfer_queue_; @@ -598,6 +603,7 @@ class EchoCanceller3::RenderWriter { EchoCanceller3::RenderWriter::RenderWriter( ApmDataDumper* data_dumper, + const EchoCanceller3Config& config, SwapQueue>>, Aec3RenderQueueItemVerifier>* render_transfer_queue, size_t num_bands, @@ -605,7 +611,6 @@ EchoCanceller3::RenderWriter::RenderWriter( : data_dumper_(data_dumper), num_bands_(num_bands), num_channels_(num_channels), - high_pass_filter_(16000, num_channels), render_queue_input_frame_( num_bands_, std::vector>( @@ -613,6 +618,9 @@ EchoCanceller3::RenderWriter::RenderWriter( std::vector(AudioBuffer::kSplitBandSize, 0.f))), render_transfer_queue_(render_transfer_queue) { RTC_DCHECK(data_dumper); + if (config.filter.high_pass_filter_echo_reference) { + high_pass_filter_ = std::make_unique(16000, num_channels); + } } EchoCanceller3::RenderWriter::~RenderWriter() = default; @@ -631,7 +639,9 @@ void EchoCanceller3::RenderWriter::Insert(const AudioBuffer& input) { CopyBufferIntoFrame(input, num_bands_, num_channels_, &render_queue_input_frame_); - high_pass_filter_.Process(&render_queue_input_frame_[0]); + if (high_pass_filter_) { + high_pass_filter_->Process(&render_queue_input_frame_[0]); + } static_cast(render_transfer_queue_->Insert(&render_queue_input_frame_)); } @@ -704,7 +714,7 @@ EchoCanceller3::EchoCanceller3(const EchoCanceller3Config& config, config_.delay.fixed_capture_delay_samples)); } - render_writer_.reset(new RenderWriter(data_dumper_.get(), + render_writer_.reset(new RenderWriter(data_dumper_.get(), config_, &render_transfer_queue_, num_bands_, num_render_channels_)); diff --git a/modules/audio_processing/aec3/echo_canceller3_unittest.cc b/modules/audio_processing/aec3/echo_canceller3_unittest.cc index a02cfa3904..acf84738af 100644 --- a/modules/audio_processing/aec3/echo_canceller3_unittest.cc +++ b/modules/audio_processing/aec3/echo_canceller3_unittest.cc @@ -252,8 +252,6 @@ class EchoCanceller3Tester { capture_output.push_back(capture_buffer_.split_bands(0)[0][k]); } } - HighPassFilter hp_filter(16000, 1); - hp_filter.Process(&render_input); EXPECT_TRUE( VerifyOutputFrameBitexactness(render_input[0], capture_output, -64)); @@ -545,8 +543,6 @@ class EchoCanceller3Tester { capture_output.push_back(capture_buffer_.split_bands(0)[0][k]); } } - HighPassFilter hp_filter(16000, 1); - hp_filter.Process(&render_input); EXPECT_TRUE( VerifyOutputFrameBitexactness(render_input[0], capture_output, -64)); diff --git a/modules/audio_processing/audio_processing_unittest.cc b/modules/audio_processing/audio_processing_unittest.cc index e3aedf691f..4c879c7e50 100644 --- a/modules/audio_processing/audio_processing_unittest.cc +++ b/modules/audio_processing/audio_processing_unittest.cc @@ -2216,7 +2216,7 @@ INSTANTIATE_TEST_SUITE_P( std::make_tuple(32000, 44100, 16000, 44100, 19, 15), std::make_tuple(32000, 32000, 48000, 32000, 40, 35), std::make_tuple(32000, 32000, 32000, 32000, 0, 0), - std::make_tuple(32000, 32000, 16000, 32000, 40, 20), + std::make_tuple(32000, 32000, 16000, 32000, 39, 20), std::make_tuple(32000, 16000, 48000, 16000, 25, 20), std::make_tuple(32000, 16000, 32000, 16000, 25, 20), std::make_tuple(32000, 16000, 16000, 16000, 25, 0), @@ -2231,7 +2231,7 @@ INSTANTIATE_TEST_SUITE_P( std::make_tuple(16000, 32000, 32000, 32000, 25, 0), std::make_tuple(16000, 32000, 16000, 32000, 25, 20), std::make_tuple(16000, 16000, 48000, 16000, 39, 20), - std::make_tuple(16000, 16000, 32000, 16000, 40, 20), + std::make_tuple(16000, 16000, 32000, 16000, 39, 20), std::make_tuple(16000, 16000, 16000, 16000, 0, 0))); #elif defined(WEBRTC_AUDIOPROC_FIXED_PROFILE) diff --git a/resources/audio_processing/output_data_float.pb.sha1 b/resources/audio_processing/output_data_float.pb.sha1 index a19c6c3b60..d3375949ac 100644 --- a/resources/audio_processing/output_data_float.pb.sha1 +++ b/resources/audio_processing/output_data_float.pb.sha1 @@ -1 +1 @@ -1dd2c11da1f1dec49f728881628c1348e07a19cd \ No newline at end of file +749efdfd1e3c3ace434b3673dac9ce4938534449 \ No newline at end of file diff --git a/resources/audio_processing/output_data_float_avx2.pb.sha1 b/resources/audio_processing/output_data_float_avx2.pb.sha1 index 54a5b06963..79a95efc0e 100644 --- a/resources/audio_processing/output_data_float_avx2.pb.sha1 +++ b/resources/audio_processing/output_data_float_avx2.pb.sha1 @@ -1 +1 @@ -16e9d8f3b8b6c23b2b5100a1162acfe67acc37a7 \ No newline at end of file +78c1a84de332173863c997538aa19b8cdcba5020 \ No newline at end of file