如何将二项式低通滤波器应用于 NumPy 数组中的数据?



我应该对 NumPynumpy.ndarray中给出的数据应用"二项式低通滤波器"。

但是,我无法在 https://docs.scipy.org/doc/scipy/reference/signal.html 我在这里错过了什么?这应该是一个失败的基本操作,对吧?

二项式滤波器是一种FIR滤波器,其系数可以通过从帕斯卡三角形中取一行来生成。 一种快速的方法("快速"就像在一行代码中一样 - 不一定是最有效的)是使用numpy.poly1d

In [15]: np.poly1d([1, 1])**2                                                   
Out[15]: poly1d([1, 2, 1])
In [16]: np.poly1d([1, 1])**3                                                   
Out[16]: poly1d([1, 3, 3, 1])
In [17]: np.poly1d([1, 1])**4                                                   
Out[17]: poly1d([1, 4, 6, 4, 1])

若要将这些系数中的一组用作低通滤波器,这些值必须归一化,以便总和为 1。np.poly1d([1, 1])**n系数之和是2**n,所以我们可以将上述结果除以2**n。 或者,我们可以通过numpy.poly1d给出 [1/2, 1/2] 而不是[1, 1]来生成已经归一化的系数(即从一组归一化的两个系数开始)。 此函数生成给定 n 的滤波器系数:

def binomcoeffs(n): 
return (np.poly1d([0.5, 0.5])**n).coeffs

例如

In [35]: binomcoeffs(3)                                                         
Out[35]: array([0.125, 0.375, 0.375, 0.125])
In [36]: binomcoeffs(5)                                                         
Out[36]: array([0.03125, 0.15625, 0.3125 , 0.3125 , 0.15625, 0.03125])
In [37]: binomcoeffs(15)                                                        
Out[37]: 
array([3.05175781e-05, 4.57763672e-04, 3.20434570e-03, 1.38854980e-02,
4.16564941e-02, 9.16442871e-02, 1.52740479e-01, 1.96380615e-01,
1.96380615e-01, 1.52740479e-01, 9.16442871e-02, 4.16564941e-02,
1.38854980e-02, 3.20434570e-03, 4.57763672e-04, 3.05175781e-05])

要将滤波器应用于信号,请使用卷积。 有几种离散卷积函数可用,包括numpy.convolvescipy.signal.convolvescipy.ndimage.convolve1d。 您也可以使用scipy.signal.lfilter(将系数作为b参数,并设置a=1)。

有关具体示例,请查看"应用FIR滤波器",这是我几年前写的一篇短文(从那时起一直由其他人编辑)。 请注意,该文章中显示的时间可能不是最新的。 NumPy和SciPy中的代码都在不断发展。 如果现在运行这些脚本,可能会得到完全不同的结果。

最新更新