bessel#
- scipy.signal.bessel(N, Wn, btype='low', analog=False, output='ba', norm='phase', fs=None)[source]#
贝塞尔/汤姆逊数字和模拟滤波器设计。
设计一个 N 阶数字或模拟贝塞尔滤波器并返回滤波器系数。
- 参数:
- Nint
滤波器的阶数。
- Wnarray_like
给定临界频率(由 norm 参数定义)的标量或长度为 2 的序列。对于模拟滤波器,Wn 为角频率(例如,弧度/秒)。
对于数字滤波器,Wn 与 fs 使用相同的单位。默认情况下,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
以了解实施细节和参考文献。
输出参数已在 0.16.0 中添加。'sos'
参考文献
[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()
和相位中点
>>> 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()
绘制幅度归一化频率响应,显示 -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()
绘制延迟归一化滤波器,显示在 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()