| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (c) 2017 The WebRTC project authors. All Rights Reserved. | 2 * Copyright (c) 2017 The WebRTC project authors. All Rights Reserved. |
| 3 * | 3 * |
| 4 * Use of this source code is governed by a BSD-style license | 4 * Use of this source code is governed by a BSD-style license |
| 5 * that can be found in the LICENSE file in the root of the source | 5 * that can be found in the LICENSE file in the root of the source |
| 6 * tree. An additional intellectual property rights grant can be found | 6 * tree. An additional intellectual property rights grant can be found |
| 7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
| 8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
| 9 */ | 9 */ |
| 10 | 10 |
| 11 #include "webrtc/modules/audio_processing/aec3/main_filter_update_gain.h" | 11 #include "webrtc/modules/audio_processing/aec3/main_filter_update_gain.h" |
| 12 | 12 |
| 13 #include <algorithm> | 13 #include <algorithm> |
| 14 #include <numeric> | 14 #include <numeric> |
| 15 #include <string> | 15 #include <string> |
| 16 | 16 |
| 17 #include "webrtc/base/random.h" | 17 #include "webrtc/base/random.h" |
| 18 #include "webrtc/base/safe_minmax.h" |
| 18 #include "webrtc/modules/audio_processing/aec3/adaptive_fir_filter.h" | 19 #include "webrtc/modules/audio_processing/aec3/adaptive_fir_filter.h" |
| 19 #include "webrtc/modules/audio_processing/aec3/aec_state.h" | 20 #include "webrtc/modules/audio_processing/aec3/aec_state.h" |
| 20 #include "webrtc/modules/audio_processing/aec3/render_buffer.h" | 21 #include "webrtc/modules/audio_processing/aec3/render_buffer.h" |
| 21 #include "webrtc/modules/audio_processing/aec3/render_signal_analyzer.h" | 22 #include "webrtc/modules/audio_processing/aec3/render_signal_analyzer.h" |
| 22 #include "webrtc/modules/audio_processing/aec3/shadow_filter_update_gain.h" | 23 #include "webrtc/modules/audio_processing/aec3/shadow_filter_update_gain.h" |
| 23 #include "webrtc/modules/audio_processing/aec3/subtractor_output.h" | 24 #include "webrtc/modules/audio_processing/aec3/subtractor_output.h" |
| 24 #include "webrtc/modules/audio_processing/logging/apm_data_dumper.h" | 25 #include "webrtc/modules/audio_processing/logging/apm_data_dumper.h" |
| 25 #include "webrtc/modules/audio_processing/test/echo_canceller_test_tools.h" | 26 #include "webrtc/modules/audio_processing/test/echo_canceller_test_tools.h" |
| 26 #include "webrtc/test/gtest.h" | 27 #include "webrtc/test/gtest.h" |
| 27 | 28 |
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 92 delay_buffer.Delay(x[0], y); | 93 delay_buffer.Delay(x[0], y); |
| 93 render_buffer.Insert(x); | 94 render_buffer.Insert(x); |
| 94 render_signal_analyzer.Update(render_buffer, aec_state.FilterDelay()); | 95 render_signal_analyzer.Update(render_buffer, aec_state.FilterDelay()); |
| 95 | 96 |
| 96 // Apply the main filter. | 97 // Apply the main filter. |
| 97 main_filter.Filter(render_buffer, &S); | 98 main_filter.Filter(render_buffer, &S); |
| 98 fft.Ifft(S, &s); | 99 fft.Ifft(S, &s); |
| 99 std::transform(y.begin(), y.end(), s.begin() + kFftLengthBy2, | 100 std::transform(y.begin(), y.end(), s.begin() + kFftLengthBy2, |
| 100 e_main.begin(), | 101 e_main.begin(), |
| 101 [&](float a, float b) { return a - b * kScale; }); | 102 [&](float a, float b) { return a - b * kScale; }); |
| 102 std::for_each(e_main.begin(), e_main.end(), [](float& a) { | 103 std::for_each(e_main.begin(), e_main.end(), |
| 103 a = std::max(std::min(a, 32767.0f), -32768.0f); | 104 [](float& a) { a = rtc::SafeClamp(a, -32768.f, 32767.f); }); |
| 104 }); | |
| 105 fft.ZeroPaddedFft(e_main, &E_main); | 105 fft.ZeroPaddedFft(e_main, &E_main); |
| 106 | 106 |
| 107 // Apply the shadow filter. | 107 // Apply the shadow filter. |
| 108 shadow_filter.Filter(render_buffer, &S); | 108 shadow_filter.Filter(render_buffer, &S); |
| 109 fft.Ifft(S, &s); | 109 fft.Ifft(S, &s); |
| 110 std::transform(y.begin(), y.end(), s.begin() + kFftLengthBy2, | 110 std::transform(y.begin(), y.end(), s.begin() + kFftLengthBy2, |
| 111 e_shadow.begin(), | 111 e_shadow.begin(), |
| 112 [&](float a, float b) { return a - b * kScale; }); | 112 [&](float a, float b) { return a - b * kScale; }); |
| 113 std::for_each(e_shadow.begin(), e_shadow.end(), [](float& a) { | 113 std::for_each(e_shadow.begin(), e_shadow.end(), |
| 114 a = std::max(std::min(a, 32767.0f), -32768.0f); | 114 [](float& a) { a = rtc::SafeClamp(a, -32768.f, 32767.f); }); |
| 115 }); | |
| 116 fft.ZeroPaddedFft(e_shadow, &E_shadow); | 115 fft.ZeroPaddedFft(e_shadow, &E_shadow); |
| 117 | 116 |
| 118 // Compute spectra for future use. | 117 // Compute spectra for future use. |
| 119 E_main.Spectrum(Aec3Optimization::kNone, &output.E2_main); | 118 E_main.Spectrum(Aec3Optimization::kNone, &output.E2_main); |
| 120 E_shadow.Spectrum(Aec3Optimization::kNone, &output.E2_shadow); | 119 E_shadow.Spectrum(Aec3Optimization::kNone, &output.E2_shadow); |
| 121 | 120 |
| 122 // Adapt the shadow filter. | 121 // Adapt the shadow filter. |
| 123 shadow_gain.Compute(render_buffer, render_signal_analyzer, E_shadow, | 122 shadow_gain.Compute(render_buffer, render_signal_analyzer, E_shadow, |
| 124 shadow_filter.SizePartitions(), saturation, &G); | 123 shadow_filter.SizePartitions(), saturation, &G); |
| 125 shadow_filter.Adapt(render_buffer, G); | 124 shadow_filter.Adapt(render_buffer, G); |
| (...skipping 153 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 279 blocks_with_saturation, false, &e, &y, &G_b); | 278 blocks_with_saturation, false, &e, &y, &G_b); |
| 280 | 279 |
| 281 G_a.Spectrum(Aec3Optimization::kNone, &G_a_power); | 280 G_a.Spectrum(Aec3Optimization::kNone, &G_a_power); |
| 282 G_b.Spectrum(Aec3Optimization::kNone, &G_b_power); | 281 G_b.Spectrum(Aec3Optimization::kNone, &G_b_power); |
| 283 | 282 |
| 284 EXPECT_LT(std::accumulate(G_a_power.begin(), G_a_power.end(), 0.), | 283 EXPECT_LT(std::accumulate(G_a_power.begin(), G_a_power.end(), 0.), |
| 285 std::accumulate(G_b_power.begin(), G_b_power.end(), 0.)); | 284 std::accumulate(G_b_power.begin(), G_b_power.end(), 0.)); |
| 286 } | 285 } |
| 287 | 286 |
| 288 } // namespace webrtc | 287 } // namespace webrtc |
| OLD | NEW |