【嵌入式算法】差值滤波补偿法

现实中的物理量都是连续的模拟量,其变化需要一定时间,且在短时间内的变化量有一个合理的限度。例如气温,短时间内前后两个采样值的差值必定有个最大范围,基于这个条件可以对其中明显受到干扰的无效值进行剔除。本次的无效采样值排除后,再根据前面数据的变化趋势,预测一个合理的数据替代本次的问题值,而不是直接使用上次的结果。
1、 什么样的采样值为无效值
根据物理量的检测范围,和在采样间隔内最大的变化可能来定义,如气温检测,可定义温度在正负50度之间,如果采样间隔是1分钟,那气温在1分钟内最多变化5度。实际应用需要根据使用场景来确定,范围越小对异常值的判断排除越准确。
2、 如何根据趋势预测合理值
还是以气温为例,连续3次采样结果分别是t1,t2,t3,假设温度在短时间内的变化趋势相同,t2-t1=t3-t2,转换后得出t3=2*t2-t1,即在合适的范围内,可以根据前面2个历史值预测出当前采样值。采样间隔越小预测值越准确,在采样频率很小的情况下,结果可能存在一定误差。

确定了原理,那算法就出来了。

//设定温度变化范围和最大变化趋势
#define SAMPLE_MIX  -50
#define SAMPLE_MAX  50
#define DIFF_MAX  5

int history[2];//历史值,其中history[1]为最近的记录

int filter(void)
{
    int current;
    int valid=1;

    current=read_sample();//更新采样值

    if((current-history[1]>DIFF_MAX)||(history[1]-current>DIFF_MAX))
    {
        valid=0;
    }

    if((current<SAMPLE_MIX)||(current>SAMPLE_MAX))
    {
        valid=0;
    }

    if(valid==0)//表示本次采样值无效
    {
        current=2*history[1]-history[0];
        if(current<SAMPLE_MIX)
        {
            current=SAMPLE_MIX;
        }
        else if(current>SAMPLE_MAX)
        {
            current=SAMPLE_MAX;
        }
    }

    history[0]=history[1];
    history[1]=current;

    return current;
}

缺点:只能过滤偶发的异常数据。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值