/// <summary> /// 周波数ドメインの値を入力。 /// 時間ドメインの値を出力。 /// </summary> /// <param name="X">周波数ドメインの値。サンプル数=processBlockSize</param> /// <returns>時間ドメインの値。</returns> private double[] Process1(WWComplex[] X) { System.Diagnostics.Debug.Assert(X.Length == WantSamples); var x = WWComplex.ToRealArray(mFFT.InverseFft(X)); if (0 == mProcessCounter) { // 1回目。 // 前半のデータは埋め草なので破棄。後半のみ意味があるデータ。 var r = new double[ProcessSize / 2]; Array.Copy(x, ProcessSize / 2, r, 0, ProcessSize / 2); mOverlapBuff = r; ++mProcessCounter; return(new double[0]); } { // 2回目以降。 var r = new double[ProcessSize / 2]; for (int i = 0; i < r.Length; ++i) { r[i] = x[i] + mOverlapBuff[i]; } // 次回計算用にオーバーラップ部分を保存。 for (int i = 0; i < r.Length; ++i) { mOverlapBuff[i] = x[ProcessSize / 2 + i]; } if (0 <= mNumSamples && mNumSamples < mProcessedSamples + r.Length) { // 必要サンプル数を超えて出力する必要はない。 var tmp = new double[mNumSamples - mProcessedSamples]; Array.Copy(r, 0, tmp, 0, tmp.Length); r = tmp; } ++mProcessCounter; mProcessedSamples += r.Length; return(r); } }