【问题标题】:Building a filter with Python & MATLAB, results are not the same用Python和MATLAB搭建过滤器,结果不一样
【发布时间】:2019-03-21 00:10:41
【问题描述】:

我想将这段 MATLAB 代码翻译成 Python,我想我做的一切都是正确的,即使我没有得到相同的结果。

MATLAB 脚本:

n=2   %Filter_Order
Wn=[0.4 0.6]  %# Normalized cutoff frequencies 
[b,a] = butter(n,Wn,'bandpass') % Transfer function coefficients of the filter

Python 脚本:

import numpy as np
from scipy import signal

n=2   #Filter_Order
Wn=np.array([0.4,0.6]) # Normalized cutoff frequencies 
b, a = signal.butter(n, Wn, btype='band') #Transfer function coefficients of the filter 

a MATLAB 中的系数:1, -5.55e-16, 1.14, -1.66e-16, 0.41

a Python 中的系数:1, -2.77e-16, 1.14, -1.94e-16, 0.41

这可能只是精度问题,因为两个不同的值(第二个和第四个)都在10^(-16)的顺序上?!

另一方面,b 系数是相同的。

【问题讨论】:

  • 您使用不同的编程语言和不同的算法实现会得到不同的结果?我的意思是,它们如此接近真是太神奇了。
  • “这可能只是精度问题,因为两个不同的值(第二个和第四个)都在 10^(-16) 的数量级上?!” 是的。
  • 顺便说一句,1e-16 本质上是 0。

标签: python matlab numpy scipy


【解决方案1】:

您的机器精度大约是 1e-16(在 MATLAB 中,这可以通过 eps() 轻松检查,我认为在 Python 中大致相同)。因此,您正在处理的“错误”与机器精度有关,即实际上无法在拟合精度内计算。

还需要注意的是 MATLAB ~= Python(或 Python 中的 !=),因此一方面butter() 和另一方面signal.butter() 的实现会略有不同,即使您使用 完全相同的数字,由于两种语言都被翻译成机器代码的方式。

系数相差 16 个数量级并不重要;较小的将基本上被忽略。如果您确实需要精确值,请考虑使用符号数学或某种可变精度算术(MATLAB 中的vpa()),但我想在您的情况下,差异无关紧要。

【讨论】:

  • 好吧,CPython 没有被翻译成机器代码,尽管 numpy 可能正在调用以编译的本机代码实现的例程
猜你喜欢
  • 2017-11-24
  • 1970-01-01
  • 2015-10-14
  • 1970-01-01
  • 2011-01-10
  • 2019-09-08
  • 1970-01-01
  • 2014-10-23
  • 1970-01-01
相关资源
最近更新 更多