scipy.signal.bessel¶
- scipy.signal.bessel(N, Wn, btype='low', analog=False, output='ba', norm='phase', fs=None)[源代码]¶
贝塞尔/汤姆森数字和模拟过滤设计。
设计一个N阶数字或模拟贝塞尔过滤,并返回过滤系数。
- 参数
- N集成
过滤勋章。
- Wnarray_like
给出临界频率的标量或长度序列(由 norm 参数)。对于模拟滤波器, Wn 是角频率(例如,rad/s)。
对于数字滤波器, Wn 都在相同的单位内 fs 。默认情况下, fs 为2个半周期/采样,因此这些值从0归一化到1,其中1是奈奎斯特频率。 (Wn 因此是半周期/样品。)
- btype{‘低通’,‘高通’,‘带通’,‘带停止’},可选
过滤的类型。默认值为‘low pass’。
- analog布尔值,可选
如果为True,则返回模拟过滤,否则返回数字过滤。(请参见备注。)
- output{‘ba’,‘zpk’,‘sos’},可选
输出类型:分子/分母(‘ba’)、零极点(‘zpk’)或二阶截面(‘sos’)。默认值为“ba”。
- norm{‘阶段’,‘延迟’,‘料盒’},可选
临界频率归一化:
phase
过滤被归一化,使得相位响应以角频率(例如,rad/s)到达其中点 Wn 。低通和高通滤波器都会发生这种情况,所以这就是“相位匹配”的情况。
震级响应渐近线与同阶的巴特沃斯过滤相同,截止值为 Wn 。
这是默认设置,与MATLAB的实现相匹配。
delay
对过滤进行归一化,使得通带中的群延时为1/`Wn‘(例如秒)。这是通过求解贝塞尔多项式得到的“自然”类型。
mag
过滤经过归一化处理,使得角频率下的增益幅度为-3dB Wn 。
0.18.0 新版功能.
- fs浮动,可选
数字系统的采样频率。
1.2.0 新版功能.
- 退货
- b, andarray,ndarray
分子 (b )和分母 (a )过滤的多项式。仅在以下情况下返回
output='ba'
。- z、p、kndarray,ndarray,浮动
过滤传递函数的零点、极点和系统增益。仅在以下情况下返回
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
>>> 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()