scipy.signal.

bessel#

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

贝塞尔/汤姆逊数字和模拟滤波器设计。

设计一个 N 阶数字或模拟贝塞尔滤波器并返回滤波器系数。

参数:
Nint

滤波器的阶数。

Wnarray_like

给定临界频率(由 norm 参数定义)的标量或长度为 2 的序列。对于模拟滤波器,Wn 为角频率(例如,弧度/秒)。

对于数字滤波器,Wnfs 使用相同的单位。默认情况下,fs 为 2 半个周期/采样,因此它们从 0 到 1 归一化,其中 1 为奈奎斯频率。(因此 Wn 以半个周期/采样为单位。)

btype{‘lowpass’, ‘highpass’, ‘bandpass’, ‘bandstop’}, optional

滤波器的类型。默认为“lowpass”。

analog布尔值,可选

如果为 True,则返回一个模拟滤波器,否则返回一个数字滤波器。(参见注释。)

output{‘ba’, ‘zpk’, ‘sos’},可选

输出类型:分子/分母 (‘ba’)、极点零点 (‘zpk’)、或二阶部分 (‘sos’)。默认为 ‘ba’。

norm{‘phase’,‘delay’,‘mag’},可选

临界频率归一化

phase

滤波器归一化使得相位响应在角频率Wn处达到其中点。对于低通滤波器和高通滤波器来说都是如此,所以这是“相位匹配”的情况。

幅频响应渐近线与具有截断Wn的同阶巴特沃斯滤波器相同。

这是默认值,并且与 MATLAB 的实现相匹配。

delay

滤波器归一化使得通带中的群延迟为 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.,“具有最大平坦频率响应的延迟网络”,电气工程师学会会议记录,第三部分,1949 年 11 月,第 96 卷,第 44 期,第 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 [radians / second]')
>>> 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 [radians / second]')
>>> plt.ylabel('Phase [radians]')
>>> 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('Magnitude-normalized Bessel filter frequency response')
>>> plt.xlabel('Frequency [radians / second]')
>>> 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 [radians / second]')
>>> plt.ylabel('Group delay [seconds]')
>>> plt.margins(0, 0.1)
>>> plt.grid(which='both', axis='both')
>>> plt.show()
../../_images/scipy-signal-bessel-1_03_00.png