使用Python验证Matlab filter与scipy.signal.lfilter的结果差异
问题原因与解决方案
差异原因
- Matlab
filter(b,a,x)函数默认对输入矩阵的第一个非单元素维度执行滤波操作:你的输入xx为100行1列的矩阵,默认沿长度为100的行维度(1索引下的第1维)进行滤波,因此得到你展示的非零结果。 - Scipy
lfilter函数默认参数axis=-1,即沿输入的最后一个维度执行滤波:你的输入xx形状为(100, 1),最后一维长度为1,相当于对每个单独的数值单独做滤波计算,滤波器第一个系数为0,因此输出全为0,和你观测到的结果一致。
修正方法
显式指定lfilter的滤波维度为第0维(对应Matlab默认处理的维度)即可得到和Matlab完全一致的输出,修改后代码如下:
import numpy as np from scipy.signal import lfilter bb = np.arange(0, 100, 1) aa = 1 xx = np.tile(0.9, (100, 1)) # 指定沿第0维(行方向)滤波,匹配Matlab默认行为 yy = lfilter(b=bb, a=aa, x=xx, axis=0) print(yy[:10])
运行上述代码后输出的前10行结果如下,和Matlab运行结果完全匹配:
array([[ 0. ], [ 0.9], [ 2.7], [ 5.4], [ 9. ], [13.5], [18.9], [25.2], [32.4], [40.5]])
内容的提问来源于stack exchange,提问作者LearnToGrow
相关产品推荐
相关产品推荐

