lfilter#
- scipy.signal.lfilter(b, a, x, axis=-1, zi=None)[source]#
使用 IIR 或 FIR 濾波器沿一維過濾資料。
使用數位濾波器過濾資料序列 x。這適用於許多基本資料類型(包括 Object 類型)。此濾波器是標準差分方程式的直接 II 型轉置實現(請參閱「註解」)。
對於大多數濾波任務,應優先使用函式
sosfilt
(以及使用output='sos'
的濾波器設計)而不是lfilter
,因為二階sections具有較少的數值問題。- 參數:
- b陣列型
1 維序列中的分子係數向量。
- a陣列型
1 維序列中的分母係數向量。如果
a[0]
不是 1,則 a 和 b 都會被a[0]
正規化。- x陣列型
N 維輸入陣列。
- axis整數,選填
要沿其應用線性濾波器的輸入資料陣列軸。濾波器會應用於沿此軸的每個子陣列。預設值為 -1。
- zi陣列型,選填
濾波器延遲的初始條件。它是一個向量(或 N 維輸入的向量陣列),長度為
max(len(a), len(b)) - 1
。如果 zi 為 None 或未給定,則假設初始靜止狀態。請參閱lfiltic
以取得更多資訊。
- 回傳:
- y陣列
數位濾波器的輸出。
- zf陣列,選填
如果 zi 為 None,則不會回傳此值,否則,zf 會保存最終的濾波器延遲值。
另請參閱
lfiltic
為
lfilter
建構初始條件。lfilter_zi
為
lfilter
計算初始狀態(步階響應的穩態)。filtfilt
一種前向-後向濾波器,用於獲得零相位濾波器。
savgol_filter
Savitzky-Golay 濾波器。
sosfilt
使用級聯二階sections過濾資料。
sosfiltfilt
使用二階sections的前向-後向濾波器。
註解
濾波器函式以直接 II 型轉置結構實現。這表示濾波器實現了
a[0]*y[n] = b[0]*x[n] + b[1]*x[n-1] + ... + b[M]*x[n-M] - a[1]*y[n-1] - ... - a[N]*y[n-N]
其中 M 是分子的階數,N 是分母的階數,n 是樣本編號。它使用以下差分方程式實現(假設 M = N)
a[0]*y[n] = b[0] * x[n] + d[0][n-1] d[0][n] = b[1] * x[n] - a[1] * y[n] + d[1][n-1] d[1][n] = b[2] * x[n] - a[2] * y[n] + d[2][n-1] ... d[N-2][n] = b[N-1]*x[n] - a[N-1]*y[n] + d[N-1][n-1] d[N-1][n] = b[N] * x[n] - a[N] * y[n]
其中 d 是狀態變數。
在 z 轉換域中描述此濾波器的有理傳遞函數為
-1 -M b[0] + b[1]z + ... + b[M] z Y(z) = -------------------------------- X(z) -1 -N a[0] + a[1]z + ... + a[N] z
範例
產生要過濾的雜訊訊號
>>> import numpy as np >>> from scipy import signal >>> import matplotlib.pyplot as plt >>> rng = np.random.default_rng() >>> t = np.linspace(-1, 1, 201) >>> x = (np.sin(2*np.pi*0.75*t*(1-t) + 2.1) + ... 0.1*np.sin(2*np.pi*1.25*t + 1) + ... 0.18*np.cos(2*np.pi*3.85*t)) >>> xn = x + rng.standard_normal(len(t)) * 0.08
建立 3 階低通巴特沃斯濾波器
>>> b, a = signal.butter(3, 0.05)
將濾波器應用於 xn。使用 lfilter_zi 選擇濾波器的初始條件
>>> zi = signal.lfilter_zi(b, a) >>> z, _ = signal.lfilter(b, a, xn, zi=zi*xn[0])
再次應用濾波器,以獲得與 filtfilt 相同階數的過濾結果
>>> z2, _ = signal.lfilter(b, a, z, zi=zi*z[0])
使用 filtfilt 應用濾波器
>>> y = signal.filtfilt(b, a, xn)
繪製原始訊號和各種過濾版本的圖表
>>> plt.figure >>> plt.plot(t, xn, 'b', alpha=0.75) >>> plt.plot(t, z, 'r--', t, z2, 'r', t, y, 'k') >>> plt.legend(('noisy signal', 'lfilter, once', 'lfilter, twice', ... 'filtfilt'), loc='best') >>> plt.grid(True) >>> plt.show()