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

时间:2019-05-21 22:14:16

标签: python numpy filter scipy binomial-coefficients

我应该对NumPy numpy.ndarray中给出的数据应用“二项式低通滤波器”。

但是,我在https://docs.scipy.org/doc/scipy/reference/signal.html找不到任何类似的东西吗?这应该是一个有问题的基本操作,对吧?

1 个答案:

答案 0 :(得分:1)

二项式滤波器是FIR filter,其系数可以通过从Pascal's triangle取一行来生成。一种快速的方法(只需一行代码即可“快速”完成(不一定是最高效的))是使用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])

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

有关具体示例,请查看"Applying a FIR filter",这是我几年前写的一篇简短文章(此后由其他人编辑)。请注意,该文章中显示的时间可能不是最新的。 NumPy和SciPy中的代码都在不断发展。如果现在运行这些脚本,则可能会获得截然不同的结果。