打印

DSP软件开发中常用的8种软件滤波方法示例程序分享

[复制链接]
810|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
FCCdsp|  楼主 | 2017-10-26 11:02 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
DSP软件开发中常用的8种软件滤波方法示例程序分享


假定从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、一阶滞后滤波法
/* 为加快程序处理速度假定基数为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;   
  • }

复制代码

相关帖子

沙发
zhangbo1985| | 2017-10-27 14:08 | 只看该作者
滤波算法的处理还是蛮重要的

使用特权

评论回复
板凳
apple武| | 2017-10-30 19:45 | 只看该作者
感觉第一个滤波算法是不是少句话,少句value=new value那???

使用特权

评论回复
地板
apple武| | 2017-10-30 19:46 | 只看该作者
我在大道至简那本书上面看到过这个滤波算法,感觉还是蛮好的,尤其是一阶,现在就在用~~

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

967

主题

1447

帖子

9

粉丝