iirfilter#
- scipy.signal.iirfilter(N, Wn, rp=None, rs=None, btype='band', analog=False, ftype='butter', output='ba', fs=None)[源代码][源代码]#
给定阶数和关键点的IIR数字和模拟滤波器设计。
设计一个N阶数字或模拟滤波器并返回滤波器系数。
- 参数:
- N整数
过滤器的顺序。
- Wnarray_like
一个标量或长度为2的序列,给出临界频率。
对于数字滤波器,Wn 的单位与 fs 相同。默认情况下,fs 是 2 个半周期/样本,因此这些值从 0 到 1 归一化,其中 1 是奈奎斯特频率。(因此 Wn 是以半周期/样本为单位。)
对于模拟滤波器,Wn 是角频率(例如,弧度/秒)。
当 Wn 是一个长度为2的序列时,
Wn[0]必须小于Wn[1]。- rpfloat, 可选
对于切比雪夫和椭圆滤波器,提供通带中的最大波纹。(dB)
- rsfloat, 可选
对于切比雪夫和椭圆滤波器,提供在阻带中的最小衰减。(dB)
- btype{‘带通’, ‘低通’, ‘高通’, ‘带阻’}, 可选
过滤器的类型。默认是 ‘带通’。
- 模拟bool, 可选
当为 True 时,返回一个模拟滤波器,否则返回一个数字滤波器。
- ftypestr, 可选
要设计的IIR滤波器的类型:
Butterworth : ‘butter’
切比雪夫 I 型 : ‘cheby1’
切比雪夫 II : ‘cheby2’
Cauer/椭圆:’ellip’
贝塞尔/汤姆森: ‘bessel’
- 输出{‘ba’, ‘zpk’, ‘sos’}, 可选
输出过滤形式:
二级章节(推荐):’sos’
分子/分母 (默认) : ‘ba’
pole-zero : ‘zpk’
通常推荐使用二阶节 (‘sos’) 形式,因为推导分子/分母形式 (‘ba’) 的系数会遇到数值不稳定性问题。出于向后兼容性的原因,默认形式是分子/分母形式 (‘ba’),其中 ‘ba’ 中的 ‘b’ 和 ‘a’ 指的是常用的系数名称。
注意:使用二阶节形式(’sos’)有时会带来额外的计算成本:因此,对于数据密集型用例,建议也研究分子/分母形式(’ba’)。
- 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'时返回。
参见
注释
'sos'输出参数在 0.16.0 版本中被添加。示例
生成一个从50 Hz到200 Hz的17阶切比雪夫II型模拟带通滤波器,并绘制频率响应:
>>> import numpy as np >>> from scipy import signal >>> import matplotlib.pyplot as plt
>>> b, a = signal.iirfilter(17, [2*np.pi*50, 2*np.pi*200], rs=60, ... btype='band', analog=True, ftype='cheby2') >>> w, h = signal.freqs(b, a, 1000) >>> fig = plt.figure() >>> ax = fig.add_subplot(1, 1, 1) >>> ax.semilogx(w / (2*np.pi), 20 * np.log10(np.maximum(abs(h), 1e-5))) >>> ax.set_title('Chebyshev Type II bandpass frequency response') >>> ax.set_xlabel('Frequency [Hz]') >>> ax.set_ylabel('Amplitude [dB]') >>> ax.axis((10, 1000, -100, 10)) >>> ax.grid(which='both', axis='both') >>> plt.show()
在采样率为2000 Hz的系统中创建一个具有相同属性的数字滤波器,并绘制频率响应。(需要使用二阶节实现以确保此阶滤波器的稳定性):
>>> sos = signal.iirfilter(17, [50, 200], rs=60, btype='band', ... analog=False, ftype='cheby2', fs=2000, ... output='sos') >>> w, h = signal.sosfreqz(sos, 2000, fs=2000) >>> fig = plt.figure() >>> ax = fig.add_subplot(1, 1, 1) >>> ax.semilogx(w, 20 * np.log10(np.maximum(abs(h), 1e-5))) >>> ax.set_title('Chebyshev Type II bandpass frequency response') >>> ax.set_xlabel('Frequency [Hz]') >>> ax.set_ylabel('Amplitude [dB]') >>> ax.axis((10, 1000, -100, 10)) >>> ax.grid(which='both', axis='both') >>> plt.show()