FFTW库c ++中matlab的FFT和FFTShift

时间:2017-01-21 12:22:56

标签: c++ matlab fftw

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

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的等效函数?

2 个答案:

答案 0 :(得分:1)

fftw的输出基于以下频率序列格式存储:

[0....N-1]

其中N是频率数,是烤箱。 而fftshift将其改为:

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

但你应该注意ff​​tw输出的等价如下:

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

相同

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

答案 1 :(得分:0)

你提供的FFTW函数调用相当于fft(x,4096)如果x是真的,matlab知道给你共轭对称FFT(我认为)。如果你想用FFTW做这个,你需要使用r2c and c2r functions(真实到复杂/复杂到真实)。

你必须自己做换班。你可以直接替换(性能不佳,但应该直观)

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

相关问题