//----------------------------------------------------------------------
//  移動平均を行うクラス
//
//  2022/12/23, Copyright (c) 2022 MIKAMI, Naoki
//----------------------------------------------------------------------

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

#ifndef MOVING_AVERAGE_HPP
#define MOVING_AVERAGE_HPP

class MovingAverage
{
public:
    explicit MovingAverage(int m)
        : M_(m), C0_(1.0f/(m+1)), xk_(m+1, 0.0f) {}

    float Execute(float xn)
    {
        xk_[0] = xn;

        // 入力信号の総和の計算
        float yn = 0;
        for (int k=0; k<=M_; k++) yn += xk_[k];
        
        // 遅延器の入力信号の移動
        for (int k=M_; k>0; k--) xk_[k] = xk_[k-1];
    
        return C0_*yn;
    }

private:
    const int M_;       // 次数，平均するデータ数：M_+1
    const float C0_;    // 1/平均の個数
    Array<float> xk_;   // 入力信号用バッファ
};
#endif  // MOVING_AVERAGE_HPP
