【问题标题】:FFT and IFFT with FFTWFFTW 的 FFT 和 IFFT
【发布时间】:2016-04-28 11:31:16
【问题描述】:

我正在尝试在浮点数组上执行 ifft 和 fft。然而,两者的结果是相同的。你有什么主意吗? 为什么结果相同,即使我使用 FFTW_FORWARD 和 FFTW_BACKWARD 另一个?

  int N=16;
  fftwf_complex in[N], out[N];
  fftwf_plan p1, q;

  /* prepare a cosine wave */
  for (i = 0; i < N; i++) {
    in[i][0] = cos(3 * 2*M_PI*i/N);
    in[i][1] = 0;
  }

  /* forward Fourier transform, save the result in 'out' */
  p1 = fftwf_plan_dft_1d(N, in, out, FFTW_FORWARD, FFTW_ESTIMATE);
  fftwf_execute(p1);
  for (i = 0; i < N; i++)
  cout << out[i][0] << endl;
  fftwf_destroy_plan(p1);

  printf("\nInverse transform:\n");
  q = fftwf_plan_dft_1d(N, in, out, FFTW_BACKWARD, FFTW_ESTIMATE);
  fftwf_execute(q);
  for (i = 0; i < N; i++)
  cout << out[i][0] << endl;
  fftwf_destroy_plan(q);

【问题讨论】:

    标签: c++ math signal-processing fft fftw


    【解决方案1】:

    您只显示输出箱的实部,而忽略了虚部。碰巧实部匹配,但虚部不同(它们实际上是复共轭):

    #include <iostream>
    #include <cmath>
    #include "fftw3.h"
    
    using namespace std;
    
    int main()
    {
        int N=16;
        fftwf_complex in[N], out[N];
        fftwf_plan p1, q;
    
        for (int i = 0; i < N; i++) {
            in[i][0] = cos(3 * 2*M_PI*i/N);
            in[i][1] = 0;
        }
    
        p1 = fftwf_plan_dft_1d(N, in, out, FFTW_FORWARD, FFTW_ESTIMATE);
        fftwf_execute(p1);
        for (int i = 0; i < N; i++)
            cout << out[i][0] << " + j" << out[i][1] << endl; // <<<
        fftwf_destroy_plan(p1);
    
        printf("\nInverse transform:\n");
        q = fftwf_plan_dft_1d(N, in, out, FFTW_BACKWARD, FFTW_ESTIMATE);
        fftwf_execute(q);
        for (int i = 0; i < N; i++)
            cout << out[i][0] << " + j" << out[i][1] << endl; // <<<
        fftwf_destroy_plan(q);
    
        return 0;
    }
    

    编译运行:

    $ g++ -Wall fftwf.cpp -lfftw3f && ./a.out
    
    3.67394e-16 + j0
    1.19209e-07 + j7.34788e-16
    -3.67394e-16 + j0
    8 + j-7.34788e-16
    3.67394e-16 + j0
    2.38419e-07 + j7.34788e-16
    -3.67394e-16 + j0
    1.19209e-07 + j-7.34788e-16
    3.67394e-16 + j0
    1.19209e-07 + j7.34788e-16
    -3.67394e-16 + j0
    2.38419e-07 + j-7.34788e-16
    3.67394e-16 + j0
    8 + j7.34788e-16
    -3.67394e-16 + j0
    1.19209e-07 + j-7.34788e-16
    
    Inverse transform:
    3.67394e-16 + j0
    1.19209e-07 + j-7.34788e-16
    -3.67394e-16 + j0
    8 + j7.34788e-16
    3.67394e-16 + j0
    2.38419e-07 + j-7.34788e-16
    -3.67394e-16 + j0
    1.19209e-07 + j7.34788e-16
    3.67394e-16 + j0
    1.19209e-07 + j-7.34788e-16
    -3.67394e-16 + j0
    2.38419e-07 + j7.34788e-16
    3.67394e-16 + j0
    8 + j-7.34788e-16
    -3.67394e-16 + j0
    1.19209e-07 + j7.34788e-16
    

    有趣的是,FFT 和 IFFT 在数学上几乎相同。它们通常都作为单个例程实现,带有指示方向(正向或反向)的标志。通常这个标志只会影响旋转因子虚部的符号。

    【讨论】:

    • 太棒了!非常感谢!
    猜你喜欢
    • 2011-08-06
    • 1970-01-01
    • 2012-08-11
    • 1970-01-01
    • 2014-10-06
    • 1970-01-01
    • 2013-06-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多