留学资讯 一手掌握

CS编程中有哪些常用的数字滤波算法

时间: 2018-08-03 文章来源: 洋蜜蜂

CS编程中,单片机进行数据采集处理中,会产生随机误差。为了克服随机干扰引起的误差,经常在硬件上采用滤波技术,软件上采用软件算法实现数字滤波。下面洋蜜蜂CS编程辅导教育机构给大家列举出10种简单易用的数字滤波算法,希望能够帮到大家。

假定从8位AD中读取数据(如果是更高位的AD可定义数据类型为int),子程序为get_ad();

 

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<N-1;j++)

   {

      for (i=0;i<N-j;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、递推平均滤波法(又称滑动平均滤波法)

/*

*/

#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、中位值平均滤波法(又称防脉冲干扰平均滤波法)

/*

*/

#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<N-1;j++)

   {

      for (i=0;i<N-j;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<N-1;count++)

      sum += value[count];

   return (char)(sum/(N-2));

}


6、限幅平均滤波法

/*

*/  

参考子程序1、3

 

7、一阶滞后滤波法

/* 为加快程序处理速度假定基数为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;

}


8、加权递推平均滤波法

/* 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);

}


9、消抖滤波法

#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;    

}


10、限幅消抖滤波法

/*

*/

参考子程序1、9

以上是使用比较频繁的数字滤波算法,学习C语言编程的同学可以多加以运用。滤波算法往往是系统测控算法的一个重要组成部分,实时性非常强。并且我们学习的数字滤波算法无需其他的硬件成本,多输入通道共用一个滤波程序,节约成本。在单片机上常用的算法有限幅滤波法、中值滤波法、算术平均滤波法等等,有不懂的同学可以找洋蜜蜂CS留学在线教育辅导的哦。