嵌入式算法2---算数平均滤波法

it2026-02-10  8

随机干扰随着数据样本的增加,其统计平均值越趋于零,对被检测物理量进行连续多次采样,然后求其算数平均值作为有效采样值,就可以抑制随机干扰。 以检测电池电压为例,因为负载变化,比如开启大功率模块,电池电压瞬时值会下降,关闭时会有个小的回升。假设期望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个以上的评委干爹,这是无解的。不过可加大采样量,1分钟内采集4次改为采集10次,排序后去掉最大的2个值和最小的2个值,再对剩下的6个值求算数平均值。

最新回复(0)