use*_*504 0 python matlab numpy
我试图将一个代码从 python 移植到 matlab,但我遇到了 numpy fft2 和 matlab fft2 之间的一个不一致:
peak =
4.377491037053e-223 3.029446976068e-216 ...
1.271610790463e-209 3.237410810582e-203 ...
Run Code Online (Sandbox Code Playgroud)
(大数据不能直接罗列,可以在这里访问:https : //drive.google.com/file/d/0Bz1-hopez9CGTFdzU0t3RDAyaHc/edit?usp=sharing)
MATLAB:
fft2(peak) --(sample result)
12.5663706143590 -12.4458341615690
-12.4458341615690 12.3264538927637
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
请帮我解释原因,并就如何解决它提出建议。
实偶函数的傅立叶变换是实偶函数 ( ref )。因此,您的 FFT 似乎应该是真实的?Numpy 可能只是在数字上挣扎,而 MATLAB 可能会彻底检查对称性并强制解决方案成为真实的。
MATLAB 使用 FFTW3,而我的研究表明 Numpy 使用名为 FFTPack 的库。FFTW 是 FFT 性能的标准之一,它使用许多技巧来快速工作并以可能的最佳精度执行计算。您可以使用非常小的数字,这提供了许多任何图书馆都难以解决的数字挑战。
您可能会考虑针对像pyFFTW3这样的 FFTW3 包装器执行 Python 代码,看看是否会得到类似的结果。
您的输入数据似乎是高斯实数和偶数,在这种情况下,我们确实希望信号的 FFT2 是实数和偶数。如果您的所有输入都是这种方式,您就可以采取实际的部分。或者四舍五入到一定的精度。我会相信 MATLAB 的 FFTW 代码胜过 Python 代码。
或者你可以忽略它。差异非常小,对于大多数应用程序来说,3e-15i 的值实际上为零。如果您已自动进行比较,如果所有条目的均方误差小于某个阈值(例如 1e-8 或 1e-15 或 1e-20),请考虑将它们称为等效。