xref: /aosp_15_r20/external/webrtc/modules/audio_processing/aec3/render_buffer.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/render_buffer.h"
12 
13 #include <algorithm>
14 #include <functional>
15 
16 #include "modules/audio_processing/aec3/aec3_common.h"
17 #include "rtc_base/checks.h"
18 
19 namespace webrtc {
20 
RenderBuffer(BlockBuffer * block_buffer,SpectrumBuffer * spectrum_buffer,FftBuffer * fft_buffer)21 RenderBuffer::RenderBuffer(BlockBuffer* block_buffer,
22                            SpectrumBuffer* spectrum_buffer,
23                            FftBuffer* fft_buffer)
24     : block_buffer_(block_buffer),
25       spectrum_buffer_(spectrum_buffer),
26       fft_buffer_(fft_buffer) {
27   RTC_DCHECK(block_buffer_);
28   RTC_DCHECK(spectrum_buffer_);
29   RTC_DCHECK(fft_buffer_);
30   RTC_DCHECK_EQ(block_buffer_->buffer.size(), fft_buffer_->buffer.size());
31   RTC_DCHECK_EQ(spectrum_buffer_->buffer.size(), fft_buffer_->buffer.size());
32   RTC_DCHECK_EQ(spectrum_buffer_->read, fft_buffer_->read);
33   RTC_DCHECK_EQ(spectrum_buffer_->write, fft_buffer_->write);
34 }
35 
36 RenderBuffer::~RenderBuffer() = default;
37 
SpectralSum(size_t num_spectra,std::array<float,kFftLengthBy2Plus1> * X2) const38 void RenderBuffer::SpectralSum(
39     size_t num_spectra,
40     std::array<float, kFftLengthBy2Plus1>* X2) const {
41   X2->fill(0.f);
42   int position = spectrum_buffer_->read;
43   for (size_t j = 0; j < num_spectra; ++j) {
44     for (const auto& channel_spectrum : spectrum_buffer_->buffer[position]) {
45       for (size_t k = 0; k < X2->size(); ++k) {
46         (*X2)[k] += channel_spectrum[k];
47       }
48     }
49     position = spectrum_buffer_->IncIndex(position);
50   }
51 }
52 
SpectralSums(size_t num_spectra_shorter,size_t num_spectra_longer,std::array<float,kFftLengthBy2Plus1> * X2_shorter,std::array<float,kFftLengthBy2Plus1> * X2_longer) const53 void RenderBuffer::SpectralSums(
54     size_t num_spectra_shorter,
55     size_t num_spectra_longer,
56     std::array<float, kFftLengthBy2Plus1>* X2_shorter,
57     std::array<float, kFftLengthBy2Plus1>* X2_longer) const {
58   RTC_DCHECK_LE(num_spectra_shorter, num_spectra_longer);
59   X2_shorter->fill(0.f);
60   int position = spectrum_buffer_->read;
61   size_t j = 0;
62   for (; j < num_spectra_shorter; ++j) {
63     for (const auto& channel_spectrum : spectrum_buffer_->buffer[position]) {
64       for (size_t k = 0; k < X2_shorter->size(); ++k) {
65         (*X2_shorter)[k] += channel_spectrum[k];
66       }
67     }
68     position = spectrum_buffer_->IncIndex(position);
69   }
70   std::copy(X2_shorter->begin(), X2_shorter->end(), X2_longer->begin());
71   for (; j < num_spectra_longer; ++j) {
72     for (const auto& channel_spectrum : spectrum_buffer_->buffer[position]) {
73       for (size_t k = 0; k < X2_longer->size(); ++k) {
74         (*X2_longer)[k] += channel_spectrum[k];
75       }
76     }
77     position = spectrum_buffer_->IncIndex(position);
78   }
79 }
80 
81 }  // namespace webrtc
82