【发布时间】:2019-06-24 14:40:45
【问题描述】:
我使用 FFTW 和 MATLAB fft 比较前向 FFT。输入信号是高斯信号。代码:
FFTW 使用 C:
float *signal; /*input signal*/
int nt; /*length of the signal*/
fftw_complex *in, *out;
fftw_plan plan1;
in = fftw_malloc(nt*sizeof(fftw_complex));
out = fftw_malloc(nt*sizeof(fftw_complex));
for (j=0;j<nt;j++){
in[j][0]=(double)signal[j];
in[j][1]=0.0;
}
plan1 = fftw_plan_dft_1d(nt, in, out, -1, FFTW_ESTIMATE);
fftw_execute(plan1);
fftw_destroy_plan(plan1);
for (j=0;j<nt;j++){
real[j]=(float)out[j][0];
imag[j]=(float)out[j][1];
}
fft MATLAB 中的函数:
fft(signal);
我绘制了两个结果的实部和虚部:
实部的值几乎相同,而虚部的值完全不同。如何解决这个问题?
【问题讨论】:
-
Imag 的差异在 10 到 -15 次方的范围内。所以并没有那么不同。
-
另一个事实是,因为我的信号是实数,但在 FFTW 中我创建了一个复数 DFT,这意味着该信号是具有零虚值的复数。对于真实信号,out[i] 是 out[n-i] 的共轭,如 matlab fft 结果所示。但是 FFTW 的图像不会这样。
-
一个很好的测试是在这两种情况下应用逆变换并比较结果,这将显示虚部的差异是否相关(我也认为它们不相关)。跨度>
-
“这意味着信号是具有零虚值的复数” DFT 的虚值为零,因为输入是对称的,而不是因为输入是实值。此外,知道虚值应该为零,您应该已经注意到它们非常接近于零。您只是在这里查看浮点舍入错误。舍入误差不需要是对称的。
-
您可以通过将所有小于 epsilon(例如 10^-14)的虚数值归零来解决“非精确共轭”部分,因为您知道它无论如何都是浮点噪声。