當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


Python SciPy signal.sosfiltfilt用法及代碼示例


本文簡要介紹 python 語言中 scipy.signal.sosfiltfilt 的用法。

用法:

scipy.signal.sosfiltfilt(sos, x, axis=-1, padtype='odd', padlen=None)#

使用級聯二階部分的 forward-backward 數字濾波器。

有關此方法的更多完整信息,請參閱 filtfilt

參數

sos array_like

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

x array_like

要過濾的數據數組。

axis 整數,可選

應用過濾器的 x 軸。默認值為 -1。

padtype str 或無,可選

必須是‘odd’, ‘even’, ‘constant’,或無。這決定了用於應用濾波器的填充信號的擴展類型。如果 padtype 為 None,則不使用填充。默認值為‘odd’。

padlen int 或無,可選

要擴展的元素數x在兩端在應用過濾器之前。該值必須小於x.shape[axis] - 1.padlen=0意味著沒有填充。默認值為:

3 * (2 * len(sos) + 1 - min((sos[:, 2] == 0).sum(),
                            (sos[:, 5] == 0).sum()))

最後的額外減法試圖補償原點處的極點和零點(例如,對於odd-order 過濾器)以產生等效估計帕倫對那些scipy.signal.filtfilt對於用構建的二階部分濾波器scipy.signal職能。

返回

y ndarray

與 x 形狀相同的過濾輸出。

注意

例子

>>> import numpy as np
>>> from scipy.signal import sosfiltfilt, butter
>>> import matplotlib.pyplot as plt
>>> rng = np.random.default_rng()

創建一個有趣的信號進行過濾。

>>> n = 201
>>> t = np.linspace(0, 1, n)
>>> x = 1 + (t < 0.5) - 0.25*t**2 + 0.05*rng.standard_normal(n)

創建一個低通巴特沃斯濾波器,並用它來過濾 x。

>>> sos = butter(4, 0.125, output='sos')
>>> y = sosfiltfilt(sos, x)

為了比較,使用 8 階濾波器scipy.signal.sosfilt.使用前四個值的平均值初始化過濾器x.

>>> from scipy.signal import sosfilt, sosfilt_zi
>>> sos8 = butter(8, 0.125, output='sos')
>>> zi = x[:4].mean() * sosfilt_zi(sos8)
>>> y2, zo = sosfilt(sos8, x, zi=zi)

繪製結果。請注意,y 的相位與輸入相匹配,而 y2 具有顯著的相位延遲。

>>> plt.plot(t, x, alpha=0.5, label='x(t)')
>>> plt.plot(t, y, label='y(t)')
>>> plt.plot(t, y2, label='y2(t)')
>>> plt.legend(framealpha=1, shadow=True)
>>> plt.grid(alpha=0.25)
>>> plt.xlabel('t')
>>> plt.show()
scipy-signal-sosfiltfilt-1.png

相關用法


注:本文由純淨天空篩選整理自scipy.org大神的英文原創作品 scipy.signal.sosfiltfilt。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。