单片机学习小组
直播中

陈军

7年用户 208经验值
私信 关注

数字滤波C程序分享

/*******************限幅滤波*******************/
#define A 10      //A值可根据实际情况调整
char value;       //value为有效值
char filter()
{
     char new_value;   //new value为当前采样值
     new value=get_ad();
     if ((new_value-value>A)‖(value-new_value> A)
     return value;
     return new_value;
}
/*******************中位值滤波*******************/
#define N 11      //N值可根据实际情况调整
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+1])
             {
                 temp=value_buf;
                 value_buf=value_buf[i+1];
                 value_buf[i+1]=temp;
             }
         }
     }
     return value_buf[(N-1)/2];   //取中间值
}
/*******************算术平均滤波*******************/
#define N 12
char filter()
{
     int sum=0;
     for(count=0;count      {
         sum+=get_ad();
         delay();
     }
     return (char)(sum/N);
}

/*******************去极值平均滤波*******************/
#define N 11      //N值可根据实际情况调整
int sum=0;
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+1])
             {
                 temp=value_buf;
                 value_buf=value_buf[i+1];
                 value_buf[i+1]=temp;
             }
         }
     }
     for(count=1;count<(N-1);count++)    //去掉第一个和末一个数
     {
         sum+=value_buf[count];
         delay();
     }
     return (char)(sum/(N-2));
}
/*******************移动平均滤波(递推平均滤波)*******************/
#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          sum+=value_buf[count];
     return (char)(sum/N)
}

/*******************加权平均滤波*******************/
#define N 12
char code jq[N]={1,2,3,4,5,6,7,8,9,10,11,12};//加权系数表
char code sum_jq=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      {
         value_buf[count]=get_ad();    //获取采样值
         delay();
     }
     for (count=0;count          sum+=value_buf[count]*jq[count];
     return (char)(sum/sum_jq);
}

/*******************低通滤波*******************/
#define a  0.25
char value;       //value为已有值
char filter()
{
     char new_value;   //new value为当前采样值
     new_value=get_ad();
     return (a*new_value+(1-a)*value);
}

更多回帖

发帖
×
20
完善资料,
赚取积分