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 或未給定,則假定初始靜止狀態(即全零)。請注意,這些初始條件與lfiltic
或lfilter_zi
給出的初始條件不相同。
- 返回:
- yndarray
數位濾波器的輸出。
- zfndarray,可選
如果 zi 為 None,則不返回此值,否則 zf 保存最終濾波器延遲值。
參見
註解
濾波器函數實現為一系列具有直接 II 型轉置結構的二階濾波器。它旨在最大程度地減少高階濾波器的數值精度誤差。
在版本 0.16.0 中新增。
範例
繪製一個 13 階濾波器的脈衝響應,同時使用
lfilter
和sosfilt
,顯示嘗試在單個階段執行 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()