//--------------------------------------------------------------
//	Hilbert 変換用フィルタ
//
//		作成者：三上直樹，2023/01/21 作成，ⓒ三上直樹 2023
//--------------------------------------------------------------

using System.Linq;

namespace Mikami.Filter
{
	public class Hilbert
	{
		private readonly int ORDER_;
		private readonly float[] hk_;
		private float[] xn_;

		// コンストラクタ
		public Hilbert(float[] hk)
		{
			ORDER_ = hk.Length*4 - 2;
			hk_ = hk.ToArray();
			xn_ = new float[ORDER_+1];
		}

		// フィルタを実行する
		//		yI	同相信号
		//		yQ	直角位相信号
		public void Execute(float xn, out float yI, out float yQ)
		{
			yQ = 0.0f;
			xn_[0] = xn;

			for (int k=0; k<=ORDER_/4; k++)
				yQ = yQ + hk_[k]*(xn_[2*k] - xn_[ORDER_-2*k]);
			yI = xn_[ORDER_/2];				// 同相信号

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