根據這兩個函式的描述,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)
uj5u.com熱心網友回復:
MATLAB 和 NumPy 處理陣列形狀的方式不同。NumPy 具有通用的 n 維陣列。 scipy.signal.lfilter接受一個 n 維陣列,并沿輸入陣列的每個一維切片應用過濾器。 哪個切片由axis引數決定。默認情況下,lfilter在最后一個軸 ( axis=-1) 上操作。你給出了lfilter一個形狀為 (100, 1) 的陣列。對該輸入應用lfilterwithaxis=-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.
uj5u.com熱心網友回復:
@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]]
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/318508.html
