iirdesign#
- scipy.signal.iirdesign(wp, ws, gpass, gstop, analog=False, ftype='ellip', output='ba', fs=None)[源代码]#
完成 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]
对于模拟滤波器,wp 和 ws 是角频率(例如,弧度/秒)。请注意,对于带通和带阻滤波器,通带必须严格位于阻带内部,反之亦然。另请注意,IIR 滤波器的带边缘截止定义为半功率,因此为 -3dB,而不是像 scipy.signal.fiwin 那样的半振幅 (-6dB)。
- 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'
时返回。
另请参阅
说明
'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))