【问题标题】:Evaluate filter matlab function using python使用python评估过滤器matlab函数
【发布时间】:2021-11-25 04:42:34
【问题描述】:

根据两个函数的描述,filter(b, a, x)matlab 函数和lfilter(b, a, x, axis=-1, z_i=None)scipy.signal 应该给出相同的结果。

我以这个结果完全不同的例子为例:

import numpy as np
from scipy.signal import lfilter

bb = np.arange(0, 100, 1)

aa = 1

xx = np.tile(0.9, (100, 1))

yy = lfilter(b=bb, a=aa, x=xx)

print(yy[:10])

array([[0.],
       [0.],
       [0.],
       [0.],
       [0.],
       [0.],
       [0.],
       [0.],
       [0.],
       [0.]])
print(yy.shape)
(100, 1)

# Same example on Matlab using filter
bb = 0:1:99
aa  =  1
xx =repmat(0.9, 100, 1)
dd = filter(bb, aa, xx)
dd(1:10)
ans =

         0
    0.9000
    2.7000
    5.4000
    9.0000
   13.5000
   18.9000
   25.2000
   32.4000
   40.5000
print(size(dd)) # (100 ,1)
     

【问题讨论】:

    标签: python matlab scipy


    【解决方案1】:

    @warren 的回答很好。这里有更多关于函数使用的细节。

    filter(b, a, x, zi, dim) 返回 zf 值,即使 zi 没有作为输入给出。

    在上面的例子中:

    [y, zf] = filter(b=bb, a=aa, x=xx)
    
    zf(1:10)
    
    ans =
    
       1.0e+03 *
    
        4.4550
        4.4541
        4.4523
        4.4496
        4.4460
        4.4415
        4.4361
        4.4298
        4.4226
        4.4145
    

    但是在lfilter(a, b, x, zi=None, axis=-1) 中,要获得zf,您必须提供zi。为此,您可以使用 lfilter_zi(b, x)lfilter 构造初始条件以实现阶跃响应稳态。

    z_i = lfilter_zi(b=bb, a=aa)
    y, zf = lfilter(b=bb, x=xx, a=aa, zi=z_i, axis=0)
    
    zf[1:10]
    
    [[4455. ]
     [4454.1]
     [4452.3]
     [4449.6]
     [4446. ]
     [4441.5]
     [4436.1]
     [4429.8]
     [4422.6]
     [4414.5]]
    

    【讨论】:

      【解决方案2】:

      MATLAB 和 NumPy 以不同方式处理数组形状。 NumPy 具有通用的 n 维数组。 scipy.signal.lfilter 接受一个 n 维数组,并沿输入数组的每个 1 维切片应用过滤器。 哪个 切片由axis 参数确定。默认情况下,lfilterlast 轴 (axis=-1) 上运行。你给了lfilter 一个形状为 (100, 1) 的数组。将lfilteraxis=-1 应用于该输入会应用过滤器100 次,每行长度为1 一次——当然不是你想要的!相反,您希望沿axis=0 应用过滤器(在这种二维情况下,意味着沿列应用lfilter)。如果你把lfilter的电话改成

      yy = lfilter(b=bb, a=aa, x=xx, axis=0)
      

      返回的值将与 MATLAB 代码的值匹配。

      从长远来看,我建议不要将自己局限于二维数组。在这种情况下,将xx 创建为一维数组(例如xx = np.full(100, fill_value=0.9))更有意义。然后lfilter 将以您期望的方式对给定的一维数组进行操作,而无需指定axis

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-11-13
        • 2015-01-16
        • 2015-10-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多