scipy.signal.

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]

對於類比濾波器,wpws 是角頻率(例如,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' 時傳回。

另請參閱

butter

使用階數和臨界點的濾波器設計

cheby1, cheby2, ellip, bessel
buttord

從通帶和阻帶規格尋找階數和臨界點

cheb1ord, cheb2ord, ellipord
iirfilter

使用階數和臨界頻率的通用濾波器設計

註解

'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))
../../_images/scipy-signal-iirdesign-1.png