【发布时间】:2014-06-30 08:31:37
【问题描述】:
我正在尝试使用 FFTW3 库在 C 中实现 Matlab fft2() 函数。
但是,我得到了不同的结果。
考虑下一个矩阵:
Z=[
0.4791 0.4765 0.4791 0.4765 0.4791 0.4765 0.4791 0.4765
0.4798 0.4695 0.4798 0.4695 0.4798 0.4695 0.4798 0.4695
0.4791 0.4765 0.4791 0.4765 0.4791 0.4765 0.4791 0.4765
0.4798 0.4695 0.4798 0.4695 0.4798 0.4695 0.4798 0.4695
0.4791 0.4765 0.4791 0.4765 0.4791 0.4765 0.4791 0.4765
0.4798 0.4695 0.4798 0.4695 0.4798 0.4695 0.4798 0.4695
0.4791 0.4765 0.4791 0.4765 0.4791 0.4765 0.4791 0.4765
0.4798 0.4695 0.4798 0.4695 0.4798 0.4695 0.4798 0.4695
....
]
并使用以下代码:
Z-> Double*
fftw_complex* fft2;
fft2 = (fftw_complex *)fftw_malloc(sizeof(fftw_complex)*Samples*(Lines));
fftw_plan p1;
p1 = fftw_plan_dft_r2c_2d(Lines,Samples, Z, fft2, FFTW_ESTIMATE);
fftw_execute(p1);
Matlab 的结果:
fft2= [
5534,25859596829 + 0,00000000000000i 186,747610745237 - 529,515274347496i
42,6452471730436 - 321,074636721419i -21,4495750160608 - 190,407528614266i
-50,3875107145668 - 50,5480303619799i 30,1151029075525 + 378,240946095017i
-196,295569635431 + 228,972218925794i 35,6434356803659 - 5,46216875816971i
36,2702126322693 - 38,5502177293316i 18,5093049539101 - 33,4608602804025i
....
]
我的 C 代码的结果:
5534.260423 + 0.000000 i 186.731496 + -529.495788 i
42.655319 + -321.068356 i -21.425010 + -190.382717 i
-50.277195 + -50.384210 i 29.909846 + 377.823957 i
-195.767224 + 228.693862 i 35.241375 + -5.315382 i
36.134134 + -38.527643 i 18.406395 + -33.467351 i
....
]
我做错了什么?
【问题讨论】:
-
你有错误的期望。计算机计算通常不准确。
-
@JoachimPileborg 否。MATLAB 引擎是用 Fortran 和/或 C 编写的,使用良好的老式 IEEE754 浮点类型。
-
@DavidHeffernan MATLAB 使用双精度,而不是浮点数
-
@mch 我没有另外说。还是说 IEEE754 双精度类型不是浮点类型?
-
@undur_gongor 你是对的,但 OP 的差异足以引起 IMO 的关注。如果使用相同的类型和相似的算法,那么结果应该只在机器精度的数量级上偏离。您使用的 FFTW 版本可能是单精度的(我很确定 MATLAB 版本是双精度的)。但是根据我的经验,即使 MATLAB 声称使用了 FFTW,我认为他们已经以某种方式更改了代码(可能更好地优化了 codelet)。我注意到速度明显不同here。