iirfilter#
- scipy.signal.iirfilter(N, Wn, rp=None, rs=None, btype='band', analog=False, ftype='butter', output='ba', fs=None)[源代码]#
根据给定的阶数和临界频率进行 IIR 数字和模拟滤波器设计。
设计一个 N 阶数字或模拟滤波器,并返回滤波器系数。
- 参数:
- Nint
滤波器的阶数。
- Wnarray_like
标量或长度为 2 的序列,表示临界频率。
对于数字滤波器,Wn 的单位与 fs 相同。默认情况下,fs 为2个半周期/采样,因此它们被归一化到0到1,其中1是奈奎斯特频率。(Wn 因此以半周期/采样为单位。)
对于模拟滤波器,Wn 是角频率(例如,rad/s)。
当 Wn 为长度为 2 的序列时,
Wn[0]必须小于Wn[1]。- rpfloat, 可选
对于切比雪夫(Chebyshev)和椭圆(Elliptic)滤波器,提供通带中的最大纹波。(单位:dB)
- rsfloat, 可选
对于切比雪夫(Chebyshev)和椭圆(Elliptic)滤波器,提供阻带中的最小衰减。(单位:dB)
- btype{‘bandpass’, ‘lowpass’, ‘highpass’, ‘bandstop’}, 可选
滤波器类型。默认为 ‘bandpass’(带通)。
- analogbool, optional
当为True时,返回模拟滤波器,否则返回数字滤波器。
- ftypestr, 可选
要设计的 IIR 滤波器类型
巴特沃斯(Butterworth): ‘butter’
切比雪夫 I 型(Chebyshev I): ‘cheby1’
切比雪夫 II 型(Chebyshev II): ‘cheby2’
考尔/椭圆(Cauer/elliptic): ‘ellip’
贝塞尔/汤姆森(Bessel/Thomson): ‘bessel’
- output{‘ba’, ‘zpk’, ‘sos’}, optional
输出的滤波器形式
二阶节(推荐): ‘sos’
分子/分母(默认): ‘ba’
零极点: ‘zpk’
通常建议使用二阶节(‘sos’)形式,因为推导分子/分母形式(‘ba’)的系数容易产生数值不稳定性。出于向后兼容性的原因,默认形式仍为分子/分母形式(‘ba’),其中‘ba’中的 ‘b’ 和 ‘a’ 指的是系数的常用名称。
注意:使用二阶节形式(‘sos’)有时会增加额外的计算成本:因此对于数据密集型的用例,建议同时评估分子/分母形式(‘ba’)。
- fsfloat,可选
数字系统的采样频率。
在 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版本中添加的。当前的行为是
ndarray输出具有64位精度(float64或complex128),无论 Wn 的dtype如何,但未来的版本中输出可能会遵循 Wn 的dtype。数组 API 标准支持
iirfilter除了 NumPy 之外,还实验性地支持兼容 Python 数组 API 标准的后端。请考虑通过设置环境变量SCIPY_ARRAY_API=1并提供 CuPy、PyTorch、JAX 或 Dask 数组作为数组参数来测试这些功能。目前支持后端与设备(或其他功能)的多种组合。库
CPU
GPU
NumPy
✅
不适用
CuPy
不适用
✅
PyTorch
✅
✅
JAX
⚠️ 无 JIT
⛔
Dask
⚠️ 计算图
不适用
有关更多信息,请参阅 对数组 API 标准的支持。
示例
生成一个 17 阶切比雪夫 II 型模拟带通滤波器(50 Hz 到 200 Hz)并绘制其频率响应。
>>> 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.freqz_sos(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()