FFTW:信号由IFFT后的噪声组成

Kir*_*kov 8 c c++ fft noise fftw

做完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);
Run Code Online (Sandbox Code Playgroud)

也许我选择了错误的FFT类型?
PS数据是初始信号

UPDATE

好的,现在代码是

        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);
Run Code Online (Sandbox Code Playgroud)

问题仍然存在,我的数据阵列已损坏.

更新#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;
        }
Run Code Online (Sandbox Code Playgroud)

Ste*_*ows 5

我没有看到你的输出正常化.必须将输出值除以数据数组中的元素数,以将数据规范化为原始值范围.

参见FFTW手册4.8.2,最后一段(我有V3.2手册).