scipy.signal.

firwin#

scipy.signal.firwin(numtaps, cutoff, *, width=None, window='hamming', pass_zero=True, scale=True, fs=None)[源代码][源代码]#

使用窗口方法设计FIR滤波器。

此函数计算有限脉冲响应滤波器的系数。滤波器将具有线性相位;如果 numtaps 为奇数,则为 Type I,如果 numtaps 为偶数,则为 Type II。

II型滤波器在奈奎斯特频率处总是有零响应,因此如果使用偶数 numtaps 调用 firwin 并且通带的右端在奈奎斯特频率处,则会引发 ValueError 异常。

参数:
numtaps整数

滤波器的长度(系数数量,即滤波器阶数 + 1)。如果通带包含奈奎斯特频率,numtaps 必须是奇数。

截止浮点数或一维类数组

滤波器的截止频率(以与 fs 相同的单位表示)或截止频率数组(即频带边缘)。在后一种情况下,cutoff 中的频率应为正且在 0 到 fs/2 之间单调递增。cutoff 中不应包含 0 和 fs/2 的值。

宽度浮点数或无,可选

如果 width 不是 None,则假设它是过渡区域的近似宽度(以与 fs 相同的单位表示),用于 Kaiser FIR 滤波器设计。在这种情况下,window 参数被忽略。

窗口字符串或字符串和参数值的元组,可选

要使用的期望窗口。查看 scipy.signal.get_window 以获取窗口列表和所需参数。

pass_zero{True, False, ‘bandpass’, ‘lowpass’, ‘highpass’, ‘bandstop’}, 可选

如果为 True,频率为 0 时的增益(即“直流增益”)为 1。如果为 False,直流增益为 0。也可以是所需滤波器类型的字符串参数(等同于 IIR 设计函数中的 btype)。

Added in version 1.3.0: 支持字符串参数。

比例bool, 可选

设置为 True 以缩放系数,使得在某个频率下的频率响应完全为单位值。该频率可以是:

  • 如果第一个通带从0开始(即 pass_zero 为 True),则为 0 (DC)

  • fs/2`(奈奎斯特频率)如果第一个通带在 `fs/2 结束(即滤波器是单通带高通滤波器);否则为第一个通带的中心

fsfloat, 可选

信号的采样频率。cutoff 中的每个频率必须在 0 和 fs/2 之间。默认值为 2。

返回:
h(numtaps,) ndarray

长度为 numtaps 的 FIR 滤波器的系数。

Raises:
ValueError

如果 cutoff 中的任何值小于或等于 0 或大于或等于 fs/2,如果 cutoff 中的值不是严格单调递增的,或者如果 numtaps 是偶数但通带包含奈奎斯特频率。

示例

低通从 0 到 f:

>>> from scipy import signal
>>> numtaps = 3
>>> f = 0.1
>>> signal.firwin(numtaps, f)
array([ 0.06799017,  0.86401967,  0.06799017])

使用特定的窗口函数:

>>> signal.firwin(numtaps, f, window='nuttall')
array([  3.56607041e-04,   9.99286786e-01,   3.56607041e-04])

高通(从0到f的’停止’):

>>> signal.firwin(numtaps, f, pass_zero=False)
array([-0.00859313,  0.98281375, -0.00859313])

带通:

>>> f1, f2 = 0.1, 0.2
>>> signal.firwin(numtaps, [f1, f2], pass_zero=False)
array([ 0.06301614,  0.88770441,  0.06301614])

带阻滤波器:

>>> signal.firwin(numtaps, [f1, f2])
array([-0.00801395,  1.0160279 , -0.00801395])

多频段(通带为 [0, f1], [f2, f3] 和 [f4, 1]):

>>> f3, f4 = 0.3, 0.4
>>> signal.firwin(numtaps, [f1, f2, f3, f4])
array([-0.01376344,  1.02752689, -0.01376344])

多频段(通带为 [f1, f2] 和 [f3, f4]):

>>> signal.firwin(numtaps, [f1, f2, f3, f4], pass_zero=False)
array([ 0.04890915,  0.91284326,  0.04890915])