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

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

#ifndef IIR_DIRECT_II_FLOAT_HPP
#define IIR_DIRECT_II_FLOAT_HPP

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

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

        float 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 yn;
    }

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