为什么numpy fft的结果与matlab fft不同



我使用以下参数和公式来生成信号。

python代码:

import numpy as np
fs=15e6
dt=1/fs
f0=1e6
pri=400e-6
t=np.arange(0,pri,dt)
i=64
fd=5/(i*pri)
xt=0.1*np.exp(2j*np.pi*f0*t)
xf=np.fft.fft(xt)

matlab代码与python代码非常相似:

fs=15e6
dt=1/fs
f0=1e6
pri=400e-6
t=0:dt:pri-dt
i=64
fd=5/(i*pri)
xt=0.1*exp(2j*pi*f0*t)
xf=fft(xt)

这些代码将生成一个长度为6000的数组来执行fft。然后我用同样的方法在matlab中计算结果。当fft长度小于6000时,结果是完全相同的。但是当fft长度为6000时,它变得有点不同。python中xf的结果是:

xf[:5] = [4.68819428e-12-2.53650626e-12j,
6.55886345e-12+4.51937973e-13j,
5.91758655e-12+4.48215898e-12j,
2.07297400e-12+6.37992397e-12j,
-1.44454940e-12+5.60550355e-12j]

xf在matlab中的结果是:

xf(1:5) = 5.165829569664382e-12+1.503743771929872e-12j
4.389776854811194e-12+5.127317569216533e-12j
1.067288620484369e-12+7.191186166371298e-12j
-3.058138112418996e-12+6.189531470616248e-12j
-5.288313073640339e-12+2.908982377132765e-12j

如果在python中使用length 5999来执行这样的fft:xf=np.fft.fft(xt,5999(或在matlab中:xf=fft(xt,5999(结果完全相同。在python中:

xf[:5] = [-0.09135455+0.04067366j,
-0.09160153+0.04072616j,
-0.09184974+0.04077892j,
-0.09209917+0.04083194j,
-0.09234986+0.04088522j]

在matlab中:

xf(1:5) = -9.135455e-02+4.067366e-2j
-9.160153e-02+4.072616e-2j
-9.184974e-02+4.077892e-2j
-9.209917e-02+4.083194e-2j
-9.234986e-02+4.088522e-2j

我很困惑。有人能说明这种现象吗?谢谢你的帮助。PS:python 3.8.5,numpy 1.19.2,matlab 2014

demio。我认为你得到的不同值是因为MATLAB的浮点舍入误差。对于1e-15阶的低值,这些值被四舍五入到0,这会产生四舍五进到的阶数错误。对于真正大的值,情况也是如此。你可以在上看到一篇相关的帖子,其中对此有很好的解释:https://es.mathworks.com/matlabcentral/answers/475494-unexpected-results-due-to-floating-point-rounding-errors-by-performing-arithmetic-calculations-on-la.

此外,值得注意的是,即使这种浮点舍入错误总是发生,你也必须考虑到你的数据集和你期望的结果来确定这是否重要。有时,这些绝对差异并不意味着什么,因为相对差异是边际的。如果你想从MATLAB中避免这种行为,你需要使用sym函数,它会触发MATLAB使用符号表示,这涉及到几个方面,其中之一是数字的表示更准确。有关此主题的更多信息,请点击此处:https://es.mathworks.com/help/symbolic/create-symbolic-numbers-variables-and-expressions.html#buyfu27.

最新更新