diff --git a/webrtc/modules/audio_processing/residual_echo_detector.cc b/webrtc/modules/audio_processing/residual_echo_detector.cc index 66b34ff105..0e58b497fe 100644 --- a/webrtc/modules/audio_processing/residual_echo_detector.cc +++ b/webrtc/modules/audio_processing/residual_echo_detector.cc @@ -25,6 +25,7 @@ float Power(rtc::ArrayView input) { constexpr size_t kLookbackFrames = 650; // TODO(ivoc): Verify the size of this buffer. constexpr size_t kRenderBufferSize = 30; +constexpr float kAlpha = 0.001f; } // namespace @@ -100,6 +101,8 @@ void ResidualEchoDetector::AnalyzeCaptureAudio( echo_likelihood_ = std::max( echo_likelihood_, covariances_[delay].normalized_cross_correlation()); } + reliability_ = (1.0f - kAlpha) * reliability_ + kAlpha * 1.0f; + echo_likelihood_ *= reliability_; int echo_percentage = static_cast(echo_likelihood_ * 100); RTC_HISTOGRAM_COUNTS("WebRTC.Audio.ResidualEchoDetector.EchoLikelihood", echo_percentage, 0, 100, 100 /* number of bins */); @@ -121,6 +124,7 @@ void ResidualEchoDetector::Initialize() { } echo_likelihood_ = 0.f; next_insertion_index_ = 0; + reliability_ = 0.f; } void ResidualEchoDetector::PackRenderAudioBuffer( diff --git a/webrtc/modules/audio_processing/residual_echo_detector.h b/webrtc/modules/audio_processing/residual_echo_detector.h index 37aa283b08..e8f51cda3e 100644 --- a/webrtc/modules/audio_processing/residual_echo_detector.h +++ b/webrtc/modules/audio_processing/residual_echo_detector.h @@ -37,6 +37,9 @@ class ResidualEchoDetector { // This function should be called while holding the capture lock. void Initialize(); + // This function is for testing purposes only. + void SetReliabilityForTest(float value) { reliability_ = value; } + static void PackRenderAudioBuffer(AudioBuffer* audio, std::vector* packed_buffer); @@ -71,6 +74,8 @@ class ResidualEchoDetector { MeanVarianceEstimator capture_statistics_; // Current echo likelihood. float echo_likelihood_ = 0.f; + // Reliability of the current likelihood. + float reliability_ = 0.f; }; } // namespace webrtc diff --git a/webrtc/modules/audio_processing/residual_echo_detector_unittest.cc b/webrtc/modules/audio_processing/residual_echo_detector_unittest.cc index 7f6cf16abd..cde731d769 100644 --- a/webrtc/modules/audio_processing/residual_echo_detector_unittest.cc +++ b/webrtc/modules/audio_processing/residual_echo_detector_unittest.cc @@ -17,6 +17,7 @@ namespace webrtc { TEST(ResidualEchoDetectorTests, Echo) { ResidualEchoDetector echo_detector; + echo_detector.SetReliabilityForTest(1.0f); std::vector ones(160, 1.f); std::vector zeros(160, 0.f); @@ -41,6 +42,7 @@ TEST(ResidualEchoDetectorTests, Echo) { TEST(ResidualEchoDetectorTests, NoEcho) { ResidualEchoDetector echo_detector; + echo_detector.SetReliabilityForTest(1.0f); std::vector ones(160, 1.f); std::vector zeros(160, 0.f); @@ -60,6 +62,7 @@ TEST(ResidualEchoDetectorTests, NoEcho) { TEST(ResidualEchoDetectorTests, EchoWithRenderClockDrift) { ResidualEchoDetector echo_detector; + echo_detector.SetReliabilityForTest(1.0f); std::vector ones(160, 1.f); std::vector zeros(160, 0.f); @@ -94,6 +97,7 @@ TEST(ResidualEchoDetectorTests, EchoWithRenderClockDrift) { TEST(ResidualEchoDetectorTests, EchoWithCaptureClockDrift) { ResidualEchoDetector echo_detector; + echo_detector.SetReliabilityForTest(1.0f); std::vector ones(160, 1.f); std::vector zeros(160, 0.f);