51/AVR单片机技术驿站!  <在线翻译>     便利工具    特色网址   无弹窗、无插件的绿色站点...  英才招聘   学历查询  喜欢>>收藏我站 

当前位置:首页 > 单片机源码 > 详细内容
10种软件滤波方法的示例程序
发布时间:2009/7/31  阅读次数:3338  字体大小: 【】 【】【
假定从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>value_buf[i+1] )
              {
                   temp = value_buf;
                   value_buf = 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>value_buf[i+1] )
              {
                   temp = value_buf;
                   value_buf = 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

11、IIR滤波例子

int   BandpassFilter4(int InputAD4)
{
      int   ReturnValue;
      int   ii;
      RESLO=0;
      RESHI=0;
      MACS=*PdelIn;
      OP2=1068; //FilterCoeff4[4];
      MACS=*(PdelIn+1);
      OP2=8;      //FilterCoeff4[3];
      MACS=*(PdelIn+2);
      OP2=-2001;//FilterCoeff4[2];
      MACS=*(PdelIn+3);
      OP2=8;      //FilterCoeff4[1];
      MACS=InputAD4;
      OP2=1068; //FilterCoeff4[0];
      MACS=*PdelOu;
      OP2=-7190;//FilterCoeff4[8];
      MACS=*(PdelOu+1);
      OP2=-1973; //FilterCoeff4[7];
      MACS=*(PdelOu+2);
      OP2=-19578;//FilterCoeff4[6];
      MACS=*(PdelOu+3);
      OP2=-3047; //FilterCoeff4[5];
      *p=RESLO;
      *(p+1)=RESHI;
      mytestmul<<=2;
      ReturnValue=*(p+1);
      for   (ii=0;ii<3;ii++)
      {
        DelayInput[ii]=DelayInput[ii+1];
        DelayOutput[ii]=DelayOutput[ii+1];
        }
        DelayInput[3]=InputAD4;
        DelayOutput[3]=ReturnValue;
        
     //   if (ReturnValue<0)
     //   {
     //   ReturnValue=-ReturnValue;
     //   }
      return ReturnValue;   
}
我要评论
  • 匿名发表
  • [添加到收藏夹]
  • 发表评论:(匿名发表无需登录,已登录用户可直接发表。) 登录状态:未登录
最新评论
所有评论[0]
    暂无已审核评论!

网站导航 管理登陆 ┊ 免责声明 问题反馈  友链说明
本站部分内容来自网络共享资源,如有冒犯您的权利请来信告之删除或纠正!
不得对本站进行复制、盗链或镜像,转载内容须获得同意或授权;欢迎友情链接、站务合作!

    我要报警 Alexa
 mcusy_cn#126.com (请把#改成@) 交流:522422171
本站学习交流群:138..158(高级群1-)、77930286(高级群2)、61804809(群3)
Copyright© MCUSY All Rights Reserved
本站网警备案号: WZ36040002485
  ICP备案证书号:粤ICP备09034963号