在C++中使用FFTW,此MATLAB行代码的确切等效项是什么?
fftshift(fft(x,4096)));
注意:X是4096个double数据的数组。
现在我在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是否具有等效功能?
最佳答案
您提供的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
关于c++ - Matlab FFTW库C++中的FFT和FFTShift,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41779293/