簡體   English   中英

使用 python 評估過濾器 matlab function

[英]Evaluate filter matlab function using python

根據這兩個函數的描述, filter(b, a, x) matlab function 和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)
     

MATLAB 和 NumPy 處理數組形狀的方式不同。 NumPy 具有一般 n 維scipy.signal.lfilter接受一個 n 維數組,並沿輸入數組的每個一維切片應用過濾器。 哪個切片由axis參數決定。 默認情況下, lfilter最后一個軸 ( axis=-1 ) 上運行。 你給了lfilter一個形狀為 (100, 1) 的數組。 將帶有axis=-1lfilter應用於該輸入應用過濾器 100 次,每行長度為 1 一次——當然不是你想要的,相反,你想沿axis=0應用過濾器(在這個 2-d情況下,意味着沿列應用lfilter )。 如果將lfilter的調用更改為

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

返回的值將匹配 MATLAB 代碼的值。

從長遠來看,我建議不要將自己局限於二維 arrays。在這種情況下,將xx創建為一維數組更有意義(例如xx = np.full(100, fill_value=0.9) )。 然后lfilter將按照您期望的方式對給定的一維數組進行操作,而無需指定axis

@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]]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM