コード例 #1
0
        /// <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);
            }
        }