花生漫画

ADuC7026软件滤波

0
阅读(2909)

几种常用的软件滤波方法及参考程序

1 限副滤波

优点:能有效克服因偶然因素引起的脉冲干扰。

缺点:无法抑制那种周期性的干扰,平滑度差。

/*A值可根据实际情况调整

value为有效值,new_value为当前采样值 

滤波程序返回有效的实际值  */

#define A 10
char value;
char filter()
{
   char  new_value;
   new_value = get_ad();
   if ( ( new_value - value > A ) || ( value - new_value > A )
      return value;
   return new_value;
        
}

2 中位值滤波法

优点:能有效克服因偶然因素引起的波动干扰,对温度、液位的变化缓慢的被测参数有良好的滤波效果。

缺点:对流量、速度等快速变化的参数不宜。

/*N值可根据实际情况调整

排序采用冒泡法*/

#define N  11
char filter()
{
   char value_buf[N];
   char count,i,j,temp;
   for ( count=0;count<N;count++)
   {
      value_buf[count] = get_ad();
      delay();
   }
   for (j=0;j
   {
      for (i=0;ij;i++)
      {
         if ( value_buf[i]>value_buf[i+1] )
         {
            temp = value_buf[i];
            value_buf[i] = value_buf[i+1];
             value_buf[i+1] = temp;
         }
      }
   }
   return value_buf[(N-1)/2];
}

3 算术平均滤波法

优点:适用于对一般具有随机干扰的信号进行滤波,这样信号的特点是有一个平均值,信号在某一数值范围附近上下波动。

缺点:对于测量速度较慢或要求数据计算速度较快的实时控制不适用,比较浪费计算资源。

#define N 12
char filter()
{
   int  sum = 0;
   for ( count=0;count<N;count++)
   {
      sum + = get_ad();
      delay();
   }
   return (char)(sum/N);
}

4 递推平均滤波法(又称滑动平均滤波法)

/*

优点:对周期性干扰有良好的抑制作用,平滑度高,适用于高频振荡的系统。

缺点:灵敏度低 ,对偶然出现的脉冲性干扰的抑制作用较差,不易消除由于脉冲干扰所引起的采样值偏差,不适用于脉冲干扰比较严重的场合,比较浪费RAM /

#define N 12
char value_buf[N];
char i=0;
char filter()
{
   char count;
   int  sum=0;
   value_buf[i++] = get_ad();
   if ( i == N )   i = 0;
   for ( count=0;count<N,count++)
      sum = value_buf[count];
   return (char)(sum/N);
}

5 中位值平均滤波法(又称防脉冲干扰平均滤波法)

优点:融合了两种滤波法的优点,对于偶然出现的脉冲性干扰,可消除由于脉冲干扰所引起的采样值偏差。

缺点:测量速度较慢,和算术平均滤波法一样,比较浪费RAM。

#define N 12
 
char filter()
{
   char count,i,j;
   char value_buf[N];
   int  sum=0;
   for  (count=0;count<N;count++)
   {
      value_buf[count] = get_ad();
      delay();
   }
   for (j=0;j
   {
      for (i=0;ij;i++)
      {
         if ( value_buf[i]>value_buf[i+1] )
         {
            temp = value_buf[i];
            value_buf[i] = value_buf[i+1];
             value_buf[i+1] = temp;
         }
      }
   }
   for(count=1;count
      sum += value[count];
   return (char)(sum/(N-2));
}

 

6、一阶滞后滤波法

优点:对周期性干扰具有良好的抑制作用,适用于波动频率较高的场合。

缺点: 相位滞后,灵敏度低,滞后程度取决于a值大小,不能消除滤波频率高于采样频率的1/2的干扰信号。

 

/* 为加快程序处理速度假定基数为100,a=0~100 */

#define a 50
 
char value;
 
char filter()
{
   char  new_value;
   new_value = get_ad();
   return (100-a)*value + a*new_value;
}

7 加权递推平均滤波法

优点:适用于有较大纯滞后时间常数的对象和采样周期较短的系统。

缺点:对于纯滞后时间常数较小,采样周期较长,变化缓慢的信号不能迅速反应系统当前所受干扰的严重程度,滤波效果差。

 

/* coe数组为加权系数表,存在程序存储区。*/

#define N 12
char code coe[N] = {1,2,3,4,5,6,7,8,9,10,11,12};
char code sum_coe = 1+2+3+4+5+6+7+8+9+10+11+12;
char filter()
{
   char count;
   char value_buf[N];
   int  sum=0;
   for (count=0,count<N;count++)
   {
      value_buf[count] = get_ad();
      delay();
   }
   for (count=0,count<N;count++)
      sum += value_buf[count]*coe[count];
   return (char)(sum/sum_coe);
}

8、消抖滤波法

优点:对于变化缓慢的被测参数有较好的滤波效果,可避免在临界值附近控制器的反复开/关跳动或显示器上数值抖动。

 缺点:对于快速变化的参数不宜,如果在计数器溢出的那一次采样到的值恰好是干扰值,则会将干扰值当作有效值导入系统。

 

#define N 12
char filter()
{
   char count=0;
   char new_value;
   new_value = get_ad();
   while (value !=new_value);
   {
      count++;
      if (count>=N)   return new_value;
       delay();
      new_value = get_ad();
   }
   return value;   
}