滑动平均滤波就是把连续取得的N个采样值看成一个队列,队列的长度固定为N,每次采样得到一个新数据放到队尾,并丢掉原来队首的一次数据,把队列中的N个数据进行平均运算,就可以获得新的滤波结果。 经过滑动滤波之后,波形整体变得平滑。
y ( n ) = 1 2 m + 1 ∑ n − m n + m x ( n − k ) y(n)=\frac{1}{2m+1} \sum_{n-m}^{n+m}x(n-k) y(n)=2m+11n−m∑n+mx(n−k)
式中:m为正整数,L=2m+1为滤波器阶数,等于滑动窗口的宽度。
char value_buff[N];
char i=0;
char filter()
{
char count;
int sum=0;
value_buff[i++]=get_data();
if(i==N)
i=0;
for(count=0;count<N;count++)
sum=value_buff[count];
return (char)(sum/N);
}
其中get_data()是指你采集到的数据值。
优点:算法简单,对周期性干扰有良好的抑制作用,平滑度高,适用于高频振动的系统。
缺点:对异常信号的抑制作用差,无法消除脉冲干扰的影响。
连续取N次采样值后进行算术平均。
算术平均滤波算法适用于对具有随机干扰的信号进行滤波。
y = 1 n + 1 ∑ 0 n x ( n ) y=\frac{1}{n+1} \sum_{0}^{n}x(n) y=n+110∑nx(n)
char filter()
{
int sum=0;
for(count=0;count<N;count++)
{
sum+=get_data();
delay():
}
return (char)(sum/N);
}
在算术平均的基础上增加了加权系数。
可突出一部分信号,抵制另一部分信号,以提高采样值变化的灵敏度。
y = ∑ i = 0 n x i C i y=\sum_{i=0}^{n}x_{i}C _{i} y=i=0∑nxiCi
y为n个采样值的加权平均值:Xi为第i次采样值;N为采样次数;Ci为加权系数。
加权系数Ci体现了各种采样值在平均值中所占的比例。
char codejq[N]={1,2,3,4,5,6,7,8,9,10,11,12}; //code数组为加权系数表,存在程序存储区
char codesum_jq=1+2+3+4+5+6+7+8+9+10+11+12;
char filter()
{
char count;
char value_buff[N];
int sum=0;
for(count=0;count<N;count++)
{
value_buff[count]=get_data();
delay();
}
for(count=0;count<N;count++)
sum+=value_buff[count]*jq[count];
return (char)(sum/sum_jq);
}
该运算的过程中将两次相邻的采样相减,求出其增量,然后将增量的绝对值,与两次采样允许的最大差值A进行比较。A的大小由被测对象的具体情况而定。
如果小于或等于允许的最大差值,则本次采样有效;否则取上次采样值作为本次数据的样本。
#define A //允许的最大差值
char data; //上一次的数据
char filter()
{
char datanew; //新数据变量
datanew=get_data(); //获得新数据变量
if((datanew-data)>A||(data-datanew>A))
return data;
else
return datanew;
}
限幅滤波法主要用于处理变化较为缓慢的数据,如温度、物体的位置等。使用时,关键要选取合适的门限制A。通常这可由经验数据获得,必要时可通过实验得到。