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]
对于模拟滤波器, wp 和 ws 角频率(例如,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'
。
参见
注意事项
这个
'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))