From a33dc0144a5b44f4c841d65213fda497a1b90195 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Per=20=C3=85hgren?= Date: Tue, 3 Sep 2019 23:59:52 +0200 Subject: [PATCH] AEC3: Propagate the number of channels to the adaptive filters MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This CL propagates the number of render and capture channels into the echo subtractor and the adaptive filters. Bug: webrtc:10913 Change-Id: I5ffff24ff64b7cc0f262bf008b34b6dfca1e78f9 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/151300 Reviewed-by: Sam Zackrisson Commit-Queue: Per Ã…hgren Cr-Commit-Position: refs/heads/master@{#29059} --- modules/audio_processing/aec3/adaptive_fir_filter.cc | 2 ++ modules/audio_processing/aec3/adaptive_fir_filter.h | 2 ++ .../aec3/adaptive_fir_filter_unittest.cc | 11 ++++++----- modules/audio_processing/aec3/echo_remover.cc | 8 +++++--- .../aec3/main_filter_update_gain_unittest.cc | 8 ++++---- .../aec3/shadow_filter_update_gain_unittest.cc | 6 +++--- modules/audio_processing/aec3/subtractor.cc | 6 ++++++ modules/audio_processing/aec3/subtractor.h | 2 ++ modules/audio_processing/aec3/subtractor_unittest.cc | 9 +++++---- .../aec3/suppression_gain_unittest.cc | 2 +- 10 files changed, 36 insertions(+), 20 deletions(-) diff --git a/modules/audio_processing/aec3/adaptive_fir_filter.cc b/modules/audio_processing/aec3/adaptive_fir_filter.cc index 2b11125aee..c6665b2322 100644 --- a/modules/audio_processing/aec3/adaptive_fir_filter.cc +++ b/modules/audio_processing/aec3/adaptive_fir_filter.cc @@ -418,6 +418,8 @@ void ApplyFilter_SSE2(const RenderBuffer& render_buffer, AdaptiveFirFilter::AdaptiveFirFilter(size_t max_size_partitions, size_t initial_size_partitions, size_t size_change_duration_blocks, + size_t num_render_channels, + size_t num_capture_channels, Aec3Optimization optimization, ApmDataDumper* data_dumper) : data_dumper_(data_dumper), diff --git a/modules/audio_processing/aec3/adaptive_fir_filter.h b/modules/audio_processing/aec3/adaptive_fir_filter.h index a7418b015e..12716bbb5a 100644 --- a/modules/audio_processing/aec3/adaptive_fir_filter.h +++ b/modules/audio_processing/aec3/adaptive_fir_filter.h @@ -96,6 +96,8 @@ class AdaptiveFirFilter { AdaptiveFirFilter(size_t max_size_partitions, size_t initial_size_partitions, size_t size_change_duration_blocks, + size_t num_render_channels, + size_t num_capture_channels, Aec3Optimization optimization, ApmDataDumper* data_dumper); diff --git a/modules/audio_processing/aec3/adaptive_fir_filter_unittest.cc b/modules/audio_processing/aec3/adaptive_fir_filter_unittest.cc index 64d84cdc9e..e7c9c85eca 100644 --- a/modules/audio_processing/aec3/adaptive_fir_filter_unittest.cc +++ b/modules/audio_processing/aec3/adaptive_fir_filter_unittest.cc @@ -296,13 +296,14 @@ TEST(AdaptiveFirFilter, UpdateErlSse2Optimization) { #if RTC_DCHECK_IS_ON && GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID) // Verifies that the check for non-null data dumper works. TEST(AdaptiveFirFilter, NullDataDumper) { - EXPECT_DEATH(AdaptiveFirFilter(9, 9, 250, DetectOptimization(), nullptr), ""); + EXPECT_DEATH( + AdaptiveFirFilter(9, 9, 250, 1, 1, DetectOptimization(), nullptr), ""); } // Verifies that the check for non-null filter output works. TEST(AdaptiveFirFilter, NullFilterOutput) { ApmDataDumper data_dumper(42); - AdaptiveFirFilter filter(9, 9, 250, DetectOptimization(), &data_dumper); + AdaptiveFirFilter filter(9, 9, 250, 1, 1, DetectOptimization(), &data_dumper); std::unique_ptr render_delay_buffer( RenderDelayBuffer::Create(EchoCanceller3Config(), 48000, 1)); EXPECT_DEATH(filter.Filter(*render_delay_buffer->GetRenderBuffer(), nullptr), @@ -315,7 +316,7 @@ TEST(AdaptiveFirFilter, NullFilterOutput) { // are turned on. TEST(AdaptiveFirFilter, FilterStatisticsAccess) { ApmDataDumper data_dumper(42); - AdaptiveFirFilter filter(9, 9, 250, DetectOptimization(), &data_dumper); + AdaptiveFirFilter filter(9, 9, 250, 1, 1, DetectOptimization(), &data_dumper); filter.Erl(); filter.FilterFrequencyResponse(); } @@ -324,7 +325,7 @@ TEST(AdaptiveFirFilter, FilterStatisticsAccess) { TEST(AdaptiveFirFilter, FilterSize) { ApmDataDumper data_dumper(42); for (size_t filter_size = 1; filter_size < 5; ++filter_size) { - AdaptiveFirFilter filter(filter_size, filter_size, 250, + AdaptiveFirFilter filter(filter_size, filter_size, 250, 1, 1, DetectOptimization(), &data_dumper); EXPECT_EQ(filter_size, filter.SizePartitions()); } @@ -342,7 +343,7 @@ TEST(AdaptiveFirFilter, FilterAndAdapt) { EchoCanceller3Config config; AdaptiveFirFilter filter(config.filter.main.length_blocks, config.filter.main.length_blocks, - config.filter.config_change_duration_blocks, + config.filter.config_change_duration_blocks, 1, 1, DetectOptimization(), &data_dumper); Aec3Fft fft; config.delay.default_delay = 1; diff --git a/modules/audio_processing/aec3/echo_remover.cc b/modules/audio_processing/aec3/echo_remover.cc index 60538d644e..8f288de1f5 100644 --- a/modules/audio_processing/aec3/echo_remover.cc +++ b/modules/audio_processing/aec3/echo_remover.cc @@ -160,7 +160,11 @@ EchoRemoverImpl::EchoRemoverImpl(const EchoCanceller3Config& config, num_capture_channels_(num_capture_channels), use_shadow_filter_output_( config_.filter.enable_shadow_filter_output_usage), - subtractor_(config, data_dumper_.get(), optimization_), + subtractor_(config, + num_render_channels_, + num_capture_channels_, + data_dumper_.get(), + optimization_), suppression_gain_(config_, optimization_, sample_rate_hz), cng_(optimization_), suppression_filter_(optimization_, sample_rate_hz_), @@ -171,8 +175,6 @@ EchoRemoverImpl::EchoRemoverImpl(const EchoCanceller3Config& config, x_old_.fill(0.f); y_old_.fill(0.f); e_old_.fill(0.f); - (void)num_render_channels_; - (void)num_capture_channels_; } EchoRemoverImpl::~EchoRemoverImpl() = default; 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 648762a9c8..29d8ea901e 100644 --- a/modules/audio_processing/aec3/main_filter_update_gain_unittest.cc +++ b/modules/audio_processing/aec3/main_filter_update_gain_unittest.cc @@ -51,12 +51,12 @@ void RunFilterUpdateTest(int num_blocks_to_process, config.filter.shadow.length_blocks = filter_length_blocks; AdaptiveFirFilter main_filter(config.filter.main.length_blocks, config.filter.main.length_blocks, - config.filter.config_change_duration_blocks, - DetectOptimization(), &data_dumper); + config.filter.config_change_duration_blocks, 1, + 1, DetectOptimization(), &data_dumper); AdaptiveFirFilter shadow_filter(config.filter.shadow.length_blocks, config.filter.shadow.length_blocks, config.filter.config_change_duration_blocks, - DetectOptimization(), &data_dumper); + 1, 1, DetectOptimization(), &data_dumper); Aec3Fft fft; std::array x_old; x_old.fill(0.f); @@ -210,7 +210,7 @@ TEST(MainFilterUpdateGain, NullDataOutputGain) { EchoCanceller3Config config; AdaptiveFirFilter filter(config.filter.main.length_blocks, config.filter.main.length_blocks, - config.filter.config_change_duration_blocks, + config.filter.config_change_duration_blocks, 1, 1, DetectOptimization(), &data_dumper); RenderSignalAnalyzer analyzer(EchoCanceller3Config{}); SubtractorOutput output; diff --git a/modules/audio_processing/aec3/shadow_filter_update_gain_unittest.cc b/modules/audio_processing/aec3/shadow_filter_update_gain_unittest.cc index b49b00d966..aefa2cb15d 100644 --- a/modules/audio_processing/aec3/shadow_filter_update_gain_unittest.cc +++ b/modules/audio_processing/aec3/shadow_filter_update_gain_unittest.cc @@ -43,12 +43,12 @@ void RunFilterUpdateTest(int num_blocks_to_process, config.filter.main.length_blocks = filter_length_blocks; AdaptiveFirFilter main_filter(config.filter.main.length_blocks, config.filter.main.length_blocks, - config.filter.config_change_duration_blocks, - DetectOptimization(), &data_dumper); + config.filter.config_change_duration_blocks, 1, + 1, DetectOptimization(), &data_dumper); AdaptiveFirFilter shadow_filter(config.filter.shadow.length_blocks, config.filter.shadow.length_blocks, config.filter.config_change_duration_blocks, - DetectOptimization(), &data_dumper); + 1, 1, DetectOptimization(), &data_dumper); Aec3Fft fft; constexpr int kSampleRateHz = 48000; diff --git a/modules/audio_processing/aec3/subtractor.cc b/modules/audio_processing/aec3/subtractor.cc index 5e6f773911..efb79d42dc 100644 --- a/modules/audio_processing/aec3/subtractor.cc +++ b/modules/audio_processing/aec3/subtractor.cc @@ -56,6 +56,8 @@ void ScaleFilterOutput(rtc::ArrayView y, } // namespace Subtractor::Subtractor(const EchoCanceller3Config& config, + size_t num_render_channels, + size_t num_capture_channels, ApmDataDumper* data_dumper, Aec3Optimization optimization) : fft_(), @@ -65,11 +67,15 @@ Subtractor::Subtractor(const EchoCanceller3Config& config, main_filter_(config_.filter.main.length_blocks, config_.filter.main_initial.length_blocks, config.filter.config_change_duration_blocks, + num_render_channels, + num_capture_channels, optimization, data_dumper_), shadow_filter_(config_.filter.shadow.length_blocks, config_.filter.shadow_initial.length_blocks, config.filter.config_change_duration_blocks, + num_render_channels, + num_capture_channels, optimization, data_dumper_), G_main_(config_.filter.main_initial, diff --git a/modules/audio_processing/aec3/subtractor.h b/modules/audio_processing/aec3/subtractor.h index ccff7c1ac5..a23eaaf707 100644 --- a/modules/audio_processing/aec3/subtractor.h +++ b/modules/audio_processing/aec3/subtractor.h @@ -39,6 +39,8 @@ namespace webrtc { class Subtractor { public: Subtractor(const EchoCanceller3Config& config, + size_t num_render_channels, + size_t num_capture_channels, ApmDataDumper* data_dumper, Aec3Optimization optimization); ~Subtractor(); diff --git a/modules/audio_processing/aec3/subtractor_unittest.cc b/modules/audio_processing/aec3/subtractor_unittest.cc index f29b44625d..40d8569ffd 100644 --- a/modules/audio_processing/aec3/subtractor_unittest.cc +++ b/modules/audio_processing/aec3/subtractor_unittest.cc @@ -38,7 +38,7 @@ float RunSubtractorTest(int num_blocks_to_process, config.filter.main.length_blocks = main_filter_length_blocks; config.filter.shadow.length_blocks = shadow_filter_length_blocks; - Subtractor subtractor(config, &data_dumper, DetectOptimization()); + Subtractor subtractor(config, 1, 1, &data_dumper, DetectOptimization()); absl::optional delay_estimate; std::vector>> x( kNumBands, std::vector>( @@ -120,7 +120,8 @@ std::string ProduceDebugText(size_t delay, int filter_length_blocks) { // Verifies that the check for non data dumper works. TEST(Subtractor, NullDataDumper) { EXPECT_DEATH( - Subtractor(EchoCanceller3Config(), nullptr, DetectOptimization()), ""); + Subtractor(EchoCanceller3Config(), 1, 1, nullptr, DetectOptimization()), + ""); } // Verifies the check for null subtractor output. @@ -129,7 +130,7 @@ TEST(Subtractor, NullDataDumper) { TEST(Subtractor, DISABLED_NullOutput) { ApmDataDumper data_dumper(42); EchoCanceller3Config config; - Subtractor subtractor(config, &data_dumper, DetectOptimization()); + Subtractor subtractor(config, 1, 1, &data_dumper, DetectOptimization()); std::unique_ptr render_delay_buffer( RenderDelayBuffer::Create(config, 48000, 1)); RenderSignalAnalyzer render_signal_analyzer(config); @@ -145,7 +146,7 @@ TEST(Subtractor, DISABLED_NullOutput) { TEST(Subtractor, WrongCaptureSize) { ApmDataDumper data_dumper(42); EchoCanceller3Config config; - Subtractor subtractor(config, &data_dumper, DetectOptimization()); + Subtractor subtractor(config, 1, 1, &data_dumper, DetectOptimization()); std::unique_ptr render_delay_buffer( RenderDelayBuffer::Create(config, 48000, 1)); RenderSignalAnalyzer render_signal_analyzer(config); diff --git a/modules/audio_processing/aec3/suppression_gain_unittest.cc b/modules/audio_processing/aec3/suppression_gain_unittest.cc index 331b903ebe..cfd92be04a 100644 --- a/modules/audio_processing/aec3/suppression_gain_unittest.cc +++ b/modules/audio_processing/aec3/suppression_gain_unittest.cc @@ -79,7 +79,7 @@ TEST(SuppressionGain, BasicGainComputation) { EchoCanceller3Config config; AecState aec_state(config); ApmDataDumper data_dumper(42); - Subtractor subtractor(config, &data_dumper, DetectOptimization()); + Subtractor subtractor(config, 1, 1, &data_dumper, DetectOptimization()); std::unique_ptr render_delay_buffer( RenderDelayBuffer::Create(config, kSampleRateHz, kNumChannels)); absl::optional delay_estimate;