Matlab FFTW库C ++中的FFT和FFTShift

FFT and FFTShift of matlab in FFTW library c++

在C ++中使用FFTW,此MATLAB行代码的确切等效项是什么?

1
fftshift(fft(x,4096)));

注意:X是4096个double数据的数组。

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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是否具有等效功能?


fftw的输出是根据以下频率序列格式存储的:

1
[0....N-1]

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

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

但您应注意,fftw输出的等效项为:

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

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


您提供的FFTW函数调用等效于fft(x,4096)如果x是实数,则matlab会知道为您提供共轭对称FFT(我认为)。 如果要使用FFTW进行此操作,则需要使用r2cc2r函数(从实数到复杂/从复杂数到实数)。

您必须自己做转变。 您可以直接替换(效果不佳,但应该直观)

1
2
3
4
5
6
7
8
9
10
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)或修改您的输入数据