/// <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);
        }