【问题标题】:FFT and FFTShift of matlab in FFTW library c++FFTW库c++中matlab的FFT和FFTShift
【发布时间】:2017-01-21 12:22:55
【问题描述】:

在 C++ 中并使用 FFTW 的这个 MATLAB 行代码的确切等价物是什么?

fftshift(fft(x,4096)));

注意:X 是一个包含 4096 个双精度数据的数组。

现在我在 c++ 和 FFTW 中使用这些代码行来计算 fft

int n = 4096
fftw_complex *x;
fftw_complex *y;
x = (fftw_complex *)fftw_malloc(sizeof(fftw_complex) * n);
y = (fftw_complex *)fftw_malloc(sizeof(fftw_complex) * n);

for (int i=0; i<n; i++)
{
       x[i][REAL] = MyDoubleData[i];
       x[i][IMAG] = 0;
}

fftw_plan plan = fftw_plan_dft_1d(n, x, y, FFTW_FORWARD, FFTW_ESTIMATE);

fftw_execute(plan);
fftw_destroy_plan(plan);
fftw_cleanup();

它相当于 MATLAB 中的 FFT 函数。 FFTW 库中是否有与 FftShift 等效的函数?

【问题讨论】:

    标签: c++ matlab fftw


    【解决方案1】:

    fftw 的输出按照以下频率序列格式存储:

    [0....N-1]
    

    其中 N 是频率数,是烘箱。 并将 fftshift 更改为:

    [-(N-1)/2,..., 0..., (N-1)/2]
    

    但您应该注意,fftw 输出等效于:

    [0,.., N-1] 与[0,...,(N-1)/2,-(N-1)/2,...,-1] 相同

    这意味着在 DFT 中,频率 -i 与 N-i 相同。

    【讨论】:

      【解决方案2】:

      您提供的 FFTW 函数调用相当于 fft(x,4096)。 如果 x 是实数,matlab 知道会给你共轭对称 FFT(我认为)。如果你想用 FFTW 做到这一点,你需要使用r2c and c2r functions (real-to-complex/complex-to-real)。

      您必须自己进行轮班。您可以直接替换(性能较差,但应该直观)

      for (int i=0; i<n; i++)
      {
          fftw_complex tmp;
          int src = i;
          int dst = (i + n/2 - 1) % n;
      
          tmp=y[src];
          y[src]=x[dst];
          y[dst]=tmp;
      }
      

      或者使用几个 memcpy(和/或 memmove)或 modify your input data

      【讨论】:

      • 它们不等价于 fftshift( fft( x ) ),它们等价于 fft( x )
      • 关于真实输入的被划掉的评论是有效的。它与fftshift 部分无关,但它仍然有用。此处为fftshift 显示的代码仅适用于偶数大小的数组。对于奇数大小的数组,它不会将 0 频率移动到最左边的 bin。请参阅此处了解一些不同的正确实现:stackoverflow.com/questions/5915125/…
      猜你喜欢
      • 2013-06-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-24
      • 1970-01-01
      • 2011-08-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多