bessel#
- scipy.signal.bessel(N, Wn, btype='low', analog=False, output='ba', norm='phase', fs=None)[源代码]#
Bessel/Thomson 数字和模拟滤波器设计。
设计一个 N 阶数字或模拟 Bessel 滤波器,并返回滤波器系数。
- 参数:
- Nint
滤波器的阶数。
- Wnarray_like
一个标量或长度为 2 的序列,给出临界频率(由 norm 参数定义)。对于模拟滤波器,Wn 是角频率(例如,rad/s)。
对于数字滤波器,Wn 的单位与 fs 相同。默认情况下,fs 为 2 个半周期/样本,因此这些值从 0 到 1 进行归一化,其中 1 为奈奎斯特频率。(因此,Wn 的单位为半周期/样本。)
- btype{‘lowpass’, ‘highpass’, ‘bandpass’, ‘bandstop’}, 可选
滤波器类型。默认为 ‘lowpass’。
- analogbool, 可选
当为 True 时,返回一个模拟滤波器,否则返回一个数字滤波器。(请参阅注释。)
- output{‘ba’, ‘zpk’, ‘sos’}, 可选
输出类型:分子/分母 (‘ba’)、极零点 (‘zpk’) 或二阶节 (‘sos’)。默认为 ‘ba’。
- norm{‘phase’, ‘delay’, ‘mag’}, 可选
临界频率归一化
phase
对滤波器进行归一化,使得其相位响应在角频率(例如 rad/s)Wn 处达到中点。对于低通和高通滤波器都是如此,因此这是“相位匹配”的情况。
幅度响应的渐近线与截止频率为 Wn 的同阶 Butterworth 滤波器相同。
这是默认设置,与 MATLAB 的实现相匹配。
delay
对滤波器进行归一化,使得通带中的群延迟为 1/Wn (例如,秒)。这是通过求解 Bessel 多项式获得的“自然”类型。
mag
对滤波器进行归一化,使得增益幅度在角频率 Wn 处为 -3 dB。
在 0.18.0 版本中添加。
- fsfloat, 可选
数字系统的采样频率。
在 1.2.0 版本中添加。
- 返回:
- b, andarray, ndarray
IIR 滤波器的分子 (b) 和分母 (a) 多项式。仅当
output='ba'
时返回。- z, p, kndarray, ndarray, float
IIR 滤波器传递函数的零点、极点和系统增益。仅当
output='zpk'
时返回。- sosndarray
IIR 滤波器的二阶节表示。仅当
output='sos'
时返回。
注释
模拟 Bessel 滤波器也称为 Thomson 滤波器,具有最大平坦群延迟和最大线性相位响应,阶跃响应中的振铃非常小。[1]
Bessel 本质上是一种模拟滤波器。此函数使用双线性变换生成数字 Bessel 滤波器,该变换不会保留模拟滤波器的相位响应。因此,它仅在频率低于 fs/4 左右时才近似正确。为了在较高频率下获得最大平坦的群延迟,必须使用保留相位的技术来变换模拟 Bessel 滤波器。
有关实现细节和参考资料,请参阅
besselap
。'sos'
输出参数已在 0.16.0 中添加。参考文献
[1]Thomson, W.E., “具有最大平坦频率特性的延迟网络”,英国电气工程师学会学报,第三部分,1949 年 11 月,第 96 卷,第 44 号,第 487-490 页。
示例
绘制相位归一化频率响应,显示与 Butterworth 的截止频率(绿色)的关系
>>> 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()
以及相位中点
>>> 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()
绘制幅度归一化频率响应,显示 -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()
绘制延迟归一化滤波器,显示 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()