10种AD采样的软件滤波方法

假定从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
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值