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 的輸入,響應是常數。
給定濾波器係數 a 和 b,線性濾波器轉置直接 II 型實現的狀態空間矩陣(這是 scipy.signal.lfilter 使用的實現)為
A = scipy.linalg.companion(a).T B = b[1:] - a[1:]*b[0]
假設
a[0]
為 1.0;如果a[0]
不為 1,則 a 和 b 首先除以 a[0]。範例
以下程式碼建立一個低通 Butterworth 濾波器。 然後它將該濾波器應用於一個值全為 1.0 的陣列;輸出也全為 1.0,正如低通濾波器的預期。 如果沒有給定
lfilter
的 zi 參數,則輸出將顯示暫態訊號。>>> 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])
請注意,
lfilter
的 zi 參數是使用lfilter_zi
計算並按x[0]
縮放的。 然後輸出 y 在輸入從 0.5 下降到 0.0 之前沒有暫態。