• 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])
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40

    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]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

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

  • 相关阅读:
    Unity中Shader的深度缓冲区
    [附源码]Python计算机毕业设计Django打印助手平台
    蓝桥杯第一天
    Outlook打开超链接用默认浏览器Microsoft outlook open hyperlink using default browser
    机器学习期中考试
    7.27模拟赛总结
    【C++ Efficiency】找到可能产生“临时对象”的地方
    Fuxploider:一款针对文件上传漏洞的安全检测与研究工具
    电商软件分享(好用版)
    Linux四种I/O模型简单介绍下
  • 原文地址:https://blog.csdn.net/KPer_Yang/article/details/127895985