Index: webrtc/modules/audio_processing/aec3/aec_state_unittest.cc |
diff --git a/webrtc/modules/audio_processing/aec3/aec_state_unittest.cc b/webrtc/modules/audio_processing/aec3/aec_state_unittest.cc |
index 682126e1ce0265c8da3d253244adcc78ecea8ede..7062d244b8200d0442c344bca276ff89f6b48688 100644 |
--- a/webrtc/modules/audio_processing/aec3/aec_state_unittest.cc |
+++ b/webrtc/modules/audio_processing/aec3/aec_state_unittest.cc |
@@ -25,6 +25,8 @@ TEST(AecState, NormalUsage) { |
std::array<float, kFftLengthBy2Plus1> Y2 = {}; |
std::vector<std::vector<float>> x(3, std::vector<float>(kBlockSize, 0.f)); |
EchoPathVariability echo_path_variability(false, false); |
+ std::array<float, kBlockSize> s; |
+ s.fill(100.f); |
std::vector<std::array<float, kFftLengthBy2Plus1>> |
converged_filter_frequency_response(10); |
@@ -36,47 +38,57 @@ TEST(AecState, NormalUsage) { |
converged_filter_frequency_response[2].fill(100.f); |
converged_filter_frequency_response[2][0] = 1.f; |
+ std::array<float, kAdaptiveFilterTimeDomainLength> impulse_response; |
+ impulse_response.fill(0.f); |
+ |
// Verify that linear AEC usability is false when the filter is diverged and |
// there is no external delay reported. |
- state.Update(diverged_filter_frequency_response, rtc::Optional<size_t>(), |
- render_buffer, E2_main, Y2, x[0], false); |
+ state.Update(diverged_filter_frequency_response, impulse_response, |
+ rtc::Optional<size_t>(), render_buffer, E2_main, Y2, x[0], s, |
+ false); |
EXPECT_FALSE(state.UsableLinearEstimate()); |
// Verify that linear AEC usability is true when the filter is converged |
std::fill(x[0].begin(), x[0].end(), 101.f); |
for (int k = 0; k < 3000; ++k) { |
- state.Update(converged_filter_frequency_response, rtc::Optional<size_t>(2), |
- render_buffer, E2_main, Y2, x[0], false); |
+ state.Update(converged_filter_frequency_response, impulse_response, |
+ rtc::Optional<size_t>(2), render_buffer, E2_main, Y2, x[0], s, |
+ false); |
} |
EXPECT_TRUE(state.UsableLinearEstimate()); |
// Verify that linear AEC usability becomes false after an echo path change is |
// reported |
state.HandleEchoPathChange(EchoPathVariability(true, false)); |
- state.Update(converged_filter_frequency_response, rtc::Optional<size_t>(2), |
- render_buffer, E2_main, Y2, x[0], false); |
+ state.Update(converged_filter_frequency_response, impulse_response, |
+ rtc::Optional<size_t>(2), render_buffer, E2_main, Y2, x[0], s, |
+ false); |
EXPECT_FALSE(state.UsableLinearEstimate()); |
// Verify that the active render detection works as intended. |
std::fill(x[0].begin(), x[0].end(), 101.f); |
state.HandleEchoPathChange(EchoPathVariability(true, true)); |
- state.Update(converged_filter_frequency_response, rtc::Optional<size_t>(2), |
- render_buffer, E2_main, Y2, x[0], false); |
+ state.Update(converged_filter_frequency_response, impulse_response, |
+ rtc::Optional<size_t>(2), render_buffer, E2_main, Y2, x[0], s, |
+ false); |
EXPECT_FALSE(state.ActiveRender()); |
for (int k = 0; k < 1000; ++k) { |
- state.Update(converged_filter_frequency_response, rtc::Optional<size_t>(2), |
- render_buffer, E2_main, Y2, x[0], false); |
+ state.Update(converged_filter_frequency_response, impulse_response, |
+ rtc::Optional<size_t>(2), render_buffer, E2_main, Y2, x[0], s, |
+ false); |
} |
EXPECT_TRUE(state.ActiveRender()); |
// Verify that echo leakage is properly reported. |
- state.Update(converged_filter_frequency_response, rtc::Optional<size_t>(2), |
- render_buffer, E2_main, Y2, x[0], false); |
+ state.Update(converged_filter_frequency_response, impulse_response, |
+ rtc::Optional<size_t>(2), render_buffer, E2_main, Y2, x[0], s, |
+ false); |
EXPECT_FALSE(state.EchoLeakageDetected()); |
- state.Update(converged_filter_frequency_response, rtc::Optional<size_t>(2), |
- render_buffer, E2_main, Y2, x[0], true); |
+ state.Update(converged_filter_frequency_response, impulse_response, |
+ rtc::Optional<size_t>(2), render_buffer, E2_main, Y2, x[0], s, |
+ true); |
EXPECT_TRUE(state.EchoLeakageDetected()); |
// Verify that the ERL is properly estimated |
@@ -91,8 +103,9 @@ TEST(AecState, NormalUsage) { |
Y2.fill(10.f * 10000.f * 10000.f); |
for (size_t k = 0; k < 1000; ++k) { |
- state.Update(converged_filter_frequency_response, rtc::Optional<size_t>(2), |
- render_buffer, E2_main, Y2, x[0], false); |
+ state.Update(converged_filter_frequency_response, impulse_response, |
+ rtc::Optional<size_t>(2), render_buffer, E2_main, Y2, x[0], s, |
+ false); |
} |
ASSERT_TRUE(state.UsableLinearEstimate()); |
@@ -107,8 +120,9 @@ TEST(AecState, NormalUsage) { |
E2_main.fill(1.f * 10000.f * 10000.f); |
Y2.fill(10.f * E2_main[0]); |
for (size_t k = 0; k < 1000; ++k) { |
- state.Update(converged_filter_frequency_response, rtc::Optional<size_t>(2), |
- render_buffer, E2_main, Y2, x[0], false); |
+ state.Update(converged_filter_frequency_response, impulse_response, |
+ rtc::Optional<size_t>(2), render_buffer, E2_main, Y2, x[0], s, |
+ false); |
} |
ASSERT_TRUE(state.UsableLinearEstimate()); |
{ |
@@ -127,8 +141,9 @@ TEST(AecState, NormalUsage) { |
E2_main.fill(1.f * 10000.f * 10000.f); |
Y2.fill(5.f * E2_main[0]); |
for (size_t k = 0; k < 1000; ++k) { |
- state.Update(converged_filter_frequency_response, rtc::Optional<size_t>(2), |
- render_buffer, E2_main, Y2, x[0], false); |
+ state.Update(converged_filter_frequency_response, impulse_response, |
+ rtc::Optional<size_t>(2), render_buffer, E2_main, Y2, x[0], s, |
+ false); |
} |
ASSERT_TRUE(state.UsableLinearEstimate()); |
@@ -155,6 +170,8 @@ TEST(AecState, NonSignificantDelay) { |
std::array<float, kFftLengthBy2Plus1> Y2; |
std::array<float, kBlockSize> x; |
EchoPathVariability echo_path_variability(false, false); |
+ std::array<float, kBlockSize> s; |
+ s.fill(100.f); |
x.fill(0.f); |
std::vector<std::array<float, kFftLengthBy2Plus1>> frequency_response(30); |
@@ -162,10 +179,13 @@ TEST(AecState, NonSignificantDelay) { |
v.fill(0.01f); |
} |
+ std::array<float, kAdaptiveFilterTimeDomainLength> impulse_response; |
+ impulse_response.fill(0.f); |
+ |
// Verify that a non-significant filter delay is identified correctly. |
state.HandleEchoPathChange(echo_path_variability); |
- state.Update(frequency_response, rtc::Optional<size_t>(), render_buffer, |
- E2_main, Y2, x, false); |
+ state.Update(frequency_response, impulse_response, rtc::Optional<size_t>(), |
+ render_buffer, E2_main, Y2, x, s, false); |
EXPECT_FALSE(state.FilterDelay()); |
} |
@@ -179,11 +199,16 @@ TEST(AecState, ConvergedFilterDelay) { |
std::array<float, kFftLengthBy2Plus1> Y2; |
std::array<float, kBlockSize> x; |
EchoPathVariability echo_path_variability(false, false); |
+ std::array<float, kBlockSize> s; |
+ s.fill(100.f); |
x.fill(0.f); |
std::vector<std::array<float, kFftLengthBy2Plus1>> frequency_response( |
kFilterLength); |
+ std::array<float, kAdaptiveFilterTimeDomainLength> impulse_response; |
+ impulse_response.fill(0.f); |
+ |
// Verify that the filter delay for a converged filter is properly identified. |
for (int k = 0; k < kFilterLength; ++k) { |
for (auto& v : frequency_response) { |
@@ -192,8 +217,8 @@ TEST(AecState, ConvergedFilterDelay) { |
frequency_response[k].fill(100.f); |
frequency_response[k][0] = 0.f; |
state.HandleEchoPathChange(echo_path_variability); |
- state.Update(frequency_response, rtc::Optional<size_t>(), render_buffer, |
- E2_main, Y2, x, false); |
+ state.Update(frequency_response, impulse_response, rtc::Optional<size_t>(), |
+ render_buffer, E2_main, Y2, x, s, false); |
EXPECT_TRUE(k == (kFilterLength - 1) || state.FilterDelay()); |
if (k != (kFilterLength - 1)) { |
EXPECT_EQ(k, state.FilterDelay()); |
@@ -208,6 +233,8 @@ TEST(AecState, ExternalDelay) { |
std::array<float, kFftLengthBy2Plus1> E2_shadow; |
std::array<float, kFftLengthBy2Plus1> Y2; |
std::array<float, kBlockSize> x; |
+ std::array<float, kBlockSize> s; |
+ s.fill(100.f); |
E2_main.fill(0.f); |
E2_shadow.fill(0.f); |
Y2.fill(0.f); |
@@ -219,10 +246,14 @@ TEST(AecState, ExternalDelay) { |
v.fill(0.01f); |
} |
+ std::array<float, kAdaptiveFilterTimeDomainLength> impulse_response; |
+ impulse_response.fill(0.f); |
+ |
for (size_t k = 0; k < frequency_response.size() - 1; ++k) { |
state.HandleEchoPathChange(EchoPathVariability(false, false)); |
- state.Update(frequency_response, rtc::Optional<size_t>(k * kBlockSize + 5), |
- render_buffer, E2_main, Y2, x, false); |
+ state.Update(frequency_response, impulse_response, |
+ rtc::Optional<size_t>(k * kBlockSize + 5), render_buffer, |
+ E2_main, Y2, x, s, false); |
EXPECT_TRUE(state.ExternalDelay()); |
EXPECT_EQ(k, state.ExternalDelay()); |
} |
@@ -230,8 +261,8 @@ TEST(AecState, ExternalDelay) { |
// Verify that the externally reported delay is properly unset when it is no |
// longer present. |
state.HandleEchoPathChange(EchoPathVariability(false, false)); |
- state.Update(frequency_response, rtc::Optional<size_t>(), render_buffer, |
- E2_main, Y2, x, false); |
+ state.Update(frequency_response, impulse_response, rtc::Optional<size_t>(), |
+ render_buffer, E2_main, Y2, x, s, false); |
EXPECT_FALSE(state.ExternalDelay()); |
} |