嵌入式常用滤波算法
法一:限幅滤波
方法:根据经验判断,确定两次采样允许的最大偏差值(设为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(); // 让第一个值为瞬时值
采样序列:100, 130, 100, 130, 100, 130..
每次变化都在A以内,滤波器会全部接受,周期性干扰就被“放进来了”。
在这里ftable这个数组在第一次采集成功前没有数,这时候第一个采集的值就不可预测
可以先给出第一个值 ftable[0] = getsensor(); // 让第一个值为瞬时值

浙公网安备 33010602011771号