scipy.signal.

贝塞尔#

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

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

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

参数:
N整数

过滤器的顺序。

Wnarray_like

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

对于数字滤波器,Wn 的单位与 fs 相同。默认情况下,fs 是 2 个半周期/样本,因此这些值从 0 到 1 归一化,其中 1 是奈奎斯特频率。(因此,Wn 是以半周期/样本为单位。)

btype{‘低通’, ‘高通’, ‘带通’, ‘带阻’}, 可选

过滤器的类型。默认是 ‘低通’。

模拟bool, 可选

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

输出{‘ba’, ‘zpk’, ‘sos’}, 可选

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

规范{‘相位’, ‘延迟’, ‘幅度’}, 可选

临界频率归一化:

phase

滤波器被归一化,使得相位响应在角频率(例如,弧度/秒)`Wn` 处达到其中点。这对低通和高通滤波器都适用,因此这是“相位匹配”的情况。

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

这是默认设置,与 MATLAB 的实现相匹配。

delay

该滤波器被归一化,使得通带中的群延迟为 1/`Wn`(例如,秒)。这是通过求解贝塞尔多项式得到的“自然”类型。

mag

该滤波器被归一化,使得在角频率 Wn 处增益幅度为 -3 dB。

Added in version 0.18.0.

fsfloat, 可选

数字系统的采样频率。

Added in version 1.2.0.

返回:
b, andarray, ndarray

IIR 滤波器的分子多项式(b)和分母多项式(a)。仅当 output='ba' 时返回。

z, p, kndarray, ndarray, float

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