8

FFTとIFFTを実行した後、ヘッドホンでノイズしか聞こえません...コードは次のとおりです。

        double* spectrum = new double[n];

        fftw_plan plan;

        plan = fftw_plan_r2r_1d(n, data, spectrum, FFTW_REDFT10, FFTW_ESTIMATE);

        fftw_execute(plan);
        fftw_destroy_plan(plan);

        plan = fftw_plan_r2r_1d(n, spectrum, data, FFTW_REDFT01, FFTW_ESTIMATE);
        fftw_execute(plan);
        fftw_destroy_plan(plan);

たぶん私は間違ったFFTタイプを選択しましたか?
PSデータは初期信号です

アップデート

さて、コードは

        fftw_complex* spectrum = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * n);

        fftw_plan plan;

        plan = fftw_plan_dft_r2c_1d(n, data, spectrum, FFTW_ESTIMATE);

        fftw_execute(plan);
        fftw_destroy_plan(plan);

        plan = fftw_plan_dft_c2r_1d(n, spectrum, data, FFTW_ESTIMATE);
        fftw_execute(plan);
        fftw_destroy_plan(plan);

問題は同じままで、データ配列が破損しています。

更新#2

したがって、問題は変換サイズと正規化にあります。実在のFFTW_REDFT10およびFFTW_REDFT01変換を使用する場合、使用する必要のある変換サイズはどれですか?2 * n?または、他の何か?次に、各要素を2 * nで割って、出力信号を正規化する必要がありますか?
返信してくれてありがとう。

更新#3

再度返信していただきありがとうございます。私はあなたの助けを借りて問題を解決しました。動作するコードは次のとおりです。

        // FFT  
        fftw_complex* spectrum  = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * n);

        fftw_plan plan;

        plan = fftw_plan_dft_r2c_1d(n, data, spectrum, FFTW_ESTIMATE);

        fftw_execute(plan);
        fftw_destroy_plan(plan);

        // some filtering here

        // IFFT
        plan = fftw_plan_dft_c2r_1d(n, spectrum, data, FFTW_ESTIMATE);
        fftw_execute(plan);
        fftw_destroy_plan(plan);

        // normalizing

        for (int i = 0; i < n; i++) {
            data[i] = data[i] / n;
        }
4

2 に答える 2

5

出力を正規化している場所がわかりません。データを元の値の範囲に正規化するには、出力値をデータ配列内の要素数で割る必要があります。

FFTWマニュアル4.8.2の最後の段落を参照してください(私はV3.2マニュアルを持っています)。

于 2010-12-13T18:19:30.270 に答える
2

実数から実数へのFFTを実行しています(実際には、FFTWは内部でDCTまたは離散コサイン変換を計算していますが、結果は同じになります)。出力スペクトル配列で計算されるポイントの数に注意してください。実数から実数への変換では、配列に配置される実際の値はn / 2+1のみです。

あなたが示したように、実数から複素数への変換を計算する場合、スペクトルの両側を生成します(それらは互いに複素共役です)が、複素数の値とDCの結果に対応するために出力配列のサイズを変更する必要があります。

于 2010-12-13T18:04:21.540 に答える