滑动平均滤波法(又称递推平均滤波法),时把连续取N个采样值当作一个队列 ,队列的长度固定为N ,每次采样到一个新数据放入队尾,并扔掉原来队首的一次数据.(先进先出原则) 把队列中的N个数据进行算术平均运算,就可得到新的滤波结果。N值的选取:流量,N=12;压力:N=4;液面,N=4~12;温度,N=1~4 python
优势: 对周期性干扰有良好的抑制做用,平滑度高 适用于高频振荡的系统 算法
缺点: 灵敏度低 对偶然出现的脉冲性干扰的抑制做用较差 不易消除因为脉冲干扰所引发的采样值误差 不适用于脉冲干扰比较严重的场合 比较浪费RAM 数组
能够发现滑动平均滤波法计算很相似与一维卷积的工做原理,滑动平均的N就对应一维卷积核大小(长度)。app
步长会有些区别,滑动平均滤波法滑动步长为1,而一维卷积步长能够自定义。还有区别就是一维卷积的核参数是须要更新迭代的,而滑动平均滤波法核参数都是一。框架
咱们应该怎么利用这个类似性呢?其实也很简单,只须要把一维卷积核大小(长度)和N相等,步长设置为1,核参数都初始为1就能够了。因为一维卷积具有速度快,而后咱们就可使用一维卷积来实现这个功能了,快速高效。学习
使用深度学习框架实现这个功能是否有些大材小用了?是有些大材小用了,由于这里使用卷积的核参数不用更新,其实不必使用复杂的深度学习框架,若是Numpy中能够实现这些功能就更简单方便了。spa
说干就干,通过查找发现Numpy.convolve能够实现咱们想要的功能。code
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,此时返回的是彻底重叠的点。边缘的点无效。blog
和一维卷积参数相似,a就是被卷积数据,v是卷积核大小。队列
原理说明
运行平均值是卷积数学运算的一个例子。对于运行平均值,沿着输入滑动窗口并计算窗口内容的平均值。对于离散的1D信号,卷积是相同的,除了代替计算任意线性组合的平均值,即将每一个元素乘以相应的系数并将结果相加。那些系数,一个用于窗口中的每一个位置,有时称为卷积核。如今,N值的算术平均值是(x_1 + x_2 + ... + x_N) / N
,因此相应的内核是(1/N, 1/N, ..., 1/N)
,这正是咱们经过使用获得的np.ones((N,))/N
。
边缘处理
该mode
的参数np.convolve
指定如何处理边缘。在这里选择了same模式,这样能够保证输出长度一种,但你可能还有其余优先事项。这是一个说明模式之间差别的图:
1.https://stackoverflow.com/questions/13728392/moving-average-or-running-mean