/// <summary> /// コンストラクタ /// </summary> /// <param name="x">FFT処理後のデータ</param> /// <param name="freq">周波数[Hz]</param> public FFTresultPlusFreq(FFTdata x, double freq) { this.data = x; this.frequency = freq; }
/// <summary> /// データをセットするメソッド2 /// <para> /// 指定された窓関数をかけて保持する。 /// データサイズよりFFTサイズの方が大きい場合は、0で埋める。 /// </para> /// </summary> private void Dataset(double[] arr) { FFTdata[] copy = new FFTdata[arr.Length]; for (int k = 0; k < arr.Length; k++) { copy[k].Re = arr[k]; copy[k].Im = 0.0; } this.Dataset(copy); return; }
/// <summary> /// FFTdata型一次元配列に対して、FFTを実行する /// <para>実部・虚部を合わせて解析するFFT/IFFTメソッド</para> /// <para>サンプリング周期をセットする機能付き(結果の整理が楽になります)</para> /// </summary> /// <param name="data">解析したいデータ配列</param> /// <param name="frequency">サンプリング周波数[Hz]</param> /// <returns>FFT処理データ</returns> public FFTresult FFT(FFTdata[] data, double frequency) { this.frequencyOfSample = frequency; return this.FFT(data); }
/**************************** メソッド ************************************/ /// <summary> /// データをセットするメソッド。 /// <para> /// 指定された窓関数をかけて保持する。 /// データサイズよりFFTサイズの方が大きい場合は、0で埋める。 /// 反対に、小さい場合は入るだけしか受け取らない。 /// </para> /// </summary> private void Dataset(FFTdata[] arr) { int i; int size; double[] temp = new double[arr.Length]; size = arr.Length; if (this.__FFTpoint < arr.Length) size = this.__FFTpoint; // フィルタにかけるサイズを決定する // Reパート for (i = 0; i < arr.Length; i++) temp[i] = arr[i].Re; temp = Window.Windowing(temp, this.__WindowKind); // 窓を掛ける for (i = 0; i < this.__FFTpoint; i++) // 受け渡されたデータをコピー { if( arr.Length > i ) // ある限りコピー this.set_datas[i].Re = temp[i]; else this.set_datas[i].Re = 0.0; // 余ったら0を詰める } // Imパート for (i = 0; i < arr.Length; i++) temp[i] = arr[i].Im; temp = Window.Windowing(temp, this.__WindowKind); // 窓を掛ける for (i = 0; i < this.__FFTpoint; i++) // 受け渡されたデータをコピー { if (arr.Length > i) this.set_datas[i].Im = temp[i]; // ある限りコピー else this.set_datas[i].Im = 0.0; // 余ったら0を詰める } return; }
/// <summary> /// FFTdata型一次元配列に対して、FFTを実行する /// <para>実部・虚部を合わせて解析するFFTメソッド</para> /// </summary> /// <param name="data">FFTdatas型の配列に解析したいデータを格納してください</param> /// <returns>FFT処理データ</returns> public FFTresult FFT(FFTdata[] data) { int i, k; double[] data_for_calc = new double[this.__FFTpoint * 2 + 1]; this.Dataset(data); // データをセットする for (i = 0; i < this.__FFTpoint; i++) { k = 2 * i + 1; data_for_calc[k] = this.set_datas[i].Re; // 解析するデータを格納する data_for_calc[k + 1] = this.set_datas[i].Im; // こっちはimaginaryパート } this.Calc(data_for_calc, this.__FFTpoint, (int)FFTorIFFT.FFTconvert); // FFT演算 for (i = 0; i < this.__FFTpoint; i++) { k = 2 * i + 1; this.calced_datas[i].Set(data_for_calc[k], data_for_calc[k + 1]); // 結果を格納する } return new FFTresult(this.calced_datas, this.frequencyOfSample, this.__FFTpoint); }