scipy 窗函数进行设计FIR滤波器

method1:给定截止频率

接口:

scipy.signal.firwin(numtaps, cutoff, width=None, window=‘hamming’, pass_zero=True, scale=True, nyq=None, fs=None)[source]
FIR滤波器设计采用窗口法。
这个函数计算一个有限脉冲响应滤波器的系数。滤波器会有线性相位;如果numtaps是奇数则为Type I,如果numtaps是偶数则为Type II。
Type II过滤器在Nyquist频率处总是响应为零,因此,如果在numtap为偶数的情况下调用firwin并具有右端位于Nyquist频率的通带,则会引发ValueError异常。


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


cutoff: float或1-D array_like
滤波器截止频率(单位与fs相同)或截止频率数组(即带边)。在后一种情况下,截止频率应该是正的,并且在0到fs/2之间单调增加。值0和fs/2不能包含在cutoff中。


width:float或None,optional
如果width不是None,那么假设它是Kaiser FIR滤波器设计中使用的过渡区域的近似宽度(用与fs相同的单位表示)。这种情况下,窗口参数被忽略。


window:string or tuple of string and parameter values, optional
想要使用的窗口。看到scipy.signal。Get_window用于Windows和所需参数的列表。


pass_zero{True, False, ’ bandpass ', ’ lowpass ', ’ highpass ', ’ bandstop '},可选
如果为True,则频率0处的增益(即“直流增益”)为1。False表示直流增益为0。也可以是所需过滤器类型的字符串参数(相当于IIR设计函数中的btype)。


scale:bool,可选
设置为True以缩放系数,使频率响应在某一频率上完全为单位。这个频率是:
0 (DC)如果第一个通带从0开始(即pass_zero为True)
如果第一通带结束于fs/2(即滤波器是单带高通滤波器),则fs/2(奈奎斯特频率);否则第一通带的中心


fs:float,可选
信号的采样频率。每个截止频率必须在0到fs/2之间。默认值为2。


返回值:
ndarray h (numtaps)
长度系数numtap FIR滤波器。


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

示例:

# -*- coding: utf-8 -*-
from scipy import signal

numtaps = 3
f = 0.1
win = signal.firwin(numtaps, f)
print(win)
# array([ 0.06799017,  0.86401967,  0.06799017])
# Use a specific window function:

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

# High-pass (‘stop’ from 0 to f):
fir = signal.firwin(numtaps, f, pass_zero=False)
print(fir)
# array([-0.00859313,  0.98281375, -0.00859313])

# Band-pass:
f1, f2 = 0.1, 0.2
fir = signal.firwin(numtaps, [f1, f2], pass_zero=False)
print(fir)
# array([ 0.06301614,  0.88770441,  0.06301614])

# Band-stop:
fir = signal.firwin(numtaps, [f1, f2])
print(fir)
# array([-0.00801395,  1.0160279 , -0.00801395])

# Multi-band (passbands are [0, f1], [f2, f3] and [f4, 1]):
f3, f4 = 0.3, 0.4
fir = signal.firwin(numtaps, [f1, f2, f3, f4])
print(fir)
# array([-0.01376344,  1.02752689, -0.01376344])

# Multi-band (passbands are [f1, f2] and [f3,f4]):
fir = signal.firwin(numtaps, [f1, f2, f3, f4], pass_zero=False)
print(fir)
# array([ 0.04890915,  0.91284326,  0.04890915])

method2:给定期望的频率和增益

接口

scipy.signal.firwin2(numtaps, freq, gain, nfreqs=None, window=‘hamming’, nyq=None, antisymmetric=False, fs=None)[source]
FIR滤波器设计采用窗口法。
从给定的频率和相应的增益增益,该函数构造一个具有线性相位和(近似)给定频率响应的FIR滤波器。


参数
numtaps:int
FIR滤波器中的轻拍次数。Numtaps必须小于nfreqs。


freq:array_like,一维
频率采样点。通常是0.0到1.0,1.0是Nyquist。奈奎斯特频率是一半fs。freq中的值必须是非递减的。一个值可以重复一次以实现不连续。freq的第一个值必须为0,最后一个值必须为fs/2。0和fs/2不能重复。


gain:array_like
滤波器在频率采样点处获得增益。根据筛选器类型,应用了某些获取值的约束,详细信息请参见Notes。


nfreqs:int,可选
用于构造滤波器的插值网格的大小。对于最有效的行为,这应该是2 + 1的幂(例如129,257等)。默认值是比不小于numtaps的2的最小次幂大1。Nfreqs必须大于numtap。


window:string或(string, float)或float,或None,可选
窗口函数的使用。默认是“hamming”。看到scipy.signal。Get_window获取可能值的完整列表。如果为None,则不应用窗口函数。


antisymmetric:bool,可选
产生的脉冲响应是否对称/反对称。参见Notes了解更多细节。


fs:float,可选
信号的采样频率。每个截止频率必须在0到fs/2之间。默认值为2。


返回
taps:ndarray
FIR滤波器的滤波系数,作为长度numtap的一维数组。
从给定的频率和增益集,期望的响应是在频域构造的。将反FFT应用于所需的响应以创建相关的卷积核,并返回该核的第一个numtaps系数,按窗口缩放。

note:
FIR滤波器将有线性相位。过滤器的类型由’ numtaps '的值和反对称标志决定。有四种可能的组合:
奇数numtap,反对称为False,产生I型过滤器
即使numtaps,反对称为False,类型II滤波器产生
奇数numtap,反对称为True,产生III型滤波器
即使numtap,反对称为True,产生IV型滤波器
除I型滤波器外,所有滤波器的幅度响应均受下列约束:
II型-在奈奎斯特频率处为零
III型 -零在零和奈奎斯特频率
IV型-在零频率处为零

示例

#A lowpass FIR filter with a response that is 1 on [0.0, 0.5], and that decreases linearly on [0.5, #1.0] from 1 to 0:

from scipy import signal
taps = signal.firwin2(150, [0.0, 0.5, 1.0], [1.0, 1.0, 0.0])
print(taps[72:78])
# [-0.02286961 -0.06362756  0.57310236  0.57310236 -0.06362756 -0.02286961]

参考:
Signal processing (scipy.signal) — SciPy v1.9.3 Manual

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

KPer_Yang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值