1 /*
2 * Copyright (c) 2017 The WebRTC project authors. All Rights Reserved.
3 *
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
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10
11 #include "modules/audio_processing/aec3/block_delay_buffer.h"
12
13 #include <string>
14
15 #include "modules/audio_processing/aec3/aec3_common.h"
16 #include "modules/audio_processing/audio_buffer.h"
17 #include "rtc_base/strings/string_builder.h"
18 #include "test/gtest.h"
19
20 namespace webrtc {
21
22 namespace {
23
SampleValue(size_t sample_index)24 float SampleValue(size_t sample_index) {
25 return sample_index % 32768;
26 }
27
28 // Populates the frame with linearly increasing sample values for each band.
PopulateInputFrame(size_t frame_length,size_t num_bands,size_t first_sample_index,float * const * frame)29 void PopulateInputFrame(size_t frame_length,
30 size_t num_bands,
31 size_t first_sample_index,
32 float* const* frame) {
33 for (size_t k = 0; k < num_bands; ++k) {
34 for (size_t i = 0; i < frame_length; ++i) {
35 frame[k][i] = SampleValue(first_sample_index + i);
36 }
37 }
38 }
39
ProduceDebugText(int sample_rate_hz,size_t delay)40 std::string ProduceDebugText(int sample_rate_hz, size_t delay) {
41 char log_stream_buffer[8 * 1024];
42 rtc::SimpleStringBuilder ss(log_stream_buffer);
43 ss << "Sample rate: " << sample_rate_hz;
44 ss << ", Delay: " << delay;
45 return ss.str();
46 }
47
48 } // namespace
49
50 class BlockDelayBufferTest
51 : public ::testing::Test,
52 public ::testing::WithParamInterface<std::tuple<size_t, int, size_t>> {};
53
54 INSTANTIATE_TEST_SUITE_P(
55 ParameterCombinations,
56 BlockDelayBufferTest,
57 ::testing::Combine(::testing::Values(0, 1, 27, 160, 4321, 7021),
58 ::testing::Values(16000, 32000, 48000),
59 ::testing::Values(1, 2, 4)));
60
61 // Verifies that the correct signal delay is achived.
TEST_P(BlockDelayBufferTest,CorrectDelayApplied)62 TEST_P(BlockDelayBufferTest, CorrectDelayApplied) {
63 const size_t delay = std::get<0>(GetParam());
64 const int rate = std::get<1>(GetParam());
65 const size_t num_channels = std::get<2>(GetParam());
66
67 SCOPED_TRACE(ProduceDebugText(rate, delay));
68 size_t num_bands = NumBandsForRate(rate);
69 size_t subband_frame_length = 160;
70
71 BlockDelayBuffer delay_buffer(num_channels, num_bands, subband_frame_length,
72 delay);
73
74 static constexpr size_t kNumFramesToProcess = 20;
75 for (size_t frame_index = 0; frame_index < kNumFramesToProcess;
76 ++frame_index) {
77 AudioBuffer audio_buffer(rate, num_channels, rate, num_channels, rate,
78 num_channels);
79 if (rate > 16000) {
80 audio_buffer.SplitIntoFrequencyBands();
81 }
82 size_t first_sample_index = frame_index * subband_frame_length;
83 for (size_t ch = 0; ch < num_channels; ++ch) {
84 PopulateInputFrame(subband_frame_length, num_bands, first_sample_index,
85 &audio_buffer.split_bands(ch)[0]);
86 }
87 delay_buffer.DelaySignal(&audio_buffer);
88
89 for (size_t ch = 0; ch < num_channels; ++ch) {
90 for (size_t band = 0; band < num_bands; ++band) {
91 size_t sample_index = first_sample_index;
92 for (size_t i = 0; i < subband_frame_length; ++i, ++sample_index) {
93 if (sample_index < delay) {
94 EXPECT_EQ(0.f, audio_buffer.split_bands(ch)[band][i]);
95 } else {
96 EXPECT_EQ(SampleValue(sample_index - delay),
97 audio_buffer.split_bands(ch)[band][i]);
98 }
99 }
100 }
101 }
102 }
103 }
104
105 } // namespace webrtc
106