在单片机开发中,经常需要对输入的数据进行过滤处理,如传感器数据输出,AD采样等,合适的滤波处理能达到更好效果。下面分享几种较简单而常用的滤波算法:
一、限幅滤波法(又称程序判断滤波法)
二、中位值滤波法
三、算术平均滤波法
四、递推平均滤波法
五、中位值平均滤波法
六、限幅平均滤波法
七、一阶滞后滤波法
八、加权递推平均滤波法
九、消抖滤波法
十、限幅消抖滤波法
一、限幅滤波法(又称程序判断滤波法)
A、方法:
根据经验判断,确定两次采样允许的最大偏差值(设为A)
每次检测到新值时判断:
如果本次值与上次值之差<=A,则本次值有效
如果本次值与上次值之差>A,则本次值无效,放弃本次值,用上次值代替本次值
B、优点:
能有效克服因偶然因素引起的脉冲干扰
C、缺点:
无法抑制那种周期性的干扰
平滑度差
int Filter_Value;
int Value;
void setup(){
Serial.begin(9600); // 初始化串口通信
randomSeed(analogRead(0)); // 产生随机种子
Value = 300;
}
void loop(){
Filter_Value = Filter(); // 获得滤波器输出值
Value = Filter_Value; // 最近一次有效采样的值,该变量为全局变量
Serial.println(Filter_Value); // 串口输出
delay(50);
}
// 用于随机产生一个300左右的当前值
int Get_AD(){
return random(295, 305);
}
// 限幅滤波法(又称程序判断滤波法)
#define FILTER_A 1
int Filter(){
int NewValue;
NewValue = Get_AD();
if(((NewValue - Value) > FILTER_A) || ((Value - NewValue) > FILTER_A))
return Value;
else
return NewValue;
}
二、中位值滤波法
A、方法:
连续采样N次(N取奇数)
把N次采样值按大小排列
取中间值为本次有效值
B、优点:
能有效克服因偶然因素引起的波动干扰
对温度、液位的变化缓慢的被测参数有良好的滤波效果
C、缺点:
对流量、速度等快速变化的参数不宜
/* N值可根据实际情况调整排序采用冒泡法*/
#define N 11
char filter(){
char value_buf[N];
char count,i,j,temp;
for ( count=0;count
{
value_buf[count] =get_ad();
delay();
}
for (j=0;j
{
for (i=0;i
{
if (value_buf>value_buf[i+