scipy.signal.

sosfilt#

scipy.signal.sosfilt(sos, x, axis=-1, zi=None)[原始碼]#

使用級聯二階區段沿一個維度過濾資料。

使用由 sos 定義的數位 IIR 濾波器過濾資料序列 x

參數:
sosarray_like

二階濾波器係數陣列,必須具有形狀 (n_sections, 6)。每行對應一個二階區段,前三列提供分子係數,後三列提供分母係數。

xarray_like

N 維輸入陣列。

axisint,可選

輸入資料陣列中要沿其應用線性濾波器的軸。濾波器應用於沿此軸的每個子陣列。預設值為 -1。

ziarray_like,可選

級聯濾波器延遲的初始條件。它是一個(至少 2D)形狀為 (n_sections, ..., 2, ...) 的向量,其中 ..., 2, ... 表示 x 的形狀,但 x.shape[axis] 替換為 2。如果 zi 為 None 或未給定,則假定初始靜止狀態(即全零)。請注意,這些初始條件與 lfilticlfilter_zi 給出的初始條件相同。

返回:
yndarray

數位濾波器的輸出。

zfndarray,可選

如果 zi 為 None,則不返回此值,否則 zf 保存最終濾波器延遲值。

註解

濾波器函數實現為一系列具有直接 II 型轉置結構的二階濾波器。它旨在最大程度地減少高階濾波器的數值精度誤差。

在版本 0.16.0 中新增。

範例

繪製一個 13 階濾波器的脈衝響應,同時使用 lfiltersosfilt,顯示嘗試在單個階段執行 13 階濾波器所導致的不穩定性(數值誤差將一些極點推到單位圓之外)

>>> import matplotlib.pyplot as plt
>>> from scipy import signal
>>> b, a = signal.ellip(13, 0.009, 80, 0.05, output='ba')
>>> sos = signal.ellip(13, 0.009, 80, 0.05, output='sos')
>>> x = signal.unit_impulse(700)
>>> y_tf = signal.lfilter(b, a, x)
>>> y_sos = signal.sosfilt(sos, x)
>>> plt.plot(y_tf, 'r', label='TF')
>>> plt.plot(y_sos, 'k', label='SOS')
>>> plt.legend(loc='best')
>>> plt.show()
../../_images/scipy-signal-sosfilt-1.png