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

2019-07-14 21:37发布

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;   
  • }

复制代码

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
1条回答
apple武
1楼-- · 2019-07-15 06:31
我在大道至简那本书上面看到过这个滤波算法,感觉还是蛮好的,尤其是一阶,现在就在用~~

一周热门 更多>