scipy.signal.

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,則 ab 都會被 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()
../../_images/scipy-signal-lfilter-1.png