iircomb#
- scipy.signal.iircomb(w0, Q, ftype='notch', fs=2.0, *, pass_zero=False)[原始碼]#
設計 IIR 陷波或峰化數位梳狀濾波器。
陷波梳狀濾波器由等間隔的帶阻濾波器組成,這些濾波器具有窄頻寬(高品質因數)。每個濾波器都抑制一個窄頻帶,並使頻譜的其餘部分幾乎不變。
峰化梳狀濾波器由等間隔的帶通濾波器組成,這些濾波器具有窄頻寬(高品質因數)。每個濾波器都抑制窄頻帶之外的成分。
- 參數:
- w0float
梳狀濾波器的基本頻率(其峰值之間的間距)。這必須均勻地劃分取樣頻率。如果指定了 fs,則單位與 fs 相同。預設情況下,它是一個標準化的純量,必須滿足
0 < w0 < 1
,其中w0 = 1
對應於取樣頻率的一半。- Qfloat
品質因數。無因次參數,用於表徵陷波濾波器的 -3 dB 頻寬
bw
相對於其中心頻率,Q = w0/bw
。- ftype{‘notch’, ‘peak’}
函數產生的梳狀濾波器類型。如果為 ‘notch’,則 Q 因數適用於陷波。如果為 ‘peak’,則 Q 因數適用於峰值。預設值為 ‘notch’。
- fsfloat, optional
訊號的取樣頻率。預設值為 2.0。
- pass_zerobool, optional
如果為 False(預設值),則濾波器的陷波(零點)以頻率 [0, w0, 2*w0, …] 為中心,峰值以中點 [w0/2, 3*w0/2, 5*w0/2, …] 為中心。如果為 True,則峰值以 [0, w0, 2*w0, …] 為中心(通過零頻率),反之亦然。
在 1.9.0 版本中新增。
- 回傳:
- b, andarray, ndarray
IIR 濾波器的分子 (
b
) 和分母 (a
) 多項式。
- 引發:
- ValueError
如果 w0 小於或等於 0 或大於或等於
fs/2
,如果 fs 無法被 w0 整除,如果 ftype 不是 ‘notch’ 或 ‘peak’
註解
有關實作細節,請參閱 [1]。由於使用了單個重複極點,即使在高階情況下,梳狀濾波器的 TF 實作在數值上也是穩定的,這不會遭受精度損失。
參考文獻
[1]Sophocles J. Orfanidis, “Introduction To Signal Processing”, Prentice-Hall, 1996, ch. 11, “Digital Filter Design”
範例
設計並繪製在 200 Hz 取樣訊號下,20 Hz 的陷波梳狀濾波器,使用品質因數 Q = 30
>>> from scipy import signal >>> import matplotlib.pyplot as plt >>> import numpy as np
>>> fs = 200.0 # Sample frequency (Hz) >>> f0 = 20.0 # Frequency to be removed from signal (Hz) >>> Q = 30.0 # Quality factor >>> # Design notching comb filter >>> b, a = signal.iircomb(f0, Q, ftype='notch', fs=fs)
>>> # Frequency response >>> freq, h = signal.freqz(b, a, fs=fs) >>> response = abs(h) >>> # To avoid divide by zero when graphing >>> response[response == 0] = 1e-20 >>> # Plot >>> fig, ax = plt.subplots(2, 1, figsize=(8, 6), sharex=True) >>> ax[0].plot(freq, 20*np.log10(abs(response)), color='blue') >>> ax[0].set_title("Frequency Response") >>> ax[0].set_ylabel("Amplitude [dB]", color='blue') >>> ax[0].set_xlim([0, 100]) >>> ax[0].set_ylim([-30, 10]) >>> ax[0].grid(True) >>> ax[1].plot(freq, (np.angle(h)*180/np.pi+180)%360 - 180, color='green') >>> ax[1].set_ylabel("Phase [deg]", color='green') >>> ax[1].set_xlabel("Frequency [Hz]") >>> ax[1].set_xlim([0, 100]) >>> ax[1].set_yticks([-90, -60, -30, 0, 30, 60, 90]) >>> ax[1].set_ylim([-90, 90]) >>> ax[1].grid(True) >>> plt.show()
設計並繪製在 1000 Hz 取樣訊號下,250 Hz 的峰化梳狀濾波器,使用品質因數 Q = 30
>>> fs = 1000.0 # Sample frequency (Hz) >>> f0 = 250.0 # Frequency to be retained (Hz) >>> Q = 30.0 # Quality factor >>> # Design peaking filter >>> b, a = signal.iircomb(f0, Q, ftype='peak', fs=fs, pass_zero=True)
>>> # Frequency response >>> freq, h = signal.freqz(b, a, fs=fs) >>> response = abs(h) >>> # To avoid divide by zero when graphing >>> response[response == 0] = 1e-20 >>> # Plot >>> fig, ax = plt.subplots(2, 1, figsize=(8, 6), sharex=True) >>> ax[0].plot(freq, 20*np.log10(np.maximum(abs(h), 1e-5)), color='blue') >>> ax[0].set_title("Frequency Response") >>> ax[0].set_ylabel("Amplitude [dB]", color='blue') >>> ax[0].set_xlim([0, 500]) >>> ax[0].set_ylim([-80, 10]) >>> ax[0].grid(True) >>> ax[1].plot(freq, (np.angle(h)*180/np.pi+180)%360 - 180, color='green') >>> ax[1].set_ylabel("Phase [deg]", color='green') >>> ax[1].set_xlabel("Frequency [Hz]") >>> ax[1].set_xlim([0, 500]) >>> ax[1].set_yticks([-90, -60, -30, 0, 30, 60, 90]) >>> ax[1].set_ylim([-90, 90]) >>> ax[1].grid(True) >>> plt.show()