【问题标题】:How to do inverse real to real FFT in FFTW library如何在 FFTW 库中进行反实数到实数 FFT
【发布时间】:2011-05-24 06:19:35
【问题描述】:

我正在尝试使用 FFT 进行一些过滤。我正在使用 r2r_1d 计划,但我不知道如何进行逆变换...

    void PerformFiltering(double* data, int n)
    {
                    /* FFT */
        double* spectrum = new double[n];

        fftw_plan plan;

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

        fftw_execute(plan); // signal to spectrum
        fftw_destroy_plan(plan); 


                    /* some filtering here */


                    /* Inverse FFT */
        plan = fftw_plan_r2r_1d(n, spectrum, data, FFTW_REDFT00, FFTW_ESTIMATE);
        fftw_execute(plan); // spectrum to signal (inverse FFT)
        fftw_destroy_plan(plan);

}

我做的所有事情都正确吗?我很困惑,因为在 FFTW 复杂的 DFT 中,您可以像这样通过标志设置变换方向:
p = fftw_plan_dft_1d(N, in, out, FFTW_FORWARD, FFTW_ESTIMATE);

p = fftw_plan_dft_1d(N, in, out, FFTW_BACKWARD, FFTW_ESTIMATE);

【问题讨论】:

    标签: c++ c fft inverse fftw


    【解决方案1】:

    http://www.fftw.org/fftw3_doc/Real_002dto_002dReal-Transform-Kinds.html

    http://www.fftw.org/fftw3_doc/1d-Real_002deven-DFTs-_0028DCTs_0029.html

    “种类”指定方向。

    (另请注意,您可能希望通过除以 n 来重新归一化您的信号。FFTW 的归一化约定在变换及其逆运算后乘以 n。)

    【讨论】:

      【解决方案2】:

      你做得对。 FFTW_REDFT00 表示余弦变换,它是它自己的逆。所以没有必要区分“前进”和“后退”。但是,请注意数组大小。如果您想检测频率为 10,并且您的数据包含 100 个有意义的点,那么数组 data 应该包含 101 个数据点,并设置 n = 101 而不是 100。归一化应该是2*(n-1)。看下面的例子,用gcc a.c -lfftw3编译。

      #include <stdio.h>
      #include <math.h>
      #include <fftw3.h>
      #define n 101 /* note the 1 */
      int main(void) {
        double in[n], in2[n], out[n];
        fftw_plan p, q;
        int i;
        p = fftw_plan_r2r_1d(n, in, out, FFTW_REDFT00, FFTW_ESTIMATE);
        for (i = 0; i < n; i++) in[i] = cos(2*M_PI*10*i/(n - 1)); /* n - 1 instead of n */
        fftw_execute(p);
        q = fftw_plan_r2r_1d(n, out, in2, FFTW_REDFT00, FFTW_ESTIMATE);
        fftw_execute(q);
        for (i = 0; i < n; i++)
          printf("%3d %9.5f %9.5f\n", i, in[i], in2[i]/(2*(n - 1))); /* n - 1 instead of n */
        fftw_destroy_plan(p); fftw_destroy_plan(q); fftw_cleanup();
        return 0;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-10-03
        • 1970-01-01
        • 2011-06-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多