//-----------------------------------------------------
//  直接形Ⅱ IIR フィルタ，係数：double 型
//      内部演算は double 型を使用
//
//  2022/12/22, Copyright (c) 2022 MIKAMI, Naoki
//-----------------------------------------------------

#include "Array.hpp"
using Mikami::Array;

#ifndef IIR_DIRECT_II_DOUBLE_HPP
#define IIR_DIRECT_II_DOUBLE_HPP

class IirDirect2D
{
public:
    IirDirect2D(int order, const double ak[], const double bk[])
        : ORDER_(order), an_(order, ak), bn_(order+1, bk),
          vn_(order+1, 0.0) {}

    // フィルタ処理を実行する
    float Execute(float xn)
    {
        vn_[0] = xn;
        for (int k=0; k<ORDER_; k++)
            vn_[0] = vn_[0] + an_[k]*vn_[k+1];

        double yn = 0;
        for (int k=0; k<=ORDER_; k++)
            yn = yn + bn_[k]*vn_[k];

        for (int k=ORDER_; k>0; k--) vn_[k] = vn_[k-1];

        return (float)yn;
    }

private:
    const int ORDER_;       // 次数
    const Array<double> an_;
    const Array<double> bn_;
    Array<double> vn_;      // 単位遅延素子に対応する配列
};
#endif  // IIR_DIRECT_II_DOUBLE_HPP
