xref: /aosp_15_r20/external/webrtc/modules/audio_processing/aec3/block_delay_buffer_unittest.cc (revision d9f758449e529ab9291ac668be2861e7a55c2422)
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