| /* |
| * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved. |
| * |
| * Use of this source code is governed by a BSD-style license |
| * that can be found in the LICENSE file in the root of the source |
| * tree. An additional intellectual property rights grant can be found |
| * in the file PATENTS. All contributing project authors may |
| * be found in the AUTHORS file in the root of the source tree. |
| */ |
| #include "webrtc/modules/audio_processing/aec3/cascaded_biquad_filter.h" |
| |
| #include "webrtc/rtc_base/checks.h" |
| |
| namespace webrtc { |
| |
| CascadedBiQuadFilter::CascadedBiQuadFilter( |
| const CascadedBiQuadFilter::BiQuadCoefficients& coefficients, |
| size_t num_biquads) |
| : biquad_states_(num_biquads), coefficients_(coefficients) {} |
| |
| CascadedBiQuadFilter::~CascadedBiQuadFilter() = default; |
| |
| void CascadedBiQuadFilter::Process(rtc::ArrayView<const float> x, |
| rtc::ArrayView<float> y) { |
| ApplyBiQuad(x, y, &biquad_states_[0]); |
| for (size_t k = 1; k < biquad_states_.size(); ++k) { |
| ApplyBiQuad(y, y, &biquad_states_[k]); |
| } |
| } |
| |
| void CascadedBiQuadFilter::Process(rtc::ArrayView<float> y) { |
| for (auto& biquad : biquad_states_) { |
| ApplyBiQuad(y, y, &biquad); |
| } |
| } |
| |
| void CascadedBiQuadFilter::ApplyBiQuad( |
| rtc::ArrayView<const float> x, |
| rtc::ArrayView<float> y, |
| CascadedBiQuadFilter::BiQuadState* biquad_state) { |
| RTC_DCHECK_EQ(x.size(), y.size()); |
| RTC_DCHECK(biquad_state); |
| const auto* c_b = coefficients_.b; |
| const auto* c_a = coefficients_.a; |
| auto* m_x = biquad_state->x; |
| auto* m_y = biquad_state->y; |
| for (size_t k = 0; k < x.size(); ++k) { |
| const float tmp = x[k]; |
| y[k] = c_b[0] * tmp + c_b[1] * m_x[0] + c_b[2] * m_x[1] - c_a[0] * m_y[0] - |
| c_a[1] * m_y[1]; |
| m_x[1] = m_x[0]; |
| m_x[0] = tmp; |
| m_y[1] = m_y[0]; |
| m_y[0] = y[k]; |
| } |
| } |
| |
| } // namespace webrtc |