lzh电子论坛

欢迎来到lzh电子论坛:
如果您对电子技术感兴趣就加入我们吧!在这里互相交流互相学习!主要讨论的方向有:单片机,ARM,PCB板设计,FPGA,汇编,C/C++等方面。
-----lzh电子论坛
lzhbbs.top-me.com
lzh电子论坛

电子的道路是孤独的,要懂得左手温暖右手,要懂得把debug当作快乐去欣赏,去享受,那样你才会成功...

欢迎访问lzh电子论坛。可通过【谷歌,SOSO,搜狗】搜索“lzh电子论坛”直接进入论坛。点击了解论坛详细制度


    十大滤波算法程序大全(精心整理版)

    分享
    avatar
    天空的殇
    论坛版主
    论坛版主

    帖子数 : 2
    威望 : 1
    注册日期 : 12-11-24
    年龄 : 24

    十大滤波算法程序大全(精心整理版)

    帖子 由 天空的殇 于 2013-09-23, 12:25 am

    十大滤波算法程序大全(精心整理版)
     


    1、限幅滤波法

    *优点:能有效克服因偶然因素引起的脉冲干扰
    *缺点:无法抑制那种周期性的干扰,且平滑度差


    2、中位值滤波法

    *优点:能有效克服因偶然因素引起的波动干扰;对温度、液
           位等变化缓慢的被测参数有良好的滤波效果
    *缺点:对流量,速度等快速变化的参数不宜


    3、算术平均滤波法

    优点:试用于对一般具有随机干扰的信号进行滤波。这种信号的特点是
          有一个平均值,信号在某一数值范围附近上下波动。
    缺点:对于测量速度较慢或要求数据计算较快的实时控制不适用。


    4、递推平均滤波法(又称滑动平均滤波法)

    优点:对周期性干扰有良好的抑制作用,平滑度高;试用于高频振荡的系统
    缺点:灵敏度低;对偶然出现的脉冲性干扰的抑制作用较差,不适于脉冲干扰较严重的场合\


    5、中位值平均滤波法(又称防脉冲干扰平均滤波法)

    优点:融合了两种滤波的优点。对于偶然出现的脉冲性干扰,可消
    除有其引起的采样值偏差。对周期干扰有良好的抑制作平滑度高,适于高频振荡的系统。


    缺点:测量速度慢

    6、递推中位值滤波法
    /************************************************
     
    优点:对于偶然出现的脉冲性干扰,可消除由其引起的采样值偏差。对周期性干扰有良好的抑制作用,平滑度高;试用于高频振荡的系统
     缺点:测量速度慢
    *************************************************/


    7、限幅平均滤波法

    /************************************************
     
    优点:对于偶然出现的脉冲性干扰,可消除有其引起的采样值偏差。
    *************************************************/


    8、一阶滞后滤波法

    9、加权递推平均滤波法

    10、消抖滤波法

    1、限幅滤波法

    代码:
    /*函数名称:AmplitudeLimiterFilter()-限幅滤波法
    *优点:能有效克服因偶然因素引起的脉冲干扰
    *缺点:无法抑制那种周期性的干扰,且平滑度差
    *说明:
      1、调用函数
         GetAD(),该函数用来取得当前值
      2、变量说明
         Value:最近一次有效采样的值,该变量为全局变量
        
    NewValue:当前采样的值
        
    ReturnValue:返回值
     
    3、常量说明
        
    A:两次采样的最大误差值,该值需要使用者根据实际情况设置
    *入口:Value,上一次有效的采样值,在主程序里赋值
    *出口:ReturnValue,返回值,本次滤波结果
    ****************************************************/
    #define 
    A   10
    unsigned char Value
    unsigned char
    AmplitudeLimiterFilter()
    {
       unsigned char NewValue;
       unsigned char
    ReturnValue;
       NewValue=GatAD();
      
    if(((NewValue-Value)>A))||((Value-NewValue)>A)))
      
    ReturnValue=Value;
       else ReturnValue=NewValue;
      
    return(ReturnValue);
    }

     

    2、中位值滤波法

    代码:
    /****************************************************
    *函数名称:MiddlevalueFilter()-中位值滤波法
    *优点:能有效克服因偶然因素引起的波动干扰;对温度、液
          
    位等变化缓慢的被测参数有良好的滤波效果
    *缺点:对流量,速度等快速变化的参数不宜
    *说明:
      1、调用函数
         GetAD(),该函数用来取得当前值
         Delay(),基本延时函数
      2、变量说明
        
    ArrDataBuffer[N]:用来存放一次性采集的N组数据
         Temp:完成冒泡法试用的临时寄存器
         i,j,k:循环试用的参数值
      3、常量说明
         N:数组长度
    *入口:
    *出口:value_buf[(N-1)/2],返回值,本次滤波结果
    *****************************************************/

    #define N 11

    unsigned char
    MiddlevalueFilter()

    {
      unsigned char value_buf[N];
      unsigned char
    i,j,k,temp;
      for(i=0;i<N;i++)
      {
        value_buf[i] =
    get_ad();
        delay();
      }
      for (j=0;j<N-1;j++)
      {
       for
    (k=0;k<N-j;k++)
       {
        if(value_buf[k]>value_buf[k+1])
        
    {
           temp = value_buf[k];
           value_buf[k] =
    value_buf[k+1];
           value_buf[k+1] = temp;
         }
       }
      }
     
    return value_buf[(N-1)/2];
    }


    3
    、算术平均滤波法

    代码:
    /*********************************************************
    说明:连续取N个采样值进行算术平均运算
    优点:试用于对一般具有随机干扰的信号进行滤波。这种信号的特点是
          有一个平均值,信号在某一数值范围附近上下波动。
    缺点:对于测量速度较慢或要求数据计算较快的实时控制不适用。
    **********************************************************/

    #define N 12

    char filter()
    {
      unsigned int sum = 0;
     
    unsigned char i;

      for
    (i=0;i<N;i++)
      {
        sum + = get_ad();
        delay();
      }
     
    return(char)(sum/N);
    }



    4、递推平均滤波法(又称滑动平均滤波法)

    代码:
    /***************************************************
    说明:把连续N个采样值看成一个队列,队列长度固定为N。
          每次采样到一个新数据放入队尾,并扔掉队首的一
         
    次数据。把队列中的N各数据进行平均运算,既获得
          新的滤波结果。
    优点:对周期性干扰有良好的抑制作用,平滑度高;试用于高频振荡的系统
    缺点:灵敏度低;对偶然出现的脉冲性干扰的抑制作用较差,不适于脉冲干扰较严重的场合
    ****************************************************/

    #define N 12

    unsigned char
    value_buf[N];

    unsigned
    char filter()
    {
      unsigned char i;
      unsigned char value;
      int
    sum=0;

      value_buf[i++] =
    get_ad();       //采集到的数据放入最高位
     
    for(i=0;i<N;i++)
      {
        value_buf[i]=value_buf[i+1];   //所有数据左移,低位扔掉
        sum +=
    value_buf[i];
      }
      value = sum/N;
      return(value);
    }



    5、中位值平均滤波法(又称防脉冲干扰平均滤波法)

    代码:
    /********************************************
     说明:采一组队列去掉最大值和最小值
     优点:融合了两种滤波的优点。对于偶然出现的脉冲性干扰,可消除有其引起的采样值偏差。对周期干扰有良好的抑制作用,平滑度高,适于高频振荡的系统。
     缺点:测量速度慢
    *********************************************/

    #define N 12

    uchar filter()

    {
      unsigned char i,j,k,l;
      unsigned char
    temp,sum=0,value;
      unsigned char value_buf[N],;

      for(i=0;i<N;i++)
      {
        value_buf[i] =
    get_ad();
        delay();
      }
      //采样值从小到大排列(冒泡法)
     
    for(j=0;j<N-1;j++)
      {
        for(i=0;i<N-j;i++)
        {
         
    if(value_buf[i]>value_buf[i+1])
          {
            temp =
    value_buf[i];
            value_buf[i] = value_buf[i+1];
           
    value_buf[i+1] = temp;
          }
        }
      }

      for(i=1;i<N-1;i++)
      sum +=
    value_buf[i];

      value =
    sum/(N-2);
      return(value);
    }



    6、递推中位值滤波法

    代码:
    /************************************************
     优点:对于偶然出现的脉冲性干扰,可消除由其引起的采样值偏差。对周期性干扰有良好的抑制作用,平滑度高;试用于高频振荡的系统
     缺点:测量速度慢
    *************************************************/

    char filter(char new_data,char queue[],char
    n)
    {
      char max,min;
      char sum;
      char
    i;

     
    queue[0]=new_data;
      max=queue[0];
      min=queue[0];
     
    sum=queue[0];

     
    for(i=n-1;i>0;i--)
      {
        if(queue[i]>max)
       
    max=queue[i];
        else if (queue[i]<min)
        min=queue[i];
       
    sum=sum+queue[i];
        queue[i]=queue[i-1];
      }

      i=n-2;
      sum=sum-max-min+i/2;    
    //说明:+i/2的目的是为了四舍五入
     
    sum=sum/i;

     
    return(sum);
    }



    7、限幅平均滤波法

    代码:
    /************************************************
     优点:对于偶然出现的脉冲性干扰,可消除有其引起的采样值偏差。
    *************************************************/
    #define A
    10
    #define N 12

    unsigned char data[];
    unsigned char filter(data[])
    {
     
    unsigned char i;
      unsigned char value,sum;

      data[N]=GetAD();
     
    if(((data[N]-data[N-1])>A||((data[N-1]-data[N])>A))
     
    data[N]=data[N-1];
      //else data[N]=NewValue;
      for(i=0;i<N;i++)
     
    {
        data[i]=data[i+1];
        sum+=data[i];
      }
      value=sum/N;
     
    return(value);
    }




    8
    、一阶滞后滤波法

     
    代码:
    /****************************************************
    *函数名称:filter()-一阶滞后滤波法
    *说明:
     
    1、调用函数
        
    GetAD(),该函数用来取得当前值
        
    Delay(),基本延时函数
     
    2、变量说明
        
    Or_data[N]:采集的数据
        
    Dr0_flag、Dr1_flag:前一次比较与当前比较的方向位
         coeff:滤波系数
         F_count:滤波计数器
      3、常量说明
         N:数组长度
         Thre_value:比较门槛值
    *入口:
    *出口:
    *****************************************************/

    #define Thre_value  10
    #define  N  
    50

    float
    Or_data[N];
    unsigned char Dr0_flag=0,Dr1_flag=0;

    void abs(float first,float second)
    {
     float
    abs;
     if(first>second)
     {
       abs=first-second;
      
    Dr1_flag=0;
     }
     else
     {
       abs=second-first;
      
    Dr1_flag=1;
     }
     return(abs);


    void filter(void)
    {
      uchar
    i=0,F_count=0,coeff=0;
      float Abs=0.00;

      //确定一阶滤波系数
     
    for(i=1;i<N;i++)
        {
          Abs=abs(Or_data[i-1],Or_data[i]);
         
    if(!(Dr1_flag^Dr0_flag))                    //前后数据变化方向一致
          { 
           
    F_count++;
            if(Abs>=Thre_value)
            {
             
    F_count++;
              F_count++;
            }
           
    if(F_count>=12)
            F_count=12;
            coeff=20*F_count;  
          }
          else                                        //去抖动
          coeff=5;
         
    //一阶滤波算法
         
    if(Dr1_flag==0)                             //当前值小于前一个值
         
    Or_data[i]=Or_data[i-1]-coeff*(Or_data[i-1]-Or_data[i])/256;
         
    else
          Or_data[i]=Or_data[i-1]+coeff*(Or_data[i]-Or_data[i-1])/256;   
          
          F_count=0;                                  //滤波计数器清零
         
    Dr0_flag=Dr1_flag;
        }
    }




    9、加权递推平均滤波法
     
    代码:
    /************************************************************
     coe:数组为加权系数表,存在程序存储区。
     sum_coe:加权系数和
     ************************************************************/

    #define N 12

    const char code coe[N] =
    {1,2,3,4,5,6,7,8,9,10,11,12};
    const char code sum_coe =
    1+2+3+4+5+6+7+8+9+10+11+12;

    unsigned char filter()
    {
      unsigned char i;
      unsigned
    char value_buf[N];
      int sum=0;

      for (i=0;i<N;i++)
      {
        value_buf[i] =
    get_ad();
        delay();
      }

      for (i=0,i<N;i++)
      {
       
    value_buf[i]=value_buf[i+1];
        sum += value_buf[i]*coe[i];
     
    }

      sum/=sum_coe;
     
    value=sum/N;
      return(value);
    }



    10、消抖滤波法

    代码:
    /************************************************

    *************************************************/
    #define N
    12

    unsigned char
    filter()
    {
      unsigned char i=0;
      unsigned char new_value;
     
    new_value = get_ad();
      if(value !=new_value);
      {
        i++;
        if
    (i>N)
        {
          i=0;
          value=new_value;
        }
      }
     
    else i=0;
      return(value);
    }


     
    avatar
    Admin
    管理员
    管理员

    帖子数 : 869
    威望 : 15
    注册日期 : 12-11-23
    年龄 : 25

    回复: 十大滤波算法程序大全(精心整理版)

    帖子 由 Admin 于 2013-09-23, 12:45 am

    俺来顶一下,,希望都能用会这些
    avatar
    aiMM
    中级会员
    中级会员

    帖子数 : 46
    威望 : 0
    注册日期 : 13-05-06

    回复: 十大滤波算法程序大全(精心整理版)

    帖子 由 aiMM 于 2013-10-25, 12:07 pm

    看看,运用算法——
    avatar
    寒夜
    中级会员
    中级会员

    帖子数 : 34
    威望 : 0
    注册日期 : 13-04-22

    回复: 十大滤波算法程序大全(精心整理版)

    帖子 由 寒夜 于 2013-12-31, 1:30 am

    利用光敏电阻测光强时候,ad采样中,这些虑波算法选哪个好啊?求高手指点…
    avatar
    Admin
    管理员
    管理员

    帖子数 : 869
    威望 : 15
    注册日期 : 12-11-23
    年龄 : 25

    回复: 十大滤波算法程序大全(精心整理版)

    帖子 由 Admin 于 2014-01-07, 7:38 pm

    寒夜 写道::利用光敏电阻测光强时候,ad采样中,这些虑波算法选哪个好啊?求高手指点…

    这个,,不知道。中位值平均滤波咋样

      目前的日期/时间是2018-07-22, 2:57 am