//--------------------------------------------------------------
//	移動平均
//
//		作成者：三上直樹，2022/11/24 作成，ⓒ三上直樹 2022
//--------------------------------------------------------------

namespace MyFilter
{
	// 図1 のブロック図のフィルタ
	public class MovingAverage
	{
		private readonly int M_;		// 次数
		private readonly double c0_;	// 1/(M+1)
		private readonly double[] xn_;	// 過去の入力信号の保存用

		// コンストラクタ
		public MovingAverage(int m)
		{
			M_ = m;
			c0_ = 1.0/(double)(m + 1);
			xn_ = new double[m+1];
			for (int n=0; n<= M_; n++) xn_[n] = 0.0;
		}

		// フィルタを実行する
		public double Execute(double xn)
		{
			xn_[0] = xn;
			double yn = 0;
			for (int n=0; n<=M_; n++) yn += xn_[n];
			for (int n=M_; n>0; n--) xn_[n] = xn_[n-1];
			return c0_*yn;
		}
	}
}
