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

2024-10-01 09:24:02 发布

您现在位置:Python中文网/ 问答频道 /正文

我应该对NumPynumpy.ndarray中给定的数据应用“二项式低通滤波器”。在

{我在这里找不到什么?这应该是个失败的基本操作,对吧?在


Tags: 数据基本操作ndarray低通滤波器numpynumpy
1条回答
网友
1楼 · 发布于 2024-10-01 09:24:02

二项式滤波器是一个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的滤波器系数:

^{pr2}$

例如

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。{a4}有几个{a4}函数,包括^卷积。您还可以使用^{}(将系数作为b参数,并设置a=1)。在

对于具体的例子,请查看"Applying a FIR filter",这是我几年前写的一篇短文(从那时起就被其他人编辑过)。请注意,文章中显示的计时可能不是最新的。NumPy和SciPy中的代码都在不断发展。如果现在运行这些脚本,可能会得到完全不同的结果。在

相关问题 更多 >