为什么 numpy fft 的结果与 matlab fft 不同?
Why is the result of numpy fft different from 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 中使用长度 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
德米奥。我认为您得到的不同值是因为 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.
上看到相关的 post 对此有很好的解释
另外值得注意的是,尽管这种浮点舍入错误总是会发生,但您必须根据您的数据集和您期望的结果来确定它是否重要。有时那些绝对差异并不意味着什么,因为相对差异是微不足道的。如果您希望从 MATLAB 中避免这种行为,您需要使用 sym
函数,该函数会触发 MATLAB 使用符号表示,其中涉及几件事,其中之一是数字表示更准确。有关此主题的更多信息,请参见此处:https://es.mathworks.com/help/symbolic/create-symbolic-numbers-variables-and-expressions.html#buyfu27.
我使用下面的参数和公式来生成信号。
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 中使用长度 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
德米奥。我认为您得到的不同值是因为 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.
上看到相关的 post 对此有很好的解释另外值得注意的是,尽管这种浮点舍入错误总是会发生,但您必须根据您的数据集和您期望的结果来确定它是否重要。有时那些绝对差异并不意味着什么,因为相对差异是微不足道的。如果您希望从 MATLAB 中避免这种行为,您需要使用 sym
函数,该函数会触发 MATLAB 使用符号表示,其中涉及几件事,其中之一是数字表示更准确。有关此主题的更多信息,请参见此处:https://es.mathworks.com/help/symbolic/create-symbolic-numbers-variables-and-expressions.html#buyfu27.