scipy.signal.

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' 时返回。

另请参阅

butter

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

cheby1, cheby2, ellip, bessel
buttord

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

cheb1ord, cheb2ord, ellipord
iirdesign

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

附注

'sos' 输出参数是在0.16.0版本中添加的。

当前的行为是 ndarray 输出具有64位精度(float64complex128),无论 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()
../../_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.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()
../../_images/scipy-signal-iirfilter-1_01_00.png