scipy.signal.

iirdesign#

scipy.signal.iirdesign(wp, ws, gpass, gstop, analog=False, ftype='ellip', output='ba', fs=None)[source]#

完整的 IIR 数字和模拟滤波器设计。

给定通带和阻带频率及增益,为给定基本类型构造最小阶的模拟或数字 IIR 滤波器。以分子、分母('ba')、零极点('zpk')或二阶截面('sos')形式返回输出。

参数:
wp, ws浮点数或类似数组,形状为 (2,)

通带和阻带边缘频率。可能的值是标量(用于低通和高通滤波器)或范围(用于带通和带阻滤波器)。对于数字滤波器,这些频率与 fs 单位相同。默认情况下,fs 为每采样 2 个半周期,因此这些频率被归一化为 0 到 1,其中 1 是奈奎斯特频率。例如:

  • 低通: wp = 0.2, ws = 0.3

  • 高通: wp = 0.3, ws = 0.2

  • 带通: wp = [0.2, 0.5], ws = [0.1, 0.6]

  • 带阻: wp = [0.1, 0.6], ws = [0.2, 0.5]

对于模拟滤波器,wpws 是角频率(例如,rad/s)。请注意,对于带通和带阻滤波器,通带必须严格位于阻带内部或反之。另请注意,IIR 滤波器在带边缘的截止频率定义为半功率(即 -3dB),而不是半幅度(-6dB),这与 scipy.signal.fiwin 不同。

gpass浮点数

通带中的最大损耗 (dB)。

gstop浮点数

阻带中的最小衰减 (dB)。

analog布尔值,可选

如果为 True,则返回一个模拟滤波器,否则返回一个数字滤波器。

ftype字符串,可选

要设计的 IIR 滤波器类型

  • 巴特沃斯 : ‘butter’

  • 切比雪夫 I 型 : ‘cheby1’

  • 切比雪夫 II 型 : ‘cheby2’

  • 考尔/椭圆: ‘ellip’

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

输出的滤波器形式

  • 二阶截面(推荐): ‘sos’

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

  • 零极点 : ‘zpk’

通常推荐使用二阶截面('sos')形式,因为推断分子/分母('ba')形式的系数会存在数值不稳定性。出于向后兼容性考虑,默认形式是分子/分母('ba')形式,其中 'ba' 中的 'b' 和 'a' 指的是常用的系数名称。

注意:使用二阶截面('sos')形式有时会产生额外的计算成本:对于数据密集型用例,因此建议也研究分子/分母('ba')形式。

fs浮点数,可选

数字系统的采样频率。

在版本 1.2.0 中添加。

返回:
b, andarray, ndarray

IIR 滤波器的分子 (b) 和分母 (a) 多项式。仅当 output='ba' 时返回。

z, p, kndarray, ndarray, 浮点数

IIR 滤波器传递函数的零点、极点和系统增益。仅当 output='zpk' 时返回。

sosndarray

IIR 滤波器的二阶截面表示。仅当 output='sos' 时返回。

另请参阅

butter

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

cheby1, cheby2, ellip, bessel
buttord

根据通带和阻带规格查找阶数和临界点

cheb1ord, cheb2ord, ellipord
iirfilter

使用阶数和临界频率进行通用滤波器设计

备注

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

示例

>>> import numpy as np
>>> from scipy import signal
>>> import matplotlib.pyplot as plt
>>> import matplotlib.ticker
>>> wp = 0.2
>>> ws = 0.3
>>> gpass = 1
>>> gstop = 40
>>> system = signal.iirdesign(wp, ws, gpass, gstop)
>>> w, h = signal.freqz(*system)
>>> fig, ax1 = plt.subplots()
>>> ax1.set_title('Digital filter frequency response')
>>> ax1.plot(w, 20 * np.log10(abs(h)), 'b')
>>> ax1.set_ylabel('Amplitude [dB]', color='b')
>>> ax1.set_xlabel('Frequency [rad/sample]')
>>> ax1.grid(True)
>>> ax1.set_ylim([-120, 20])
>>> ax2 = ax1.twinx()
>>> phase = np.unwrap(np.angle(h))
>>> ax2.plot(w, phase, 'g')
>>> ax2.set_ylabel('Phase [rad]', color='g')
>>> ax2.grid(True)
>>> ax2.axis('tight')
>>> ax2.set_ylim([-6, 1])
>>> nticks = 8
>>> ax1.yaxis.set_major_locator(matplotlib.ticker.LinearLocator(nticks))
>>> ax2.yaxis.set_major_locator(matplotlib.ticker.LinearLocator(nticks))
../../_images/scipy-signal-iirdesign-1.png