c++ - FFTW:IFFT后信号由噪声组成

标签 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);

也许我选择了错误的 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;
        }

最佳答案

我没有看到您在哪里对输出进行标准化。您必须将输出值除以数据数组中的元素数,才能将数据规范化回原始值范围。

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

关于c++ - FFTW:IFFT后信号由噪声组成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4430172/

相关文章:

c++ - 不平衡随机数发生器

c++ - Lambda 特定变量

c - 在 C 中处理 SIGINT

c - 双链表 - 内存损坏

c++ - 从 istream 获取下一个 float ?

c++ - Ifstream,如何在面对特定字符后读取下一行

c - 从 C 中的 fscanf 字符串中删除特殊字符

java - 傅立叶变换得到大约一半错误输出

c# - C# 中快速傅里叶变换 (FFT) 的实现

android - 访问 MediaPlayer 中的音频缓冲区