scipy.signal.

lfilter_zi#

scipy.signal.lfilter_zi(b, a)[source]#

為步階響應穩態建構 lfilter 的初始條件。

lfilter 函數計算初始狀態 zi,其對應於步階響應的穩態。

此函數的典型用途是設定初始狀態,使濾波器的輸出從要濾波訊號的第一個元素的值開始。

參數:
b, aarray_like (1-D)

IIR 濾波器係數。 有關更多資訊,請參閱 lfilter

返回:
zi1-D ndarray

濾波器的初始狀態。

註解

階數為 m 的線性濾波器具有狀態空間表示法 (A, B, C, D),其中濾波器的輸出 y 可以表示為

z(n+1) = A*z(n) + B*x(n)
y(n)   = C*z(n) + D*x(n)

其中 z(n) 是長度為 m 的向量,A 的形狀為 (m, m),B 的形狀為 (m, 1),C 的形狀為 (1, m),D 的形狀為 (1, 1)(假設 x(n) 是純量)。 lfilter_zi 求解

zi = A*zi + B

換句話說,它找到初始條件,對於所有為 1 的輸入,響應是常數。

給定濾波器係數 ab,線性濾波器轉置直接 II 型實現的狀態空間矩陣(這是 scipy.signal.lfilter 使用的實現)為

A = scipy.linalg.companion(a).T
B = b[1:] - a[1:]*b[0]

假設 a[0] 為 1.0;如果 a[0] 不為 1,則 ab 首先除以 a[0]。

範例

以下程式碼建立一個低通 Butterworth 濾波器。 然後它將該濾波器應用於一個值全為 1.0 的陣列;輸出也全為 1.0,正如低通濾波器的預期。 如果沒有給定 lfilterzi 參數,則輸出將顯示暫態訊號。

>>> from numpy import array, ones
>>> from scipy.signal import lfilter, lfilter_zi, butter
>>> b, a = butter(5, 0.25)
>>> zi = lfilter_zi(b, a)
>>> y, zo = lfilter(b, a, ones(10), zi=zi)
>>> y
array([1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.])

另一個範例

>>> x = array([0.5, 0.5, 0.5, 0.0, 0.0, 0.0, 0.0])
>>> y, zf = lfilter(b, a, x, zi=zi*x[0])
>>> y
array([ 0.5       ,  0.5       ,  0.5       ,  0.49836039,  0.48610528,
    0.44399389,  0.35505241])

請注意,lfilterzi 參數是使用 lfilter_zi 計算並按 x[0] 縮放的。 然後輸出 y 在輸入從 0.5 下降到 0.0 之前沒有暫態。