scipy.signal.iirdesign

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

完整的红外数字和模拟过滤设计。

给定通带和阻带的频率和增益,为给定的基本类型构造最低阶的模拟或数字IR过滤。以分子、分母(‘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)。请注意,对于带通滤波器和带阻滤波器,通带必须严格位于阻带内,反之亦然。

gpass浮动

通带内的最大损耗(DB)。

gstop浮动

阻带内的最小衰减(DB)。

analog布尔值,可选

如果为True,则返回模拟过滤,否则返回数字过滤。

ftype字符串,可选

要设计的IIR过滤的类型:

  • 巴特沃斯:“黄油”

  • 契比雪夫1:“契比1”

  • 契比雪夫2:“契比2”

  • 考尔/椭圆形:“椭圆”

  • 贝塞尔/汤姆森:“贝塞尔”

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

过滤输出形式:

  • 二阶部分(推荐):‘SOS’

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

  • 零极点:‘zpk’

一般而言,推荐使用二阶截面(‘SOS’)形式,因为推导分子/分母形式(‘ba’)的系数会受到数值不稳定性的影响。出于向后兼容的原因,默认形式是分子/分母形式(‘ba’),其中‘ba’中的‘b’和‘a’是指使用的系数的常用名称。

注意:使用二阶截面形式(‘SOS’)有时会带来额外的计算成本:因此,对于数据密集型的使用案例,建议还研究分子/分母形式(‘ba’)。

fs浮动,可选

数字系统的采样频率。

1.2.0 新版功能.

退货
b, andarray,ndarray

分子 (b )和分母 (a )过滤的多项式。仅在以下情况下返回 output='ba'

z、p、kndarray,ndarray,浮动

过滤传递函数的零点、极点和系统增益。仅在以下情况下返回 output='zpk'

sosndarray

IIR过滤的二次截面表示。仅在以下情况下返回 output=='sos'

参见

butter

过滤设计的使用顺序和关键点

cheby1, cheby2, ellip, bessel
buttord

从通带和阻带规格中查找顺序和临界点

cheb1ord, cheb2ord, ellipord
iirfilter

使用阶数和临界频率的通用过滤设计

注意事项

这个 'sos' 0.16.0中增加了输出参数。

示例

>>> 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()
>>> ax1.set_ylim([-120, 20])
>>> ax2 = ax1.twinx()
>>> angles = np.unwrap(np.angle(h))
>>> ax2.plot(w, angles, 'g')
>>> ax2.set_ylabel('Angle (radians)', color='g')
>>> ax2.grid()
>>> 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