随机干扰随着数据样本的增加,其统计平均值越趋于零,对被检测物理量进行连续多次采样,然后求其算数平均值作为有效采样值,就可以抑制随机干扰。
以检测电池电压为例,因为负载变化,比如开启大功率模块,电池电压瞬时值会下降,关闭时会有个小的回升。假设期望1分钟更新一次,需要在这个频率的基础上按倍提高检测频率,如每15秒采集一次,取4次的平均值作为1分钟一次的有效值。
#define SAMPLE_NUM 4
int vBat[SAMPLE_NUM];
//假设已经通过其他方式采集到了4次电压值,且缓存在vBat数据
//filter按采样频率执行,更新结果
int filter(void)
{
int i;
int sum=0;
for(i=0;i<SAMPLE_NUM;i++)
{
sum+=vBat[i];
}
return sum/SAMPLE_NUM;
}
其算法简单,但是缺点有明显,对于偶发异常,比如某次的采样值明显偏大,经过算数平均值导致最终值存在较大偏差,因为一颗老鼠屎坏了一锅粥。针对这种极大值或极小值的问题,可以在算数平均前先进行剔除。
int filter(void)
{
int i;
int sum=0;
int min=0,max=0;
for(i=0;i<SAMPLE_NUM;i++)
{
if(vBat[i]>max)
{
max=vBat[i];
}
if(vBat[i]<min)
{
min==vBat[i];
}
sum+=vBat[i];
}
sum=sum-min-max;
return sum/(SAMPLE_NUM-2);
}
改进后的算法,在实际如现场比赛打分中,就是去掉最高分和最低分之后的平均值。但是对于一次采样周期中出现多个异常数据则无法排除,正如比赛中,恰好某选手有2个以上的评委干爹,这是无解的。不过可加大采样量,1分钟内采集4次改为采集10次,排序后去掉最大的2个值和最小的2个值,再对剩下的6个值求算数平均值。