| 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());
|
| }
|
|
|
|
|