我应该对NumPy numpy.ndarray
中给出的数据应用“二项式低通滤波器”。
但是,我在https://docs.scipy.org/doc/scipy/reference/signal.html找不到任何类似的东西吗?这应该是一个有问题的基本操作,对吧?
答案 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.convolve
,scipy.signal.convolve
,scipy.ndimage.convolve1d
。您还可以使用scipy.signal.lfilter
(将系数作为b
的参数,并设置a=1
)。
有关具体示例,请查看"Applying a FIR filter",这是我几年前写的一篇简短文章(此后由其他人编辑)。请注意,该文章中显示的时间可能不是最新的。 NumPy和SciPy中的代码都在不断发展。如果现在运行这些脚本,则可能会获得截然不同的结果。