//---------------------------------------------------
//  直接形の転置形 FIR フィルタ
//
//  2022/12/22, Copyright (c) 2022 MIKAMI, Naoki
//---------------------------------------------------

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

#ifndef FIR_DIRECT_TRANSPOSED_HPP
#define FIR_DIRECT_TRANSPOSED_HPP

class FirTransposed
{
public:
    FirTransposed(float order, const float hk[])
        : ORDER_(order), HN_(order+1, hk), vn_(order+1, 0.0f) {}

    // フィルタ処理を実行する
    float Execute(float xn)
    {
        // 差分方程式に対応する計算
        for (int k=0; k<ORDER_; k++)
            vn_[k] = HN_[k]*xn + vn_[k+1];
        vn_[ORDER_] = HN_[ORDER_]*xn;

        return vn_[0];
    }

private:
    const int ORDER_;       // 次数
    const Array<float> HN_; // 係数
    Array<float> vn_;       // 中間結果用バッファ
};
#endif  // FIR_DIRECT_TRANSPOSED_HPP
