From ec22e3f503ff0d2932f101c6b9d7bd494a9f7178 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Per=20=C3=85hgren?= Date: Wed, 20 Dec 2017 15:20:37 +0100 Subject: [PATCH] Simplified the usage of the render buffer in AEC3 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bug: webrtc:8671 Change-Id: I4af397e9f208685e4ffec2a5f92501e0d2605c42 Reviewed-on: https://webrtc-review.googlesource.com/35060 Commit-Queue: Per Åhgren Reviewed-by: Per Åhgren Reviewed-by: Gustaf Ullberg Cr-Commit-Position: refs/heads/master@{#21386} --- .../aec3/adaptive_fir_filter.cc | 18 +++++--- .../aec3/adaptive_fir_filter_unittest.cc | 7 ++- .../aec3/aec_state_unittest.cc | 3 +- .../echo_path_delay_estimator_unittest.cc | 3 -- modules/audio_processing/aec3/echo_remover.cc | 4 +- .../aec3/main_filter_update_gain.cc | 4 +- .../aec3/main_filter_update_gain.h | 4 +- .../aec3/main_filter_update_gain_unittest.cc | 23 +++++----- .../aec3/matched_filter_unittest.cc | 1 - .../aec3/mock/mock_render_delay_buffer.h | 2 +- .../audio_processing/aec3/render_buffer.cc | 33 +++++++------- modules/audio_processing/aec3/render_buffer.h | 45 +++++++++---------- .../aec3/render_buffer_unittest.cc | 6 +-- .../aec3/render_delay_buffer.cc | 5 +-- .../aec3/render_signal_analyzer.cc | 3 +- .../aec3/shadow_filter_update_gain.cc | 4 +- .../aec3/shadow_filter_update_gain.h | 2 +- .../shadow_filter_update_gain_unittest.cc | 14 +++--- modules/audio_processing/aec3/subtractor.cc | 10 ++++- .../aec3/subtractor_unittest.cc | 1 - 20 files changed, 93 insertions(+), 99 deletions(-) diff --git a/modules/audio_processing/aec3/adaptive_fir_filter.cc b/modules/audio_processing/aec3/adaptive_fir_filter.cc index 713eaa8839..d92e53801b 100644 --- a/modules/audio_processing/aec3/adaptive_fir_filter.cc +++ b/modules/audio_processing/aec3/adaptive_fir_filter.cc @@ -134,7 +134,8 @@ void UpdateErlEstimator_SSE2( void AdaptPartitions(const RenderBuffer& render_buffer, const FftData& G, rtc::ArrayView H) { - rtc::ArrayView render_buffer_data = render_buffer.Buffer(); + rtc::ArrayView render_buffer_data = + render_buffer.GetFftBuffer(); size_t index = render_buffer.Position(); for (auto& H_j : H) { const FftData& X = render_buffer_data[index]; @@ -152,7 +153,8 @@ void AdaptPartitions(const RenderBuffer& render_buffer, void AdaptPartitions_NEON(const RenderBuffer& render_buffer, const FftData& G, rtc::ArrayView H) { - rtc::ArrayView render_buffer_data = render_buffer.Buffer(); + rtc::ArrayView render_buffer_data = + render_buffer.GetFftBuffer(); const int lim1 = std::min(render_buffer_data.size() - render_buffer.Position(), H.size()); const int lim2 = H.size(); @@ -209,7 +211,8 @@ void AdaptPartitions_NEON(const RenderBuffer& render_buffer, void AdaptPartitions_SSE2(const RenderBuffer& render_buffer, const FftData& G, rtc::ArrayView H) { - rtc::ArrayView render_buffer_data = render_buffer.Buffer(); + rtc::ArrayView render_buffer_data = + render_buffer.GetFftBuffer(); const int lim1 = std::min(render_buffer_data.size() - render_buffer.Position(), H.size()); const int lim2 = H.size(); @@ -274,7 +277,8 @@ void ApplyFilter(const RenderBuffer& render_buffer, S->re.fill(0.f); S->im.fill(0.f); - rtc::ArrayView render_buffer_data = render_buffer.Buffer(); + rtc::ArrayView render_buffer_data = + render_buffer.GetFftBuffer(); size_t index = render_buffer.Position(); for (auto& H_j : H) { const FftData& X = render_buffer_data[index]; @@ -295,7 +299,8 @@ void ApplyFilter_NEON(const RenderBuffer& render_buffer, S->re.fill(0.f); S->im.fill(0.f); - rtc::ArrayView render_buffer_data = render_buffer.Buffer(); + rtc::ArrayView render_buffer_data = + render_buffer.GetFftBuffer(); const int lim1 = std::min(render_buffer_data.size() - render_buffer.Position(), H.size()); const int lim2 = H.size(); @@ -354,7 +359,8 @@ void ApplyFilter_SSE2(const RenderBuffer& render_buffer, S->re.fill(0.f); S->im.fill(0.f); - rtc::ArrayView render_buffer_data = render_buffer.Buffer(); + rtc::ArrayView render_buffer_data = + render_buffer.GetFftBuffer(); const int lim1 = std::min(render_buffer_data.size() - render_buffer.Position(), H.size()); const int lim2 = H.size(); diff --git a/modules/audio_processing/aec3/adaptive_fir_filter_unittest.cc b/modules/audio_processing/aec3/adaptive_fir_filter_unittest.cc index f26d5114c8..b3fded1042 100644 --- a/modules/audio_processing/aec3/adaptive_fir_filter_unittest.cc +++ b/modules/audio_processing/aec3/adaptive_fir_filter_unittest.cc @@ -72,7 +72,6 @@ TEST(AdaptiveFirFilter, FilterAdaptationNeonOptimizations) { render_delay_buffer->Reset(); } render_delay_buffer->PrepareCaptureProcessing(); - render_delay_buffer->GetRenderBuffer()->UpdateSpectralSum(); } const auto& render_buffer = render_delay_buffer->GetRenderBuffer(); @@ -184,7 +183,6 @@ TEST(AdaptiveFirFilter, FilterAdaptationSse2Optimizations) { render_delay_buffer->Reset(); } render_delay_buffer->PrepareCaptureProcessing(); - render_delay_buffer->GetRenderBuffer()->UpdateSpectralSum(); const auto& render_buffer = render_delay_buffer->GetRenderBuffer(); ApplyFilter_SSE2(*render_buffer, H_SSE2, &S_SSE2); @@ -367,7 +365,6 @@ TEST(AdaptiveFirFilter, FilterAndAdapt) { render_delay_buffer->Reset(); } render_delay_buffer->PrepareCaptureProcessing(); - render_delay_buffer->GetRenderBuffer()->UpdateSpectralSum(); const auto& render_buffer = render_delay_buffer->GetRenderBuffer(); render_signal_analyzer.Update(*render_buffer, aec_state.FilterDelay()); @@ -384,7 +381,9 @@ TEST(AdaptiveFirFilter, FilterAndAdapt) { s[k] = kScale * s_scratch[k + kFftLengthBy2]; } - gain.Compute(*render_buffer, render_signal_analyzer, E, + std::array render_power; + render_buffer->SpectralSum(filter.SizePartitions(), &render_power); + gain.Compute(render_power, render_signal_analyzer, E, filter.SizePartitions(), false, &G); filter.Adapt(*render_buffer, G); aec_state.HandleEchoPathChange(EchoPathVariability( diff --git a/modules/audio_processing/aec3/aec_state_unittest.cc b/modules/audio_processing/aec3/aec_state_unittest.cc index babc0b99eb..9d6e715356 100644 --- a/modules/audio_processing/aec3/aec_state_unittest.cc +++ b/modules/audio_processing/aec3/aec_state_unittest.cc @@ -105,13 +105,12 @@ TEST(AecState, NormalUsage) { x[0][0] = 5000.f; for (size_t k = 0; - k < render_delay_buffer->GetRenderBuffer()->Buffer().size(); ++k) { + k < render_delay_buffer->GetRenderBuffer()->GetFftBuffer().size(); ++k) { render_delay_buffer->Insert(x); if (k == 0) { render_delay_buffer->Reset(); } render_delay_buffer->PrepareCaptureProcessing(); - render_delay_buffer->GetRenderBuffer()->UpdateSpectralSum(); } Y2.fill(10.f * 10000.f * 10000.f); diff --git a/modules/audio_processing/aec3/echo_path_delay_estimator_unittest.cc b/modules/audio_processing/aec3/echo_path_delay_estimator_unittest.cc index 3ea3dd6f46..8cc69ea17d 100644 --- a/modules/audio_processing/aec3/echo_path_delay_estimator_unittest.cc +++ b/modules/audio_processing/aec3/echo_path_delay_estimator_unittest.cc @@ -84,7 +84,6 @@ TEST(EchoPathDelayEstimator, DelayEstimation) { render_delay_buffer->PrepareCaptureProcessing(); - render_delay_buffer->GetRenderBuffer()->UpdateSpectralSum(); estimated_delay_samples = estimator.EstimateDelay( render_delay_buffer->GetDownsampledRenderBuffer(), capture); } @@ -120,7 +119,6 @@ TEST(EchoPathDelayEstimator, NoInitialDelayestimates) { std::copy(render[0].begin(), render[0].end(), capture.begin()); render_delay_buffer->Insert(render); render_delay_buffer->PrepareCaptureProcessing(); - render_delay_buffer->GetRenderBuffer()->UpdateSpectralSum(); EXPECT_FALSE(estimator.EstimateDelay( render_delay_buffer->GetDownsampledRenderBuffer(), capture)); } @@ -145,7 +143,6 @@ TEST(EchoPathDelayEstimator, NoDelayEstimatesForLowLevelRenderSignals) { std::copy(render[0].begin(), render[0].end(), capture.begin()); render_delay_buffer->Insert(render); render_delay_buffer->PrepareCaptureProcessing(); - render_delay_buffer->GetRenderBuffer()->UpdateSpectralSum(); EXPECT_FALSE(estimator.EstimateDelay( render_delay_buffer->GetDownsampledRenderBuffer(), capture)); } diff --git a/modules/audio_processing/aec3/echo_remover.cc b/modules/audio_processing/aec3/echo_remover.cc index 5bf96f9498..f1dcc5594d 100644 --- a/modules/audio_processing/aec3/echo_remover.cc +++ b/modules/audio_processing/aec3/echo_remover.cc @@ -125,7 +125,7 @@ void EchoRemoverImpl::ProcessCapture( bool capture_signal_saturation, RenderBuffer* render_buffer, std::vector>* capture) { - const std::vector>& x = render_buffer->MostRecentBlock(); + const std::vector>& x = render_buffer->Block(0); std::vector>* y = capture; RTC_DCHECK(render_buffer); RTC_DCHECK(y); @@ -143,8 +143,6 @@ void EchoRemoverImpl::ProcessCapture( data_dumper_->DumpRaw("aec3_echo_remover_capture_input", y0); data_dumper_->DumpRaw("aec3_echo_remover_render_input", x0); - render_buffer->UpdateSpectralSum(); - aec_state_.UpdateCaptureSaturation(capture_signal_saturation); if (echo_path_variability.AudioPathChanged()) { diff --git a/modules/audio_processing/aec3/main_filter_update_gain.cc b/modules/audio_processing/aec3/main_filter_update_gain.cc index fb6e4b50f0..72f7f9b25c 100644 --- a/modules/audio_processing/aec3/main_filter_update_gain.cc +++ b/modules/audio_processing/aec3/main_filter_update_gain.cc @@ -53,7 +53,7 @@ void MainFilterUpdateGain::HandleEchoPathChange( } void MainFilterUpdateGain::Compute( - const RenderBuffer& render_buffer, + const std::array& render_power, const RenderSignalAnalyzer& render_signal_analyzer, const SubtractorOutput& subtractor_output, const AdaptiveFirFilter& filter, @@ -66,7 +66,7 @@ void MainFilterUpdateGain::Compute( const auto& E2_shadow = subtractor_output.E2_shadow; FftData* G = gain_fft; const size_t size_partitions = filter.SizePartitions(); - auto X2 = render_buffer.SpectralSum(size_partitions); + auto X2 = render_power; const auto& erl = filter.Erl(); ++call_counter_; diff --git a/modules/audio_processing/aec3/main_filter_update_gain.h b/modules/audio_processing/aec3/main_filter_update_gain.h index 241d063516..673c3ae06a 100644 --- a/modules/audio_processing/aec3/main_filter_update_gain.h +++ b/modules/audio_processing/aec3/main_filter_update_gain.h @@ -1,6 +1,6 @@ /* * Copyright (c) 2017 The WebRTC project authors. All Rights Reserved. - * +spect * * Use of this source code is governed by a BSD-style license * that can be found in the LICENSE file in the root of the source * tree. An additional intellectual property rights grant can be found @@ -38,7 +38,7 @@ class MainFilterUpdateGain { void HandleEchoPathChange(const EchoPathVariability& echo_path_variability); // Computes the gain. - void Compute(const RenderBuffer& render_buffer, + void Compute(const std::array& render_power, const RenderSignalAnalyzer& render_signal_analyzer, const SubtractorOutput& subtractor_output, const AdaptiveFirFilter& filter, 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 ad5e74078e..351f75f0d6 100644 --- a/modules/audio_processing/aec3/main_filter_update_gain_unittest.cc +++ b/modules/audio_processing/aec3/main_filter_update_gain_unittest.cc @@ -107,7 +107,6 @@ void RunFilterUpdateTest(int num_blocks_to_process, render_delay_buffer->Reset(); } render_delay_buffer->PrepareCaptureProcessing(); - render_delay_buffer->GetRenderBuffer()->UpdateSpectralSum(); render_signal_analyzer.Update(*render_delay_buffer->GetRenderBuffer(), aec_state.FilterDelay()); @@ -140,15 +139,18 @@ void RunFilterUpdateTest(int num_blocks_to_process, E_shadow.Spectrum(Aec3Optimization::kNone, output.E2_shadow); // Adapt the shadow filter. - shadow_gain.Compute(*render_delay_buffer->GetRenderBuffer(), - render_signal_analyzer, E_shadow, + std::array render_power; + render_delay_buffer->GetRenderBuffer()->SpectralSum( + shadow_filter.SizePartitions(), &render_power); + shadow_gain.Compute(render_power, render_signal_analyzer, E_shadow, shadow_filter.SizePartitions(), saturation, &G); shadow_filter.Adapt(*render_delay_buffer->GetRenderBuffer(), G); // Adapt the main filter - main_gain.Compute(*render_delay_buffer->GetRenderBuffer(), - render_signal_analyzer, output, main_filter, saturation, - &G); + render_delay_buffer->GetRenderBuffer()->SpectralSum( + main_filter.SizePartitions(), &render_power); + main_gain.Compute(render_power, render_signal_analyzer, output, main_filter, + saturation, &G); main_filter.Adapt(*render_delay_buffer->GetRenderBuffer(), G); // Update the delay. @@ -189,16 +191,15 @@ TEST(MainFilterUpdateGain, NullDataOutputGain) { EchoCanceller3Config config; AdaptiveFirFilter filter(config.filter.length_blocks, DetectOptimization(), &data_dumper); - std::unique_ptr render_delay_buffer( - RenderDelayBuffer::Create(config, 3)); RenderSignalAnalyzer analyzer; SubtractorOutput output; 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), - ""); + std::array render_power; + render_power.fill(0.f); + EXPECT_DEATH( + gain.Compute(render_power, analyzer, output, filter, false, nullptr), ""); } #endif diff --git a/modules/audio_processing/aec3/matched_filter_unittest.cc b/modules/audio_processing/aec3/matched_filter_unittest.cc index 9ae3ee2795..e30c78caa6 100644 --- a/modules/audio_processing/aec3/matched_filter_unittest.cc +++ b/modules/audio_processing/aec3/matched_filter_unittest.cc @@ -171,7 +171,6 @@ TEST(MatchedFilter, LagEstimation) { } render_delay_buffer->PrepareCaptureProcessing(); - render_delay_buffer->GetRenderBuffer()->UpdateSpectralSum(); std::array downsampled_capture_data; rtc::ArrayView downsampled_capture( downsampled_capture_data.data(), sub_block_size); diff --git a/modules/audio_processing/aec3/mock/mock_render_delay_buffer.h b/modules/audio_processing/aec3/mock/mock_render_delay_buffer.h index ab7e076a49..2d3d9dcea2 100644 --- a/modules/audio_processing/aec3/mock/mock_render_delay_buffer.h +++ b/modules/audio_processing/aec3/mock/mock_render_delay_buffer.h @@ -30,7 +30,7 @@ class MockRenderDelayBuffer : public RenderDelayBuffer { kBlockSize), spectrum_buffer_(block_buffer_.buffer.size(), kFftLengthBy2Plus1), fft_buffer_(block_buffer_.buffer.size()), - render_buffer_(12, &block_buffer_, &spectrum_buffer_, &fft_buffer_), + render_buffer_(&block_buffer_, &spectrum_buffer_, &fft_buffer_), downsampled_render_buffer_(GetDownSampledBufferSize(4, 4)) { ON_CALL(*this, GetRenderBuffer()) .WillByDefault( diff --git a/modules/audio_processing/aec3/render_buffer.cc b/modules/audio_processing/aec3/render_buffer.cc index 60b50cea01..6e224be703 100644 --- a/modules/audio_processing/aec3/render_buffer.cc +++ b/modules/audio_processing/aec3/render_buffer.cc @@ -17,35 +17,32 @@ namespace webrtc { -RenderBuffer::RenderBuffer(size_t num_ffts_for_spectral_sums, - MatrixBuffer* block_buffer, +RenderBuffer::RenderBuffer(MatrixBuffer* block_buffer, VectorBuffer* spectrum_buffer, FftBuffer* fft_buffer) : block_buffer_(block_buffer), spectrum_buffer_(spectrum_buffer), - fft_buffer_(fft_buffer), - spectral_sums_length_(num_ffts_for_spectral_sums) { + fft_buffer_(fft_buffer) { RTC_DCHECK(block_buffer_); RTC_DCHECK(spectrum_buffer_); RTC_DCHECK(fft_buffer_); - RTC_DCHECK_GE(fft_buffer_->buffer.size(), spectral_sums_length_); - - Clear(); + RTC_DCHECK_EQ(block_buffer_->buffer.size(), fft_buffer_->buffer.size()); + RTC_DCHECK_EQ(spectrum_buffer_->buffer.size(), fft_buffer_->buffer.size()); + RTC_DCHECK_EQ(spectrum_buffer_->read, fft_buffer_->read); + RTC_DCHECK_EQ(spectrum_buffer_->write, fft_buffer_->write); } RenderBuffer::~RenderBuffer() = default; -void RenderBuffer::Clear() { - spectral_sums_.fill(0.f); -} - -void RenderBuffer::UpdateSpectralSum() { - std::fill(spectral_sums_.begin(), spectral_sums_.end(), 0.f); - size_t position = spectrum_buffer_->read; - for (size_t j = 0; j < spectral_sums_length_; ++j) { - for (size_t k = 0; k < spectral_sums_.size(); ++k) { - spectral_sums_[k] += spectrum_buffer_->buffer[position][k]; - } +void RenderBuffer::SpectralSum( + size_t num_spectra, + std::array* X2) const { + X2->fill(0.f); + int position = spectrum_buffer_->read; + for (size_t j = 0; j < num_spectra; ++j) { + std::transform(X2->begin(), X2->end(), + spectrum_buffer_->buffer[position].begin(), X2->begin(), + std::plus()); position = spectrum_buffer_->IncIndex(position); } } diff --git a/modules/audio_processing/aec3/render_buffer.h b/modules/audio_processing/aec3/render_buffer.h index 507c082a62..db94e74cc7 100644 --- a/modules/audio_processing/aec3/render_buffer.h +++ b/modules/audio_processing/aec3/render_buffer.h @@ -26,48 +26,45 @@ namespace webrtc { // Provides a buffer of the render data for the echo remover. class RenderBuffer { public: - RenderBuffer(size_t num_ffts_for_spectral_sums, - MatrixBuffer* block_buffer, + RenderBuffer(MatrixBuffer* block_buffer, VectorBuffer* spectrum_buffer, FftBuffer* fft_buffer); ~RenderBuffer(); - // Clears the buffer. - void Clear(); - - // Insert a block into the buffer. - void UpdateSpectralSum(); - - // Gets the last inserted block. - const std::vector>& MostRecentBlock() const { - return block_buffer_->buffer[block_buffer_->read]; + // Get a block. + const std::vector>& Block(int buffer_offset_blocks) const { + int position = + block_buffer_->OffsetIndex(block_buffer_->read, buffer_offset_blocks); + return block_buffer_->buffer[position]; } // Get the spectrum from one of the FFTs in the buffer. - rtc::ArrayView Spectrum(size_t buffer_offset_ffts) const { - size_t position = spectrum_buffer_->OffsetIndex(spectrum_buffer_->read, - buffer_offset_ffts); + rtc::ArrayView Spectrum(int buffer_offset_ffts) const { + int position = spectrum_buffer_->OffsetIndex(spectrum_buffer_->read, + buffer_offset_ffts); return spectrum_buffer_->buffer[position]; } - // Returns the sum of the spectrums for a certain number of FFTs. - rtc::ArrayView SpectralSum(size_t num_ffts) const { - RTC_DCHECK_EQ(spectral_sums_length_, num_ffts); - return spectral_sums_; + // Returns the circular fft buffer. + rtc::ArrayView GetFftBuffer() const { + return fft_buffer_->buffer; } - // Returns the circular buffer. - rtc::ArrayView Buffer() const { return fft_buffer_->buffer; } - // Returns the current position in the circular buffer. - size_t Position() const { return fft_buffer_->read; } + size_t Position() const { + RTC_DCHECK_EQ(spectrum_buffer_->read, fft_buffer_->read); + RTC_DCHECK_EQ(spectrum_buffer_->write, fft_buffer_->write); + return fft_buffer_->read; + } + + // Returns the sum of the spectrums for a certain number of FFTs. + void SpectralSum(size_t num_spectra, + std::array* X2) const; private: const MatrixBuffer* const block_buffer_; const VectorBuffer* const spectrum_buffer_; const FftBuffer* const fft_buffer_; - const size_t spectral_sums_length_; - std::array spectral_sums_; RTC_DISALLOW_IMPLICIT_CONSTRUCTORS(RenderBuffer); }; diff --git a/modules/audio_processing/aec3/render_buffer_unittest.cc b/modules/audio_processing/aec3/render_buffer_unittest.cc index 989cb277e9..fadd600b87 100644 --- a/modules/audio_processing/aec3/render_buffer_unittest.cc +++ b/modules/audio_processing/aec3/render_buffer_unittest.cc @@ -24,21 +24,21 @@ namespace webrtc { TEST(RenderBuffer, NullExternalFftBuffer) { MatrixBuffer block_buffer(10, 3, kBlockSize); VectorBuffer spectrum_buffer(10, kFftLengthBy2Plus1); - EXPECT_DEATH(RenderBuffer(1, &block_buffer, &spectrum_buffer, nullptr), ""); + EXPECT_DEATH(RenderBuffer(&block_buffer, &spectrum_buffer, nullptr), ""); } // Verifies the check for non-null spectrum buffer. TEST(RenderBuffer, NullExternalSpectrumBuffer) { FftBuffer fft_buffer(10); MatrixBuffer block_buffer(10, 3, kBlockSize); - EXPECT_DEATH(RenderBuffer(1, &block_buffer, nullptr, &fft_buffer), ""); + EXPECT_DEATH(RenderBuffer(&block_buffer, nullptr, &fft_buffer), ""); } // Verifies the check for non-null block buffer. TEST(RenderBuffer, NullExternalBlockBuffer) { FftBuffer fft_buffer(10); VectorBuffer spectrum_buffer(10, kFftLengthBy2Plus1); - EXPECT_DEATH(RenderBuffer(1, nullptr, &spectrum_buffer, &fft_buffer), ""); + EXPECT_DEATH(RenderBuffer(nullptr, &spectrum_buffer, &fft_buffer), ""); } #endif diff --git a/modules/audio_processing/aec3/render_delay_buffer.cc b/modules/audio_processing/aec3/render_delay_buffer.cc index 0830dcaf5f..3e7901b33a 100644 --- a/modules/audio_processing/aec3/render_delay_buffer.cc +++ b/modules/audio_processing/aec3/render_delay_buffer.cc @@ -159,10 +159,7 @@ RenderDelayBufferImpl::RenderDelayBufferImpl(const EchoCanceller3Config& config, spectra_(blocks_.buffer.size(), kFftLengthBy2Plus1), ffts_(blocks_.buffer.size()), delay_(config_.delay.min_echo_path_delay_blocks), - echo_remover_buffer_(config.filter.length_blocks, - &blocks_, - &spectra_, - &ffts_), + echo_remover_buffer_(&blocks_, &spectra_, &ffts_), low_rate_(GetDownSampledBufferSize(config.delay.down_sampling_factor, config.delay.num_filters)), render_decimator_(config.delay.down_sampling_factor), diff --git a/modules/audio_processing/aec3/render_signal_analyzer.cc b/modules/audio_processing/aec3/render_signal_analyzer.cc index b5a3ce1ecf..84546c4c2f 100644 --- a/modules/audio_processing/aec3/render_signal_analyzer.cc +++ b/modules/audio_processing/aec3/render_signal_analyzer.cc @@ -61,8 +61,7 @@ void IdentifyStrongNarrowBandComponent(const RenderBuffer& render_buffer, } // Assess the render signal strength - const std::vector>& x_latest = - render_buffer.MostRecentBlock(); + const std::vector>& x_latest = render_buffer.Block(0); auto result0 = std::minmax_element(x_latest[0].begin(), x_latest[0].end()); float max_abs = std::max(fabs(*result0.first), fabs(*result0.second)); diff --git a/modules/audio_processing/aec3/shadow_filter_update_gain.cc b/modules/audio_processing/aec3/shadow_filter_update_gain.cc index 8fdf2587c2..b6e5aead52 100644 --- a/modules/audio_processing/aec3/shadow_filter_update_gain.cc +++ b/modules/audio_processing/aec3/shadow_filter_update_gain.cc @@ -29,7 +29,7 @@ void ShadowFilterUpdateGain::HandleEchoPathChange() { } void ShadowFilterUpdateGain::Compute( - const RenderBuffer& render_buffer, + const std::array& render_power, const RenderSignalAnalyzer& render_signal_analyzer, const FftData& E_shadow, size_t size_partitions, @@ -52,7 +52,7 @@ void ShadowFilterUpdateGain::Compute( // Compute mu. std::array mu; - auto X2 = render_buffer.SpectralSum(size_partitions); + auto X2 = render_power; std::transform(X2.begin(), X2.end(), mu.begin(), [&](float a) { return a > noise_gate_power_ ? rate_ / a : 0.f; }); diff --git a/modules/audio_processing/aec3/shadow_filter_update_gain.h b/modules/audio_processing/aec3/shadow_filter_update_gain.h index 5cc4b02095..1fd9472f8f 100644 --- a/modules/audio_processing/aec3/shadow_filter_update_gain.h +++ b/modules/audio_processing/aec3/shadow_filter_update_gain.h @@ -27,7 +27,7 @@ class ShadowFilterUpdateGain { void HandleEchoPathChange(); // Computes the gain. - void Compute(const RenderBuffer& render_buffer, + void Compute(const std::array& render_power, const RenderSignalAnalyzer& render_signal_analyzer, const FftData& E_shadow, size_t size_partitions, 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 6692dbb594..7a7c3abf0e 100644 --- a/modules/audio_processing/aec3/shadow_filter_update_gain_unittest.cc +++ b/modules/audio_processing/aec3/shadow_filter_update_gain_unittest.cc @@ -83,7 +83,6 @@ void RunFilterUpdateTest(int num_blocks_to_process, render_delay_buffer->Reset(); } render_delay_buffer->PrepareCaptureProcessing(); - render_delay_buffer->GetRenderBuffer()->UpdateSpectralSum(); render_signal_analyzer.Update(*render_delay_buffer->GetRenderBuffer(), delay_samples / kBlockSize); @@ -97,8 +96,10 @@ void RunFilterUpdateTest(int num_blocks_to_process, [](float& a) { a = rtc::SafeClamp(a, -32768.f, 32767.f); }); fft.ZeroPaddedFft(e_shadow, &E_shadow); - shadow_gain.Compute(*render_delay_buffer->GetRenderBuffer(), - render_signal_analyzer, E_shadow, + std::array render_power; + render_delay_buffer->GetRenderBuffer()->SpectralSum( + shadow_filter.SizePartitions(), &render_power); + shadow_gain.Compute(render_power, render_signal_analyzer, E_shadow, shadow_filter.SizePartitions(), saturation, &G); shadow_filter.Adapt(*render_delay_buffer->GetRenderBuffer(), G); } @@ -130,13 +131,12 @@ std::string ProduceDebugText(size_t delay, int filter_length_blocks) { TEST(ShadowFilterUpdateGain, NullDataOutputGain) { ApmDataDumper data_dumper(42); FftBuffer fft_buffer(1); - MatrixBuffer block_buffer(fft_buffer.buffer.size(), 3, kBlockSize); - VectorBuffer spectrum_buffer(fft_buffer.buffer.size(), kFftLengthBy2Plus1); - RenderBuffer render_buffer(1, &block_buffer, &spectrum_buffer, &fft_buffer); RenderSignalAnalyzer analyzer; FftData E; ShadowFilterUpdateGain gain(0.5f, 220075344.f); - EXPECT_DEATH(gain.Compute(render_buffer, analyzer, E, 1, false, nullptr), ""); + std::array render_power; + render_power.fill(0.f); + EXPECT_DEATH(gain.Compute(render_power, analyzer, E, 1, false, nullptr), ""); } #endif diff --git a/modules/audio_processing/aec3/subtractor.cc b/modules/audio_processing/aec3/subtractor.cc index 5d8f8ef6da..870c8a400a 100644 --- a/modules/audio_processing/aec3/subtractor.cc +++ b/modules/audio_processing/aec3/subtractor.cc @@ -65,6 +65,7 @@ void PredictionError(const Aec3Fft& fft, fft.ZeroPaddedFft(rtc::ArrayView(tmp.data(), 64), E); } + } // namespace Subtractor::Subtractor(const EchoCanceller3Config& config, @@ -151,14 +152,19 @@ void Subtractor::Process(const RenderBuffer& render_buffer, E_shadow.Spectrum(optimization_, output->E2_shadow); // Update the main filter. - G_main_.Compute(render_buffer, render_signal_analyzer, *output, main_filter_, + std::array X2; + render_buffer.SpectralSum(main_filter_.SizePartitions(), &X2); + G_main_.Compute(X2, render_signal_analyzer, *output, main_filter_, aec_state.SaturatedCapture(), &G); main_filter_.Adapt(render_buffer, G); data_dumper_->DumpRaw("aec3_subtractor_G_main", G.re); data_dumper_->DumpRaw("aec3_subtractor_G_main", G.im); // Update the shadow filter. - G_shadow_.Compute(render_buffer, render_signal_analyzer, E_shadow, + if (shadow_filter_.SizePartitions() != main_filter_.SizePartitions()) { + render_buffer.SpectralSum(shadow_filter_.SizePartitions(), &X2); + } + G_shadow_.Compute(X2, render_signal_analyzer, E_shadow, shadow_filter_.SizePartitions(), aec_state.SaturatedCapture(), &G); shadow_filter_.Adapt(render_buffer, G); diff --git a/modules/audio_processing/aec3/subtractor_unittest.cc b/modules/audio_processing/aec3/subtractor_unittest.cc index 855cd0e00e..55769688f3 100644 --- a/modules/audio_processing/aec3/subtractor_unittest.cc +++ b/modules/audio_processing/aec3/subtractor_unittest.cc @@ -65,7 +65,6 @@ float RunSubtractorTest(int num_blocks_to_process, render_delay_buffer->Reset(); } render_delay_buffer->PrepareCaptureProcessing(); - render_delay_buffer->GetRenderBuffer()->UpdateSpectralSum(); render_signal_analyzer.Update(*render_delay_buffer->GetRenderBuffer(), aec_state.FilterDelay());