scipy.signal.

iirfilter#

scipy.signal.iirfilter(N, Wn, rp=None, rs=None, btype='band', analog=False, ftype='butter', output='ba', fs=None)[source]#

给定阶数和临界点,设计 IIR 数字和模拟滤波器。

设计一个 N 阶数字或模拟滤波器并返回滤波器系数。

参数:
Nint

滤波器的阶数。

Wnarray_like

标量或长度为 2 的序列,给出临界频率。

对于数字滤波器,Wnfs 的单位相同。默认情况下,fs 为 2 个半周期/样本,因此这些频率从 0 到 1 归一化,其中 1 为奈奎斯特频率。(Wn 因此为半周期/样本。)

对于模拟滤波器,Wn 为角频率(例如,rad/s)。

当 Wn 是长度为 2 的序列时,Wn[0] 必须小于 Wn[1]

rpfloat, 可选

对于切比雪夫和椭圆滤波器,提供通带中的最大纹波。(dB)

rsfloat, 可选

对于切比雪夫和椭圆滤波器,提供阻带中的最小衰减。(dB)

btype{‘bandpass’, ‘lowpass’, ‘highpass’, ‘bandstop’}, 可选

滤波器的类型。默认值为 ‘bandpass’。

analogbool, 可选

当为 True 时,返回模拟滤波器,否则返回数字滤波器。

ftypestr, 可选

要设计的 IIR 滤波器的类型

  • 巴特沃斯 : ‘butter’

  • 切比雪夫 I : ‘cheby1’

  • 切比雪夫 II : ‘cheby2’

  • 考尔/椭圆: ‘ellip’

  • 贝塞尔/汤姆森: ‘bessel’

output{‘ba’, ‘zpk’, ‘sos’}, 可选

输出的滤波器形式

  • 二阶段(推荐):‘sos’

  • 分子/分母(默认):‘ba’

  • 零极点:‘zpk’

一般来说,二阶段 (‘sos’) 形式是推荐的,因为推断分子/分母形式 (‘ba’) 的系数存在数值不稳定性。出于向后兼容的原因,默认形式是分子/分母形式 (‘ba’) ,其中 ‘b’ 和 ‘a’ 在 ‘ba’ 中指的是通常使用的系数名称。

注意:使用二阶段形式 (‘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' 时返回。

另请参阅

butter

使用阶数和临界点进行滤波器设计

cheby1, cheby2, ellip, bessel
buttord

从通带和阻带规格中找到阶数和临界点

cheb1ord, cheb2ord, ellipord
iirdesign

使用通带和阻带规格进行通用滤波器设计

备注

'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()
../../_images/scipy-signal-iirfilter-1_00_00.png

在采样率为 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()
../../_images/scipy-signal-iirfilter-1_01_00.png