scipy.signal.

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’

參見

iirnotch
iirpeak

註解

有關實作細節,請參閱 [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()
../../_images/scipy-signal-iircomb-1_00_00.png

設計並繪製在 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()
../../_images/scipy-signal-iircomb-1_01_00.png