diff --git a/modules/audio_processing/aec3/adaptive_fir_filter_unittest.cc b/modules/audio_processing/aec3/adaptive_fir_filter_unittest.cc index f2868b4fde..ae283ed4fb 100644 --- a/modules/audio_processing/aec3/adaptive_fir_filter_unittest.cc +++ b/modules/audio_processing/aec3/adaptive_fir_filter_unittest.cc @@ -320,7 +320,7 @@ TEST(AdaptiveFirFilter, FilterAndAdapt) { std::vector n(kBlockSize, 0.f); std::vector y(kBlockSize, 0.f); AecState aec_state(EchoCanceller3Config{}); - RenderSignalAnalyzer render_signal_analyzer; + RenderSignalAnalyzer render_signal_analyzer(config); rtc::Optional delay_estimate; std::vector e(kBlockSize, 0.f); std::array s_scratch; diff --git a/modules/audio_processing/aec3/echo_remover.cc b/modules/audio_processing/aec3/echo_remover.cc index 7edce86ea0..b8a8ac0fc3 100644 --- a/modules/audio_processing/aec3/echo_remover.cc +++ b/modules/audio_processing/aec3/echo_remover.cc @@ -106,6 +106,7 @@ EchoRemoverImpl::EchoRemoverImpl(const EchoCanceller3Config& config, suppression_gain_(config_, optimization_), cng_(optimization_), suppression_filter_(sample_rate_hz_), + render_signal_analyzer_(config_), residual_echo_estimator_(config_), aec_state_(config_) { RTC_DCHECK(ValidFullBandRate(sample_rate_hz)); 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 02f78583cb..bfcf9f87ec 100644 --- a/modules/audio_processing/aec3/main_filter_update_gain_unittest.cc +++ b/modules/audio_processing/aec3/main_filter_update_gain_unittest.cc @@ -61,7 +61,7 @@ void RunFilterUpdateTest(int num_blocks_to_process, std::unique_ptr render_delay_buffer( RenderDelayBuffer::Create(config, 3)); AecState aec_state(config); - RenderSignalAnalyzer render_signal_analyzer; + RenderSignalAnalyzer render_signal_analyzer(config); rtc::Optional delay_estimate; std::array s_scratch; std::array s; @@ -190,7 +190,7 @@ TEST(MainFilterUpdateGain, NullDataOutputGain) { EchoCanceller3Config config; AdaptiveFirFilter filter(config.filter.main.length_blocks, DetectOptimization(), &data_dumper); - RenderSignalAnalyzer analyzer; + RenderSignalAnalyzer analyzer(EchoCanceller3Config{}); SubtractorOutput output; MainFilterUpdateGain gain(config.filter.main); std::array render_power; diff --git a/modules/audio_processing/aec3/render_signal_analyzer.cc b/modules/audio_processing/aec3/render_signal_analyzer.cc index 84546c4c2f..10b68b0ff2 100644 --- a/modules/audio_processing/aec3/render_signal_analyzer.cc +++ b/modules/audio_processing/aec3/render_signal_analyzer.cc @@ -42,6 +42,7 @@ void IdentifySmallNarrowBandRegions( // Identifies whether the signal has a single strong narrow-band component. void IdentifyStrongNarrowBandComponent(const RenderBuffer& render_buffer, + int strong_peak_freeze_duration, rtc::Optional* narrow_peak_band, size_t* narrow_peak_counter) { const auto X2_latest = render_buffer.Spectrum(0); @@ -52,7 +53,7 @@ void IdentifyStrongNarrowBandComponent(const RenderBuffer& render_buffer, // Compute the level around the peak. float non_peak_power = 0.f; - for (int k = std::max(5, peak_bin - 14); k < peak_bin - 4; ++k) { + for (int k = std::max(0, peak_bin - 14); k < peak_bin - 4; ++k) { non_peak_power = std::max(X2_latest[k], non_peak_power); } for (int k = peak_bin + 5; @@ -60,7 +61,7 @@ void IdentifyStrongNarrowBandComponent(const RenderBuffer& render_buffer, non_peak_power = std::max(X2_latest[k], non_peak_power); } - // Assess the render signal strength + // Assess the render signal strength. 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)); @@ -74,12 +75,14 @@ void IdentifyStrongNarrowBandComponent(const RenderBuffer& render_buffer, } // Detect whether the spectal peak has as strong narrowband nature. - if (peak_bin > 6 && max_abs > 100 && + if (peak_bin > 0 && max_abs > 100 && X2_latest[peak_bin] > 100 * non_peak_power) { *narrow_peak_band = peak_bin; *narrow_peak_counter = 0; } else { - if (*narrow_peak_band && ++(*narrow_peak_counter) > 7) { + if (*narrow_peak_band && + ++(*narrow_peak_counter) > + static_cast(strong_peak_freeze_duration)) { *narrow_peak_band = rtc::nullopt; } } @@ -87,7 +90,8 @@ void IdentifyStrongNarrowBandComponent(const RenderBuffer& render_buffer, } // namespace -RenderSignalAnalyzer::RenderSignalAnalyzer() { +RenderSignalAnalyzer::RenderSignalAnalyzer(const EchoCanceller3Config& config) + : strong_peak_freeze_duration_(config.filter.main.length_blocks) { narrow_band_counters_.fill(0); } RenderSignalAnalyzer::~RenderSignalAnalyzer() = default; @@ -100,8 +104,8 @@ void RenderSignalAnalyzer::Update( &narrow_band_counters_); // Identify the presence of a strong narrow band. - IdentifyStrongNarrowBandComponent(render_buffer, &narrow_peak_band_, - &narrow_peak_counter_); + IdentifyStrongNarrowBandComponent(render_buffer, strong_peak_freeze_duration_, + &narrow_peak_band_, &narrow_peak_counter_); } void RenderSignalAnalyzer::MaskRegionsAroundNarrowBands( diff --git a/modules/audio_processing/aec3/render_signal_analyzer.h b/modules/audio_processing/aec3/render_signal_analyzer.h index 64d74f4e3f..8cd2172120 100644 --- a/modules/audio_processing/aec3/render_signal_analyzer.h +++ b/modules/audio_processing/aec3/render_signal_analyzer.h @@ -14,6 +14,7 @@ #include #include +#include "api/audio/echo_canceller3_config.h" #include "api/optional.h" #include "modules/audio_processing/aec3/aec3_common.h" #include "modules/audio_processing/aec3/render_buffer.h" @@ -24,7 +25,7 @@ namespace webrtc { // Provides functionality for analyzing the properties of the render signal. class RenderSignalAnalyzer { public: - RenderSignalAnalyzer(); + explicit RenderSignalAnalyzer(const EchoCanceller3Config& config); ~RenderSignalAnalyzer(); // Updates the render signal analysis with the most recent render signal. @@ -46,6 +47,7 @@ class RenderSignalAnalyzer { rtc::Optional NarrowPeakBand() const { return narrow_peak_band_; } private: + const int strong_peak_freeze_duration_; std::array narrow_band_counters_; rtc::Optional narrow_peak_band_; size_t narrow_peak_counter_; diff --git a/modules/audio_processing/aec3/render_signal_analyzer_unittest.cc b/modules/audio_processing/aec3/render_signal_analyzer_unittest.cc index 8b68960bee..51918745d5 100644 --- a/modules/audio_processing/aec3/render_signal_analyzer_unittest.cc +++ b/modules/audio_processing/aec3/render_signal_analyzer_unittest.cc @@ -46,7 +46,7 @@ void ProduceSinusoid(int sample_rate_hz, #if RTC_DCHECK_IS_ON && GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID) // Verifies that the check for non-null output parameter works. TEST(RenderSignalAnalyzer, NullMaskOutput) { - RenderSignalAnalyzer analyzer; + RenderSignalAnalyzer analyzer(EchoCanceller3Config{}); EXPECT_DEATH(analyzer.MaskRegionsAroundNarrowBands(nullptr), ""); } @@ -54,7 +54,7 @@ TEST(RenderSignalAnalyzer, NullMaskOutput) { // Verify that no narrow bands are detected in a Gaussian noise signal. TEST(RenderSignalAnalyzer, NoFalseDetectionOfNarrowBands) { - RenderSignalAnalyzer analyzer; + RenderSignalAnalyzer analyzer(EchoCanceller3Config{}); Random random_generator(42U); std::vector> x(3, std::vector(kBlockSize, 0.f)); std::array x_old; @@ -85,7 +85,7 @@ TEST(RenderSignalAnalyzer, NoFalseDetectionOfNarrowBands) { // Verify that a sinusiod signal is detected as narrow bands. TEST(RenderSignalAnalyzer, NarrowBandDetection) { - RenderSignalAnalyzer analyzer; + RenderSignalAnalyzer analyzer(EchoCanceller3Config{}); Random random_generator(42U); std::vector> x(3, std::vector(kBlockSize, 0.f)); std::array x_old; 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 77750fd7c8..09e155b699 100644 --- a/modules/audio_processing/aec3/shadow_filter_update_gain_unittest.cc +++ b/modules/audio_processing/aec3/shadow_filter_update_gain_unittest.cc @@ -57,7 +57,7 @@ void RunFilterUpdateTest(int num_blocks_to_process, std::vector> x(3, std::vector(kBlockSize, 0.f)); std::vector y(kBlockSize, 0.f); AecState aec_state(config); - RenderSignalAnalyzer render_signal_analyzer; + RenderSignalAnalyzer render_signal_analyzer(config); std::array s; FftData S; FftData G; @@ -130,7 +130,7 @@ std::string ProduceDebugText(size_t delay, int filter_length_blocks) { TEST(ShadowFilterUpdateGain, NullDataOutputGain) { ApmDataDumper data_dumper(42); FftBuffer fft_buffer(1); - RenderSignalAnalyzer analyzer; + RenderSignalAnalyzer analyzer(EchoCanceller3Config{}); FftData E; const EchoCanceller3Config::Filter::ShadowConfiguration& config = { 12, 0.5f, 220075344.f}; diff --git a/modules/audio_processing/aec3/subtractor_unittest.cc b/modules/audio_processing/aec3/subtractor_unittest.cc index 5f2bbbc668..5a8e070fb6 100644 --- a/modules/audio_processing/aec3/subtractor_unittest.cc +++ b/modules/audio_processing/aec3/subtractor_unittest.cc @@ -42,7 +42,7 @@ float RunSubtractorTest(int num_blocks_to_process, config.delay.default_delay = 1; std::unique_ptr render_delay_buffer( RenderDelayBuffer::Create(config, 3)); - RenderSignalAnalyzer render_signal_analyzer; + RenderSignalAnalyzer render_signal_analyzer(config); Random random_generator(42U); Aec3Fft fft; std::array Y2; @@ -126,7 +126,7 @@ TEST(Subtractor, DISABLED_NullOutput) { Subtractor subtractor(config, &data_dumper, DetectOptimization()); std::unique_ptr render_delay_buffer( RenderDelayBuffer::Create(config, 3)); - RenderSignalAnalyzer render_signal_analyzer; + RenderSignalAnalyzer render_signal_analyzer(config); std::vector y(kBlockSize, 0.f); EXPECT_DEATH( @@ -142,7 +142,7 @@ TEST(Subtractor, WrongCaptureSize) { Subtractor subtractor(config, &data_dumper, DetectOptimization()); std::unique_ptr render_delay_buffer( RenderDelayBuffer::Create(config, 3)); - RenderSignalAnalyzer render_signal_analyzer; + RenderSignalAnalyzer render_signal_analyzer(config); std::vector y(kBlockSize - 1, 0.f); SubtractorOutput output; diff --git a/modules/audio_processing/aec3/suppression_gain_unittest.cc b/modules/audio_processing/aec3/suppression_gain_unittest.cc index 95bfc8da8c..0e48102897 100644 --- a/modules/audio_processing/aec3/suppression_gain_unittest.cc +++ b/modules/audio_processing/aec3/suppression_gain_unittest.cc @@ -34,12 +34,14 @@ TEST(SuppressionGain, NullOutputGains) { N2.fill(0.f); float high_bands_gain; AecState aec_state(EchoCanceller3Config{}); - EXPECT_DEATH(SuppressionGain(EchoCanceller3Config{}, DetectOptimization()) - .GetGain(E2, R2, N2, RenderSignalAnalyzer(), aec_state, - std::vector>( - 3, std::vector(kBlockSize, 0.f)), - &high_bands_gain, nullptr), - ""); + EXPECT_DEATH( + SuppressionGain(EchoCanceller3Config{}, DetectOptimization()) + .GetGain(E2, R2, N2, RenderSignalAnalyzer((EchoCanceller3Config{})), + aec_state, + std::vector>( + 3, std::vector(kBlockSize, 0.f)), + &high_bands_gain, nullptr), + ""); } #endif @@ -48,7 +50,7 @@ TEST(SuppressionGain, NullOutputGains) { TEST(SuppressionGain, BasicGainComputation) { SuppressionGain suppression_gain(EchoCanceller3Config(), DetectOptimization()); - RenderSignalAnalyzer analyzer; + RenderSignalAnalyzer analyzer(EchoCanceller3Config{}); float high_bands_gain; std::array E2; std::array Y2;