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

C++ FFTW:信号由IFFT后的噪声组成,c++,c,fft,noise,fftw,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);

在做了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类型?
P.S.数据是初始信号

更新 好的,现在代码是

        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;
        }
//FFT
fftw_复合体*频谱=(fftw_复合体*)fftw_malloc(sizeof(fftw_复合体)*n);
fftw_计划;
plan=fftw_plan_dft_r2c_1d(n,数据,频谱,fftw_估计);
fftw_执行(计划);
fftw销毁计划(计划);
//这里有些过滤
//IFFT
plan=fftw_plan_dft_c2r_1d(n,频谱,数据,fftw_估计);
fftw_执行(计划);
fftw销毁计划(计划);
//规范化
对于(int i=0;i
您正在执行实对实FFT(实际上,FFTW在内部计算DCT或离散余弦变换,但结果相同)。请注意在输出频谱阵列中计算的点数。实到实变换仅在数组中放置了n/2+1个实际值


如您所述,如果您计算实到复变换,您将生成光谱的两侧(它们是彼此的复共轭),但您的输出数组将需要调整大小以适应复值和DC结果。

我看不出您在哪里规范化输出。必须将输出值除以数据数组中的元素数,才能将数据规格化回原始值范围


请参阅FFTW手册4.8.2的最后一段(我有V3.2手册)。

您应该将代码粘贴到这个问题中。如果您的数据在转换到频域和返回到时域后只是噪声,则表示您的一个或两个转换过程都不正确。谢谢,问题在于我的转换尺寸,但我不是舒尔,我不知道我需要使用什么尺寸。请参见问题更新#2。