【问题标题】:Why is the result of numpy fft different from matlab fft?为什么numpy fft的结果与matlab fft不同?
【发布时间】:2022-01-07 15:59:33
【问题描述】:

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

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 代码,其中包含重现问题的确切参数
  • 我刚刚发布了matlab代码。期待发现问题。
  • 请说明你看到了什么不同。

标签: python matlab fft


【解决方案1】:

半数。我认为你得到的不同值是因为 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

【讨论】:

  • Python 也有浮点舍入错误。 Python 和 MATLAB 都对浮点数使用相同的表示形式,并且都使用相同的 CPU 对它们进行计算。 1e-15 左右的小值不会四舍五入为零。舍入发生在数字的第 15 位或第 16 位。 1e-37只有一位,可以完美表示。
  • 感谢清理!
  • Slak,是的,这些差异对结果并不重要。我们经常只关注 fft 操作后的主频率。在这种情况下,我对使用 6000 点时的计算结果感到惊讶,但是当使用少于 6000 点进行计算时,结果是完全一样的。我只能认为python和matlab在数据处理方面有一点区别,但是它们的计算方法是一样的。无论如何感谢您的分享。
  • 但是他们不使用相同的 BLAS 实现库,这可能是他们的 fft 函数所调用的! Matlab 使用 Intel MKL,大多数 NumPy 安装使用 OpenBLAS。这可能是这里差异的根源。而且由于这是对近似类型的算术,这可能很好并且“符合规范”。
猜你喜欢
  • 2017-11-09
  • 2016-09-08
  • 2017-09-28
  • 2015-11-16
  • 2017-11-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-05
相关资源
最近更新 更多