我试图将一个代码从python移植到matlab,但是在numpy fft2和matlab fft2之间遇到一个不一致:
peak =
4.377491037053e-223 3.029446976068e-216 ...
1.271610790463e-209 3.237410810582e-203 ...
(大数据不能直接列出,可在此处访问:https://drive.google.com/file/d/0Bz1-hopez9CGTFdzU0t3RDAyaHc/edit?usp=sharing)
Matlab的:
fft2(peak) --(sample result)
12.5663706143590 -12.4458341615690
-12.4458341615690 12.3264538927637
的Python:
np.fft.fft2(peak) --(sample result)
12.56637061 +0.00000000e+00j -12.44583416 +3.42948517e-15j
-12.44583416 +3.35525358e-15j 12.32645389 -6.78073635e-15j
请帮我解释原因,并就如何解决问题提出建议。
答案 0 :(得分:3)
真实,偶数函数的傅里叶变换是真实的和均匀的(ref)。因此,您的FFT似乎应该是真实的吗? Numpy可能只是在数学上苦苦挣扎,而MATLAB可能直接检查对称性并迫使解决方案成为现实。
MATLAB使用FFTW3而我的研究表明Numpy使用了一个名为FFTPack的库。 FFTW是FFT性能的标准之一,它使用了许多技巧来快速工作并以尽可能精确的方式执行计算。你可以提供极其微小的数字,这提供了许多数字挑战,任何图书馆都难以解决。
您可以考虑针对像pyFFTW3这样的FFTW3包装器执行Python代码,看看是否得到了类似的结果。
您的输入数据似乎是 gaussian real和even,在这种情况下,我们希望信号的FFT2是真实的和均匀的。如果所有输入都是这样的,那么可以只是采取真实的部分。或者圆到一定精度。我相信MATLAB的FFTW代码优于Python代码。
或者你可以忽略它。差异非常小,对于大多数应用来说,3e-15i的值实际上为零。如果您已自动进行比较,如果所有条目的均方误差小于某个阈值(例如1e-8或1e-15或1e-20),请考虑将它们称为等效。