开发技巧 | Python极简实现滑动平均滤波(基于Numpy.convolve)

640?wx_fmt=jpeg


作者 | 小宋是呢

来源 | CSDN博客


1.滑动平均概念


滑动平均滤波法(又称递推平均滤波法),时把连续取N个采样值看成一个队列 ,队列的长度固定为N ,每次采样到一个新数据放入队尾,并扔掉原来队首的一次数据.(先进先出原则)  把队列中的N个数据进行算术平均运算,就可获得新的滤波结果。N值的选取:流量,N=12;压力:N=4;液面,N=4~12;温度,N=1~4 


优点:对周期性干扰有良好的抑制作用,平滑度高  适用于高频振荡的系统  


缺点:灵敏度低  对偶然出现的脉冲性干扰的抑制作用较差  不易消除由于脉冲干扰所引起的采样值偏差  不适用于脉冲干扰比较严重的场合  比较浪费RAM。


2.解决思路


可以发现滑动平均滤波法计算很类似与一维卷积的工作原理,滑动平均的N就对应一维卷积核大小(长度)。


步长会有些区别,滑动平均滤波法滑动步长为1,而一维卷积步长可以自定义。还有区别就是一维卷积的核参数是需要更新迭代的,而滑动平均滤波法核参数都是一。


我们应该怎么利用这个相似性呢?其实也很简单,只需要把一维卷积核大小(长度)和N相等,步长设置为1,核参数都初始为1就可以了。由于一维卷积具备速度快,然后我们就可以使用一维卷积来实现这个功能了,快速高效。


使用深度学习框架实现这个功能是否有些大材小用了?是有些大材小用了,因为这里使用卷积的核参数不用更新,其实没必要使用复杂的深度学习框架,如果Numpy中可以实现这些功能就更简单方便了。


说干就干,经过查找发现Numpy.convolve可以实现我们想要的功能。


3.Numpy.convolve介绍


numpy.convolve(a, v, mode=‘full’)

参数:

a:(N,)输入的一维数组

v:(M,)输入的第二个一维数组

mode:{‘full’, ‘valid’, ‘same’}参数可选

‘full’默认值,返回每一个卷积值,长度是N+M-1,在卷积的边缘处,信号不重叠,存在边际效应。

‘same’返回的数组长度为max(M, N),边际效应依旧存在。

‘valid’返回的数组长度为max(M,N)-min(M,N)+1,此时返回的是完全重叠的点。边缘的点无效。


和一维卷积参数类似,a就是被卷积数据,v是卷积核大小。


4.算法实现

 

def np_move_avg(a,n,mode="same"):

    return(np.convolve(a, np.ones((n,))/n, mode=mode))

原理说明


运行平均值是卷积数学运算的一个例子。对于运行平均值,沿着输入滑动窗口并计算窗口内容的平均值。对于离散的1D信号,卷积是相同的,除了代替计算任意线性组合的平均值,即将每个元素乘以相应的系数并将结果相加。那些系数,一个用于窗口中的每个位置,有时称为卷积核。现在,N值的算术平均值是(x_1 + x_2 + ... + x_N) / N,所以相应的内核是(1/N, 1/N, ..., 1/N),这正是我们通过使用得到的np.ones((N,))/N。


边缘处理


该mode的参数np.convolve指定如何处理边缘。在这里选择了same模式,这样可以保证输出长度一种,但你可能还有其他优先事项。这是一个说明模式之间差异的图:

 
 
import numpy as np	
import matplotlib.pyplot as plt	
 	
def np_move_avg(a,n,mode="same"):	
    return(np.convolve(a, np.ones((n,))/n, mode=mode))	
 	
modes = ['full', 'same', 'valid']	
for m in modes:	
    plt.plot(np_move_avg(np.ones((200,)), 50, mode=m));	
 	
plt.axis([-10, 251, -.1, 1.1]);	
 	
plt.legend(modes, loc='lower center');	
 	
plt.show()


参考

1.https://stackoverflow.com/questions/13728392/moving-average-or-running-mean


原文地址:

https://blog.csdn.net/xiaosongshine/article/details/90258331


(*本文仅代表作者观点,转载请联系原作者)


CTA核心技术及应用峰会

5月25-27日,由中国IT社区CSDN与数字经济人才发展中心联合主办的第一届CTA核心技术及应用峰会将在杭州国际博览中心隆重召开,峰会将围绕人工智能领域,邀请技术领航者,与开发者共同探讨机器学习和知识图谱的前沿研究及应用。


目前会议特惠票发售中,识别海报二维码即刻抢购。添加小助手微信15101014297,备注“CTA”,了解票务以及会务详情。


640?wx_fmt=jpeg


点击阅读原文,了解CTA核心技术及应用峰会

  • 6
    点赞
  • 43
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
numpy.convolve函数是用来进行一维卷积运算的,在信号处理中常用于滤波操作。滑动平均滤波是一种常见的信号平滑处理方法,通过计算一个窗口内的数据平均值来减小噪声的影响。 滑动平均滤波的具体步骤如下:首先定义一个窗口大小,然后将窗口从第一个数据点开始滑动到最后一个数据点。对于窗口内的数据点,计算其平均值,并将结果保存在滤波后的信号中。如此反复滑动窗口,直到所有数据点都被处理完。 在numpy中,我们可以使用convolve函数来进行滑动平均滤波操作。首先,我们需要定义一个窗口,窗口的大小决定了滤波的效果。然后,使用convolve函数将窗口与待滤波的信号进行卷积运算,得到滤波后的信号。numpy.convolve函数可以方便地实现这一操作。 具体使用numpy.convolve函数进行滑动平均滤波的示例代码如下: ``` python import numpy as np def moving_average_filter(signal, window_size): window = np.ones(window_size) / window_size filtered_signal = np.convolve(signal, window, mode='valid') return filtered_signal # 定义一个长度为10的信号 signal = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]) # 使用窗口大小为3进行滑动平均滤波 filtered_signal = moving_average_filter(signal, 3) print("原始信号:", signal) print("滤波后的信号:", filtered_signal) ``` 以上代码将一个长度为10的信号进行了滑动平均滤波,窗口大小为3。输出结果为滤波前后信号的数值。可以看到滤波后的信号相较于原始信号更加平滑,噪声的影响有所减小。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值