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输出的等效项为:
这意味着在DFT中,频率
您提供的FFTW函数调用等效于如果x是实数,则matlab会知道为您提供共轭对称FFT(我认为)。 如果要使用FFTW进行此操作,则需要使用
您必须自己做转变。 您可以直接替换(效果不佳,但应该直观)
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)或修改您的输入数据