嵌入式常用滤波算法

法一:限幅滤波
方法:根据经验判断,确定两次采样允许的最大偏差值(设为A),每次检测到新值时判断:
      如果本次值与上次值之差<=A,则本次值有效,
      如果本次值与上次值之差>A,则本次值无效,放弃本次值,用上次值代替本次值。
优点:能克服偶然因素引起的脉冲干扰
缺点:无法抑制周期性的干扰,平滑度差
 
代码:
#define  A 51           // 允许的最大偏差值
u16 Value1;             // 上一次采样值

// 限幅滤波函数
u16 filter1()
{
  u16 NewValue;         // 本次采样值
       Value1 = ftable[b-1];    // 获取上一次采样值
  NewValue = ftable[b];     // 获取本次采样值
       b++;                     // b自增,指向下一个采样点
       a++;                     // a自增,指向下一个采样点
       if(a==255) a=0;          // a循环回0
       if(b==255) b=1;          // b循环回1
  // 判断本次采样值与上次采样值的差是否超过最大允许偏差
  if(((NewValue - Value1) > A) || ((Value1 - NewValue) > A))
       {
              print_host(ftable[a],NewValue); // 超过限幅,输出本次采样值
    return NewValue;                  // 返回本次采样值
       }
  else
       {
               print_host(ftable[a],Value1); // 未超过限幅,输出上次采样值
     return Value1;                  // 返回上次采样值
       }
}
为什么提到无法抑制周期性的干扰呢?
假设真实信号是恒定的100,但每隔一次采样就有+30的周期性干扰,A=51。
采样序列:100, 130, 100, 130, 100, 130..
每次变化都在A以内,滤波器会全部接受,周期性干扰就被“放进来了”。
在这里ftable这个数组在第一次采集成功前没有数,这时候第一个采集的值就不可预测
可以先给出第一个值 ftable[0] = getsensor(); // 让第一个值为瞬时值
posted @ 2025-07-23 10:06  ejean117  阅读(22)  评论(0)    收藏  举报