//---------------------------------------------------
//  直接形 FIR フィルタ
//
//  2022/10/25, Copyright (c) 2022 MIKAMI, Naoki
//---------------------------------------------------

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

#ifndef FIR_DIRECT_HPP
#define FIR_DIRECT_HPP

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

    // フィルタ処理を実行する
    float Execute(float xn)
    {
        // 現在の入力信号を遅延器の先頭に格納
        xn_[0] = xn;

        // 入力信号と係数の積和の計算
        float yn = 0;
        for (int k=0; k<=ORDER_; k++) yn += HN_[k]*xn_[k];

        // 遅延器の入力信号の移動
        for (int k=ORDER_; k>0; k--) xn_[k] = xn_[k-1];

        return yn;
    }

private:
    const int ORDER_;       // 次数
    const Array<float> HN_; // 係数
    Array<float> xn_;       // 入力信号用バッファ
};
#endif  // FIR_DIRECT_HPP
