/*
 *  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 "modules/audio_processing/aec3/cascaded_biquad_filter.h"

#include "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
