优点:对周期干扰有较好的抑制作用,平滑度较高;适用于高频振荡的系统。
缺点:灵敏度低、对偶然出现的脉冲性干扰的抑制作用较差,不易消除由脉冲干扰所引起的采样值偏差,不适用于脉冲干扰比较严重的场合,比较浪费存储器的空间
代码分享:
for(Flow_Count=(MOV_FIL_NUM-1);Flow_Count>0;Flow_Count--)
{
Mov_Filter[0][Flow_Count]=Mov_Filter[0][Flow_Count-1];//元素依次平移
}
Mov_Filter[0][0]= Tst_Vale;//存入本次检测流速值
IM_Flow_Count[0]++; //检测次数
if(IM_Flow_Count[0]>=MOV_FIL_NUM)//已经滑动次数达到或超过了MOV_FIL_NUM
{
for(IM_Flow_Count[0]=0;IM_Flow_Count[0]<MOV_FIL_NUM;IM_Flow_Count[0]++)
{
SumFlow+=Mov_Filter[0][IM_Flow_Count[0]];//求和
}
Ave_Val=SumFlow/(float)MOV_FIL_NUM;//平均值
IM_Flow_Count[0]=MOV_FIL_NUM;
SumFlow=0.0;
}
else //还没有计算到 MOV_FIL_NUM 次
{
for(Aver_Count=0;Aver_Count<IM_Flow_Count[0];Aver_Count++)
{
SumFlow+=Mov_Filter[0][Aver_Count];
}
Ave_Val=SumFlow/(float)IM_Flow_Count[0];
SumFlow=0.0;
}
程序分2个部分:
1.把数组向前平移一个元素,数组[0]存入当前检测到的值
2.进行平均,但是平均又分2种情况,
(1)当前滑动次数已经达到 MOV_FIL_NUM次,这个可以直接进行平均即可;
(2)滑动次数还没有达到MOV_FIL_NUM次,这时候就不能直接平均,否则出错,例如MOV_FIL_NUM=5,那么存储数据的数组也是5个元素,如果只滑动了3次,那么5个元素中会有2个元素值为0(数组初始值),那么你现在只能把前三个元素平均,当然如果你的设计在开始阶段要求不高,可以不用这么做;