// // 信号の絶対値(原点からの距離)を求めてその最大値を返す // public double GetAbs(double[] result, double[] real, double[] imag) { max = 0; // 最大値を小さな値に初期化 for(int i = 0; i < 1024; i++) { siglevel = Math.Sqrt(real[i] * real[i] + imag[i] * imag[i]); // ピタゴラスの定理で距離を計算 if(siglevel > max) max = siglevel; // 絶対値が大きければ最大値を更新 if(result != null) // 格納先変数が指定されていれば result[i] = siglevel; // 絶対値を格納する } return max; } // //移動平均処理とノイズリミット処理 2020.8.2 public void SignalAve(double[] real, double[] imag) { nblevel = 0; //NB level初期化 for (int i = 0; i < 20; i++) //j=移動平均区間のサンプル数 { sigabs[i] = Math.Sqrt(real[i] * real[i] + imag[i] * imag[i]); // 信号の絶対値を求める nblevel += sigabs[i];    //新たなabs[i]を加算 }  sigave[0] = nblevel / 20; //最初の区間の平均値を求める for (int i = 20; i < 1024; i++) { sigabs[i] = Math.Sqrt(real[i] * real[i] + imag[i] * imag[i]); nblevel -= sigabs[i - 20]; //古いデータを削除 nblevel += sigabs[i]; //新しいデーターを加算 sigave[i - 19] = nblevel / 20; //新しい移動平均値を求める } for (i = 1005; i < 1024; i++) { sigave[i] = sigave[1004]; } // Array.Copy(sigabs, 1019, nbtemp, 0, 20); //最後の20データーを次の計算用に仮保存 // ここからノイズリミット処理 for (i = 0; i < 1024; i++) { if (sigabs[i] > 2.0 * sigave[i]) //ノイズ判定したら { real[i] = real[i] * 0.1; //ゲインを下げる imag[i] = imag[i] * 0.1; } } }