FFTW库c++中matlab的FFT和FFTShift
FFT and FFTShift of matlab in FFTW library c++
在 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 (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(and/or memmove)或 modify your input data
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
相同。
在 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 (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(and/or memmove)或 modify your input data
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
相同。