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