using System; using System.Collections.Generic; using System.Text; namespace SDR { class Affilter { static double[] a; //IIRフィルター係数 static double[] b; //IIRフィルター係数 static double[] iirin; //フィルター計算用入力信号バッファ static double[] iirout; //フィルター計算用出力信号バッファ static double PI = 3.141592653589793238; // パイの値 static double[] bpfrealout; //AF BPF出力信号の保存バッファ(実部) //IIR Filterの初期化と係数計算 public static void CreateIirAfBpf(double Fcenter, double Bw, double SamplFreq) //引数は後に使用予定 { a = new double[3]; //AF BPF係数用バッファ b = new double[3]; //AF BPF係数用バッファ iirin = new double[3]; //AF BPF計算用バッファ iirout = new double[3]; //AF BPF計算用バッファ Array.Clear(iirin, 0, 3); //配列クリア Array.Clear(iirout, 0, 3); //配列クリア double omega = 2.0 * PI * 500 / 48000; //フィルタ係数計算で使用する中間値 // double alpha = Math.Sin(omega) * Math.Sinh(Math.Log(2.0) / 2.0 * Bw * omega / Math.Sin(omega)); double alpha = Math.Sin(omega) / 0.667; //ここからHS_BPF係数 //b[2] = (1.0 - Math.Cos(omega)) / 2.0; a[0] = 1.0; b[0] = 0.046932511068243; b[1] = 0.0; b[2] = -0.0469325110682464; a[1] = -1.90205051664252; a[2] = 0.90613497786351; } //実信号にAF BPFを適応する public static void IirAfFilter(double[] real) { bpfrealout = new double[1024]; //AF BPF出力用バッファ for (int i = 0; i < 1024; i++) //1024信号繰り返す { iirin[0] = real[i]; bpfrealout[i] = b[0] / a[0] * iirin[0] + b[1] / a[0] * iirin[1] + b[2] / a[0] * iirin[2] - a[1] / a[0] * iirout[1] - a[2] / a[0] * iirout[2]; iirin[2] = iirin[1]; //2つ前の入力信号を更新 iirin[1] = real[i]; //1つ前の入力信号を更新 iirout[2] = iirout[1]; //2つ前のout信号を更新 iirout[1] = bpfrealout[i]; //1つ前のout信号を更新 real[i] = bpfrealout[i]; } } } }