1 /*
2 * Copyright (c) 2016 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 #include "modules/audio_processing/aec3/cascaded_biquad_filter.h"
11
12 #include "rtc_base/checks.h"
13
14 namespace webrtc {
15
CascadedBiQuadFilter(const CascadedBiQuadFilter::BiQuadCoefficients & coefficients,size_t num_biquads)16 CascadedBiQuadFilter::CascadedBiQuadFilter(
17 const CascadedBiQuadFilter::BiQuadCoefficients& coefficients,
18 size_t num_biquads)
19 : biquad_states_(num_biquads), coefficients_(coefficients) {}
20
21 CascadedBiQuadFilter::~CascadedBiQuadFilter() = default;
22
Process(rtc::ArrayView<const float> x,rtc::ArrayView<float> y)23 void CascadedBiQuadFilter::Process(rtc::ArrayView<const float> x,
24 rtc::ArrayView<float> y) {
25 ApplyBiQuad(x, y, &biquad_states_[0]);
26 for (size_t k = 1; k < biquad_states_.size(); ++k) {
27 ApplyBiQuad(y, y, &biquad_states_[k]);
28 }
29 }
30
Process(rtc::ArrayView<float> y)31 void CascadedBiQuadFilter::Process(rtc::ArrayView<float> y) {
32 for (auto& biquad : biquad_states_) {
33 ApplyBiQuad(y, y, &biquad);
34 }
35 }
36
ApplyBiQuad(rtc::ArrayView<const float> x,rtc::ArrayView<float> y,CascadedBiQuadFilter::BiQuadState * biquad_state)37 void CascadedBiQuadFilter::ApplyBiQuad(
38 rtc::ArrayView<const float> x,
39 rtc::ArrayView<float> y,
40 CascadedBiQuadFilter::BiQuadState* biquad_state) {
41 RTC_DCHECK_EQ(x.size(), y.size());
42 RTC_DCHECK(biquad_state);
43 const auto* c_b = coefficients_.b;
44 const auto* c_a = coefficients_.a;
45 auto* m_x = biquad_state->x;
46 auto* m_y = biquad_state->y;
47 for (size_t k = 0; k < x.size(); ++k) {
48 const float tmp = x[k];
49 y[k] = c_b[0] * tmp + c_b[1] * m_x[0] + c_b[2] * m_x[1] - c_a[0] * m_y[0] -
50 c_a[1] * m_y[1];
51 m_x[1] = m_x[0];
52 m_x[0] = tmp;
53 m_y[1] = m_y[0];
54 m_y[0] = y[k];
55 }
56 }
57
58 } // namespace webrtc
59