iirdesign#
- scipy.signal.iirdesign(wp, ws, gpass, gstop, analog=False, ftype='ellip', output='ba', fs=None)[原始碼]#
完整的 IIR 數位和類比濾波器設計。
給定通帶和阻帶頻率以及增益,為給定的基本類型建構最小階數的類比或數位 IIR 濾波器。以分子、分母 ('ba')、極零點 ('zpk') 或二階區段 ('sos') 形式傳回輸出。
- 參數:
- wp, wsfloat 或類陣列,形狀 (2,)
通帶和阻帶邊緣頻率。可能的值為純量(用於低通和高通濾波器)或範圍(用於帶通和帶阻濾波器)。對於數位濾波器,這些單位與 fs 相同。預設情況下,fs 為 2 半週期/樣本,因此這些值已正規化為 0 到 1,其中 1 為奈奎斯特頻率。例如
低通:wp = 0.2, ws = 0.3
高通:wp = 0.3, ws = 0.2
帶通:wp = [0.2, 0.5], ws = [0.1, 0.6]
帶阻:wp = [0.1, 0.6], ws = [0.2, 0.5]
對於類比濾波器,wp 和 ws 是角頻率(例如,rad/s)。請注意,對於帶通和帶阻濾波器,通帶必須嚴格位於阻帶內部或反之亦然。另請注意,IIR 濾波器的頻帶邊緣截止定義為半功率,因此為 -3dB,而不是像 scipy.signal.fiwin 那樣的半振幅 (-6dB)。
- gpassfloat
通帶中的最大衰減 (dB)。
- gstopfloat
阻帶中的最小衰減 (dB)。
- analogbool,選用
若為 True,則傳回類比濾波器,否則傳回數位濾波器。
- ftypestr,選用
要設計的 IIR 濾波器類型
Butterworth : ‘butter’
Chebyshev I : ‘cheby1’
Chebyshev II : ‘cheby2’
Cauer/elliptic: ‘ellip’
- output{‘ba’, ‘zpk’, ‘sos’},選用
輸出的濾波器形式
二階區段(建議):‘sos’
分子/分母(預設):‘ba’
極零點:‘zpk’
一般來說,建議使用二階區段 ('sos') 形式,因為推斷分子/分母形式 ('ba') 的係數會受到數值不穩定性的影響。基於向後相容性的考量,預設形式是分子/分母形式 ('ba'),其中 'ba' 中的 'b' 和 'a' 指的是常用的係數名稱。
注意:使用二階區段形式 ('sos') 有時會產生額外的計算成本:對於資料密集型用例,因此建議也研究分子/分母形式 ('ba')。
- fsfloat,選用
數位系統的取樣頻率。
在 1.2.0 版本中新增。
- 傳回值:
- b, andarray,ndarray
IIR 濾波器的分子 (b) 和分母 (a) 多項式。僅在
output='ba'
時傳回。- z, p, kndarray,ndarray,float
IIR 濾波器傳遞函數的零點、極點和系統增益。僅在
output='zpk'
時傳回。- sosndarray
IIR 濾波器的二階區段表示法。僅在
output='sos'
時傳回。
另請參閱
註解
'sos'
輸出參數在 0.16.0 版本中新增。範例
>>> import numpy as np >>> from scipy import signal >>> import matplotlib.pyplot as plt >>> import matplotlib.ticker
>>> wp = 0.2 >>> ws = 0.3 >>> gpass = 1 >>> gstop = 40
>>> system = signal.iirdesign(wp, ws, gpass, gstop) >>> w, h = signal.freqz(*system)
>>> fig, ax1 = plt.subplots() >>> ax1.set_title('Digital filter frequency response') >>> ax1.plot(w, 20 * np.log10(abs(h)), 'b') >>> ax1.set_ylabel('Amplitude [dB]', color='b') >>> ax1.set_xlabel('Frequency [rad/sample]') >>> ax1.grid(True) >>> ax1.set_ylim([-120, 20]) >>> ax2 = ax1.twinx() >>> phase = np.unwrap(np.angle(h)) >>> ax2.plot(w, phase, 'g') >>> ax2.set_ylabel('Phase [rad]', color='g') >>> ax2.grid(True) >>> ax2.axis('tight') >>> ax2.set_ylim([-6, 1]) >>> nticks = 8 >>> ax1.yaxis.set_major_locator(matplotlib.ticker.LinearLocator(nticks)) >>> ax2.yaxis.set_major_locator(matplotlib.ticker.LinearLocator(nticks))