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

随机干扰随着数据样本的增加,其统计平均值越趋于零,对被检测物理量进行连续多次采样,然后求其算数平均值作为有效采样值,就可以抑制随机干扰。
以检测电池电压为例,因为负载变化,比如开启大功率模块,电池电压瞬时值会下降,关闭时会有个小的回升。假设期望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个值求算数平均值。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值