scipy.signal.

bessel#

scipy.signal.bessel(N, Wn, btype='low', analog=False, output='ba', norm='phase', fs=None)[source]#

貝索/湯姆笙數位和類比濾波器設計。

設計 N 階數位或類比貝索濾波器並傳回濾波器係數。

參數:
N整數

濾波器的階數。

Wn陣列型

一個純量或長度為 2 的序列,給定臨界頻率(由 norm 參數定義)。對於類比濾波器,Wn 是角頻率(例如,rad/s)。

對於數位濾波器,Wn 的單位與 fs 相同。預設情況下,fs 是 2 半週期/樣本,因此這些值被正規化到 0 到 1,其中 1 是奈奎斯特頻率。(因此 Wn 的單位是半週期/樣本。)

btype{‘lowpass’, ‘highpass’, ‘bandpass’, ‘bandstop’}, 選項性

濾波器的類型。預設值為 ‘lowpass’。

analog布林值, 選項性

當為 True 時,傳回類比濾波器,否則傳回數位濾波器。(請參閱「Notes」章節。)

output{‘ba’, ‘zpk’, ‘sos’}, 選項性

輸出類型:分子/分母 (‘ba’)、極零點 (‘zpk’) 或二階區段 (‘sos’)。預設值為 ‘ba’。

norm{‘phase’, ‘delay’, ‘mag’}, 選項性

臨界頻率正規化

相位

濾波器經過正規化,使得相位響應在角(例如 rad/s)頻率 Wn 達到其中點。這適用於低通和高通濾波器,因此這是「相位匹配」的情況。

幅度響應漸近線與截止頻率為 Wn 的相同階數巴特沃斯濾波器相同。

這是預設值,並且與 MATLAB 的實作相符。

延遲

濾波器經過正規化,使得通帶中的群組延遲為 1/Wn(例如,秒)。這是透過求解貝索多項式獲得的「自然」類型。

mag

濾波器經過正規化,使得增益幅度在角頻率 Wn 時為 -3 dB。

在版本 0.18.0 中新增。

fs浮點數, 選項性

數位系統的取樣頻率。

在版本 1.2.0 中新增。

傳回值:
b, andarray, ndarray

IIR 濾波器的分子 (b) 和分母 (a) 多項式。僅在 output='ba' 時傳回。

z, p, kndarray, ndarray, 浮點數

IIR 濾波器傳遞函數的零點、極點和系統增益。僅在 output='zpk' 時傳回。

sosndarray

IIR 濾波器的二階區段表示法。僅在 output='sos' 時傳回。

註解

類比貝索濾波器也稱為湯姆笙濾波器,具有最大平坦群組延遲和最大線性相位響應,在步階響應中幾乎沒有振鈴。[1]

貝索本質上是類比濾波器。此函數使用雙線性轉換產生數位貝索濾波器,這不會保留類比濾波器的相位響應。因此,它僅在頻率低於約 fs/4 時才是近似正確的。若要在較高頻率獲得最大平坦群組延遲,則必須使用保留相位的技術轉換類比貝索濾波器。

有關實作細節和參考文獻,請參閱 besselap

‘sos’ 輸出參數已在 0.16.0 中新增。

參考文獻

[1]

Thomson, W.E., “Delay Networks having Maximally Flat Frequency Characteristics”, Proceedings of the Institution of Electrical Engineers, Part III, November 1949, Vol. 96, No. 44, pp. 487-490.

範例

繪製相位正規化頻率響應,顯示與巴特沃斯截止頻率(綠色)的關係

>>> from scipy import signal
>>> import matplotlib.pyplot as plt
>>> import numpy as np
>>> b, a = signal.butter(4, 100, 'low', analog=True)
>>> w, h = signal.freqs(b, a)
>>> plt.semilogx(w, 20 * np.log10(np.abs(h)), color='silver', ls='dashed')
>>> b, a = signal.bessel(4, 100, 'low', analog=True, norm='phase')
>>> w, h = signal.freqs(b, a)
>>> plt.semilogx(w, 20 * np.log10(np.abs(h)))
>>> plt.title('Bessel filter magnitude response (with Butterworth)')
>>> plt.xlabel('Frequency [rad/s]')
>>> plt.ylabel('Amplitude [dB]')
>>> plt.margins(0, 0.1)
>>> plt.grid(which='both', axis='both')
>>> plt.axvline(100, color='green')  # cutoff frequency
>>> plt.show()
../../_images/scipy-signal-bessel-1_00_00.png

以及相位中點

>>> plt.figure()
>>> plt.semilogx(w, np.unwrap(np.angle(h)))
>>> plt.axvline(100, color='green')  # cutoff frequency
>>> plt.axhline(-np.pi, color='red')  # phase midpoint
>>> plt.title('Bessel filter phase response')
>>> plt.xlabel('Frequency [rad/s]')
>>> plt.ylabel('Phase [rad]')
>>> plt.margins(0, 0.1)
>>> plt.grid(which='both', axis='both')
>>> plt.show()
../../_images/scipy-signal-bessel-1_01_00.png

繪製幅度正規化頻率響應,顯示 -3 dB 截止

>>> b, a = signal.bessel(3, 10, 'low', analog=True, norm='mag')
>>> w, h = signal.freqs(b, a)
>>> plt.semilogx(w, 20 * np.log10(np.abs(h)))
>>> plt.axhline(-3, color='red')  # -3 dB magnitude
>>> plt.axvline(10, color='green')  # cutoff frequency
>>> plt.title('Amplitude-normalized Bessel filter frequency response')
>>> plt.xlabel('Frequency [rad/s]')
>>> plt.ylabel('Amplitude [dB]')
>>> plt.margins(0, 0.1)
>>> plt.grid(which='both', axis='both')
>>> plt.show()
../../_images/scipy-signal-bessel-1_02_00.png

繪製延遲正規化濾波器,顯示 0.1 秒時的最大平坦群組延遲

>>> b, a = signal.bessel(5, 1/0.1, 'low', analog=True, norm='delay')
>>> w, h = signal.freqs(b, a)
>>> plt.figure()
>>> plt.semilogx(w[1:], -np.diff(np.unwrap(np.angle(h)))/np.diff(w))
>>> plt.axhline(0.1, color='red')  # 0.1 seconds group delay
>>> plt.title('Bessel filter group delay')
>>> plt.xlabel('Frequency [rad/s]')
>>> plt.ylabel('Group delay [s]')
>>> plt.margins(0, 0.1)
>>> plt.grid(which='both', axis='both')
>>> plt.show()
../../_images/scipy-signal-bessel-1_03_00.png