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

Posted

技术标签:

【中文标题】FFTW:信号由IFFT后的噪声组成【英文标题】:FFTW: signal consists of noise after IFFT 【发布时间】:2011-05-24 17:31:25 【问题描述】:

在进行 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 类型? 附言数据是初始信号

更新

好的,现在代码是

        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;
        

【问题讨论】:

您应该将代码粘贴到此问题中。如果您的数据在转换到频域并返回到时域后只是噪声,这意味着您的一个或两个转换过程都执行不正确。 【参考方案1】:

您正在执行一个实数到实数的 FFT(实际上,FFTW 是在内部计算 DCT 或离散余弦变换,但结果相同)。注意输出频谱数组中计算的点数。实数转换只有 n/2+1 个实际值放入数组中。

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

【讨论】:

谢谢,问题出在我的变换尺寸上,但我不确定我需要使用什么尺寸。请参阅问题更新 #2。【参考方案2】:

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

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

【讨论】:

以上是关于FFTW:信号由IFFT后的噪声组成的主要内容,如果未能解决你的问题,请参考以下文章

Python ifft

Matlab——噪声的检测和处理实验

FFTW 反向变换乘以 N

小波变换后的图像如何去噪

采样频率决定一周期内采样点的个数吗

怎么利用FFT算法对音频噪声进行处理