基于volve使⽤Python实现滑动平均滤波的思
路详解
1.滑动平均概念
滑动平均滤波法(⼜称递推平均滤波法),时把连续取N个采样值看成⼀个队列,队列的长度固定为N ,
每次采样到⼀个新数据放⼊队尾,并扔掉原来队⾸的⼀次数据.(先进先出原则) 把队列中的N个数据进⾏算术平均运算,就可获得新的滤波结果。N值的选取:流量,N=12;压⼒:N=4;液⾯,N=4~12;温度,N=1~4
优点:对周期性⼲扰有良好的抑制作⽤,平滑度⾼适⽤于⾼频振荡的系统
缺点:灵敏度低对偶然出现的脉冲性⼲扰的抑制作⽤较差不易消除由于脉冲⼲扰所引起的采样值偏差不适⽤于脉冲⼲扰⽐较严重的场合⽐较浪费RAM
2.解决思路
可以发现滑动平均滤波法计算很类似与⼀维卷积的⼯作原理,滑动平均的N就对应⼀维卷积核⼤⼩(长度)。
步长会有些区别,滑动平均滤波法滑动步长为1,⽽⼀维卷积步长可以⾃定义。还有区别就是⼀维卷积的核参数是需要更新迭代的,⽽滑动平均滤波法核参数都是⼀。
我们应该怎么利⽤这个相似性呢?其实也很简单,只需要把⼀维卷积核⼤⼩(长度)和N相等,步长设置为1,核参数都初始为1就可以了。由于⼀维卷积具备速度快,然后我们就可以使⽤⼀维卷积来实现这个功能了,快速⾼效。
使⽤深度学习框架实现这个功能是否有些⼤材⼩⽤了?是有些⼤材⼩⽤了,因为这⾥使⽤卷积的核参数不⽤更新,其实没必要使⽤复杂的深度学习框架,如果Numpy中可以实现这些功能就更简单⽅便了。
说⼲就⼲,经过查发现volve可以实现我们想要的功能。
volve介绍
参数:
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"):
volve(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
numpy教程 pdfdef np_move_avg(a,n,mode="same"):
volve(a, np.ones((n,))/n, mode=mode))
modes = ['full', 'same', 'valid']
for m in modes:
plt.plot(np_move_s((200,)), 50, mode=m));
plt.axis([-10, 251, -.1, 1.1]);
plt.legend(modes, loc='lower center');
plt.show()
5.参考
总结
以上所述是⼩编给⼤家介绍的Python实现滑动平均滤波的思路详解(基于volve),希望对⼤家有所帮助,如果⼤家有任何疑问欢迎给我留⾔,⼩编会及时回复⼤家的!
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论