使用Python和MATLAB构建过滤器,结果不一样

时间:2019-03-20 16:02:59

标签: python matlab numpy scipy

我想将此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

由于两个不同的值(第2个和第4个)都位于10^(-16)的量级上,这可能只是一个精度问题?!

b系数相同。

1 个答案:

答案 0 :(得分:4)

您的机器精度约为1e-16(在MATLAB中,可以轻松地通过eps()进行检查,我猜想在Python中也是如此)。因此,您要处理的“错误”大约是机器精度,即实际上无法在配合精度内计算。

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

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