精华内容
下载资源
问答
  • 常用数字滤波算法 第1种方法:限幅滤波法(又称程序判断滤波法)  A方法: 根据经验判断,确定两次采样允许的最大偏差值(设为A),每次检测到新值时判断: 如果本次值与上次值之差<=A,则本次值有效,如果...

    常用数字滤波算法

    第1种方法:限幅滤波法(又称程序判断滤波法)

      A方法: 根据经验判断,确定两次采样允许的最大偏差值(设为A),每次检测到新值时判断: 如果本次值与上次值之差<=A,则本次值有效,如果本次值与上次值之差>A,则本次值无效,放弃本次值,用上次值代替本次值。

      B优点: 能有效克服因偶然因素引起的脉冲干扰。

      C缺点: 无法抑制那种周期性的干扰,平滑度差。

    第2种方法:中位值滤波法

      A方法: 连续采样N次(N取奇数),把N次采样值按大小排列,取中间值为本次有效值。

      B优点: 能有效克服因偶然因素引起的波动干扰,对温度、液位的变化缓慢的被测参数有良好的滤波效果。

      C缺点: 对流量、速度等快速变化的参数不宜。

    第3种方法:算术平均滤波法

      A方法: 连续取N个采样值进行算术平均运算,N值较大时:信号平滑度较高,但灵敏度较低;N值较小时:信号平滑度较低,但灵敏度较高。N值的选取:一般流量,N=12;压力:N=4。

      B优点: 适用于对一般具有随机干扰的信号进行滤波,这样信号的特点是有一个平均值,信号在某一数值范围附近上下波动。

      C缺点: 对于测量速度较慢或要求数据计算速度较快的实时控制不适用,比较浪费RAM 。

    第4种方法:递推平均滤波法(又称滑动平均滤波法)

      A方法: 把连续取N个采样值看成一个队列,队列的长度固定为N,每次采样到一个新数据放入队尾,并扔掉原来队首的一次数据(先进先出原则) 。把队列中的N个数据进行算术平均运算,就可获得新的滤波结果。N值的选取:流量,N=12;压力:N=4;液面,N=4~12;温度,N=1~4。

      B优点: 对周期性干扰有良好的抑制作用,平滑度高,适用于高频振荡的系统。

      C缺点: 灵敏度低,对偶然出现的脉冲性干扰的抑制作用较差,不易消除由于脉冲干扰所引起的采样值偏差,不适用于脉冲干扰比较严重的场合,比较浪费RAM。

    第5种方法:中位值平均滤波法(又称防脉冲干扰平均滤波法)

      A方法: 相当于“中位值滤波法”+“算术平均滤波法”,连续采样N个数据,去掉一个最大值和一个最小值,然后计算N-2个数据的算术平均值。N值的选取:3~14。

      B优点: 融合了两种滤波法的优点,对于偶然出现的脉冲性干扰,可消除由于脉冲干扰所引起的采样值偏差。

      C缺点: 测量速度较慢,和算术平均滤波法一样,比较浪费RAM。

    第6种方法:限幅平均滤波法

      A方法: 相当于“限幅滤波法”+“递推平均滤波法”,每次采样到的新数据先进行限幅处理,再送入队列进行递推平均滤波处理。

      B优点: 融合了两种滤波法的优点,对于偶然出现的脉冲性干扰,可消除由于脉冲干扰所引起的采样值偏差。

      C缺点: 比较浪费RAM 。

    第7种方法:一阶滞后滤波法

      A方法: 取a=0~1,本次滤波结果=(1-a)*本次采样值+a*上次滤波结果。

      B优点: 对周期性干扰具有良好的抑制作用,适用于波动频率较高的场合。

      C缺点:相位滞后,灵敏度低,滞后程度取决于a值大小,不能消除滤波频率高于采样频率的1/2的干扰信号。

    第8种方法:加权递推平均滤波法

      A方法: 是对递推平均滤波法的改进,即不同时刻的数据加以不同的权,通常是,越接近现时刻的资料,权取得越大,给予新采样值的权系数越大,则灵敏度越高,但信号平滑度越低。

      B优点: 适用于有较大纯滞后时间常数的对象和采样周期较短的系统。

      C缺点: 对于纯滞后时间常数较小,采样周期较长,变化缓慢的信号,不能迅速反应系统当前所受干扰的严重程度,滤波效果差。

    第9种方法:消抖滤波法

      A方法: 设置一个滤波计数器,将每次采样值与当前有效值比较: 如果采样值=当前有效值,则计数器清零。如果采样值<>当前有效值,则计数器+1,并判断计数器是否>=上限N(溢出),如果计数器溢出,则将本次值替换当前有效值,并清计数器。

      B优点: 对于变化缓慢的被测参数有较好的滤波效果,可避免在临界值附近控制器的反复开/关跳动或显示器上数值抖动。

      C缺点: 对于快速变化的参数不宜,如果在计数器溢出的那一次采样到的值恰好是干扰值,则会将干扰值当作有效值导入系统。

    第10种方法:限幅消抖滤波法

      A方法: 相当于“限幅滤波法”+“消抖滤波法”,先限幅后消抖。

      B优点: 继承了“限幅”和“消抖”的优点,改进了“消抖滤波法”中的某些缺陷,避免将干扰值导入系统。

      C缺点: 对于快速变化的参数不宜。

    第11种方法:IIR 数字滤波器

      A方法: 确定信号带宽, 滤之。 Y(n) = a1*Y(n-1) + a2*Y(n-2) + ... + ak*Y(n-k) + b0*X(n) + b1*X(n-1) + b2*X(n-2) + ... + bk*X(n-k)。

      B优点: 高通,低通,带通,带阻任意。设计简单(用matlab)。

      C缺点: 运算量大。

     

    还有比较简单的博文:

    http://blog.csdn.net/dageda1111/article/details/39232963

    http://blog.csdn.net/wangweijjj/article/details/51721191

     

     

    软件滤波的C程序样例

    10种软件滤波方法的示例程序

    假定从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;  
    }

    转载于:https://www.cnblogs.com/mikawong/p/7676221.html

    展开全文
  • 常用数字滤波算法总结

    千次阅读 2019-04-11 19:15:13
    常用数字滤波算法总结 在单片机进行数据采集时,会遇到数据的随机误差,随机误差是由随机干扰引起的,其特点是在相同条件下测量同一量时,其大小和符号会现无规则的变化而无法预测,但多次测量的结果符合统计规律。...

    常用数字滤波算法总结

    在单片机进行数据采集时,会遇到数据的随机误差,随机误差是由随机干扰引起的,其特点是在相同条件下测量同一量时,其大小和符号会现无规则的变化而无法预测,但多次测量的结果符合统计规律。为克服随机干扰引起的误差,硬件上可采用滤波技术,软件上可采用软件算法实现数字滤波。滤波算法往往是系统测控算法的一个重要组成部分,实时性很强。

    采用数字滤波算法克服随机干扰的误差具有以下优点:

    1、数字滤波无需其他的硬件成本,只用一个计算过程,可靠性高,不存在阻抗匹配问题。尤其是数字滤波可以对频率很低的信号进行滤波,这是模拟滤波器做不到的。

    2、数字滤波使用软件算法实现,多输入通道可共用一个滤波程序,降低系统开支。

    3、只要适当改变滤波器的滤波程序或运算,就能方便地改变其滤波特性,这对于滤除低频干扰和随机信号会有较大的效果。

    4、在单片机系统中常用的滤波算法有限幅滤波法、中值滤波法、算术平均滤波法、加权平均滤波法、滑动平均滤波等。

    (1)限幅滤波算法

    该运算的过程中将两次相邻的采样相减,求出其增量,然后将增量的绝对值,与两次采样允许的最大差值A进行比较。A的大小由被测对象的具体情况而定,如果小于或等于允许的最大差值,则本次采样有效;否则取上次采样值作为本次数据的样本。

    算法的程序代码如下:

    #defineA //允许的最大差值

    chardata; //上一次的数据

    char filter()

    {

    chardatanew; //新数据变量

    datanew=get_data(); //获得新数据变量

    if((datanew-data)>A||(data-datanew>A))

    return data;

    else

    returndatanew;

    }

    说明:限幅滤波法主要用于处理变化较为缓慢的数据,如温度、物体的位置等。使用时,关键要选取合适的门限制A。通常这可由经验数据获得,必要时可通过实验得到。

    (2)中值滤波算法

    该运算的过程是对某一参数连续采样N次(N一般为奇数),然后把N次采样的值按从小到大排列,再取中间值作为本次采样值,整个过程实际上是一个序列排序的过程。

    算法的程序代码如下:

    #define N11 //定义获得的数据个数

    char filter()

    {

    charvalue_buff[N]; //定义存储数据的数组

    char count,i,j,temp;

    for(count=0;count

    {

    value_buf[count]=get_data();

    delay(); //如果采集数据比较慢,那么就需要延时或中断

    }

    for(j=0;j

    {

    for(value_buff[i]>value_buff[i+1]

    {

    temp=value_buff[i];

    value_buff[i]=value_buff[i+1];

    value_buff[i+1]=temp;

    }

    }

    returnvalue_buff[(N-1)/2];

    }

    说明:中值滤波比较适用于去掉由偶然因素引起的波动和采样器不稳定而引起的脉动干扰。若被测量值变化比较慢,采用中值滤波法效果会比较好,但如果数据变化比较快,则不宜采用此方法。

    (3)算术平均滤波算法

    该算法的基本原理很简单,就是连续取N次采样值后进行算术平均。

    算法的程序代码如下:

    char filter()

    {

    int sum=0;

    for(count=0;count

    {

    sum+=get_data();

    delay():

    }

    return (char)(sum/N);

    }

    说明:算术平均滤波算法适用于对具有随机干扰的信号进行滤波。这种信号的特点是有一个平均值,信号在某一数值附近上下波动。信号的平均平滑程度完全到决于N值。当N较大时,平滑度高,灵敏度低;当N较小时,平滑度低,但灵敏度高。为了方便求平均值,N一般取4、8、16、32之类的2的整数幂,以便在程序中用移位操作来代替除法。

    (4)加权平均滤波算法

    由于前面所说的“算术平均滤波算法”存在平滑度和灵敏度之间的矛盾。为了协调平滑度和灵敏度之间的关系,可采用加权平均滤波。它的原理是对连续N次采样值分别乘上不同的加权系数之后再求累加,加权系数一般先小后大,以突出后面若干采样的效果,加强系统对参数变化趋势的认识。各个加权系数均小于1的小数,且满足总和等于1的结束条件。这样加权运算之后的累加和即为有效采样值。其中加权平均数字滤波的数学模型是:

    式中:D为N个采样值的加权平均值:XN-i为第N-i次采样值;N为采样次数;Ci为加权系数。加权系数Ci体现了各种采样值在平均值中所占的比例。一般来说采样次数越靠后,取的比例越大,这样可增加新采样在平均值中所占的比重。加权平均值滤波法可突出一部分信号抵制另一部分信号,以提高采样值变化的灵敏度。

    样例程序代码如下:

    char codejq[N]={1,2,3,4,5,6,7,8,9,10,11,12}; //code数组为加权系数表,存在程序存储区

    char codesum_jq=1+2+3+4+5+6+7+8+9+10+11+12;

    char filter()

    {

    char count;

    char value_buff[N];

    int sum=0;

    for(count=0;count

    {

    value_buff[count]=get_data();

    delay();

    }

    for(count=0;count

    sum+=value_buff[count]*jq[count];

    return(char)(sum/sum_jq);

    }

    (5)滑动平均滤波算法

    以上介绍和各种平均滤波算法有一个共同点,即每获取一个有效采样值必须连续进行若干次采样,当采速度慢时,系统的实时得不到保证。这里介绍的滑动平均滤波算法只采样一次,将一次采样值和过去的若干次采样值一起求平均,得到的有效采样值即可投入使用。如果取N个采样值求平均,存储区中必须开辟N个数据的暂存区。每新采集一个数据便存入暂存区中,同时去掉一个最老数据,保存这N个数据始终是最新更新的数据。采用环型队列结构可以方便地实现这种数据存放方式。

    程序代码如下:

    char value_buff[N];

    char i=0;

    char filter()

    {

    char count;

    int sum=0;

    value_buff[i++]=get_data();

    if(i==N)

    i=0;

    for(count=0;count

    sum=value_buff[count];

    return (char)(sum/N);

    }

    (6)低通滤波

    将普通硬件RC低通滤波器的微分方程用差分方程来表求,变可以采用软件算法来模拟硬件滤波的功能,经推导,低通滤波算法如下:

    Yn=a* Xn+(1-a) *Yn-1

    式中 Xn——本次采样值

    Yn-1——上次的滤波输出值;

    ,a——滤波系数,其值通常远小于1;

    Yn——本次滤波的输出值。

    由上式可以看出,本次滤波的输出值主要取决于上次滤波的输出值(注意不是上次的采样值,这和加权平均滤波是有本质区别的),本次采样值对滤波输出的贡献是比较小的,但多少有些修正作用,这种算法便模拟了具体有教大惯性的低通滤波器功能。滤波算法的截止频率可用以下式计算:

    fL=a/2Pit pi为圆周率3.14…

    式中 a——滤波系数;

    , t——采样间隔时间;

    例如:当t=0.5s(即每秒2次),a=1/32时;

    fL=(1/32)/(23.140.5)=0.01Hz

    当目标参数为变化很慢的物理量时,这是很有效的。另外一方面,它不能滤除高于1/2采样频率的干搅信号,本例中采样频率为2Hz,故对1Hz以上的干搅信号应采用其他方式滤除,

    低通滤波算法程序于加权平均滤波相似,但加权系数只有两个:a和1-a。为计算方便,a取一整数,1-a用256-a,来代替,计算结果舍去最低字节即可,因为只有两项,a和1-a,均以立即数的形式编入程序中,不另外设表格。虽然采样值为单元字节(8位A/D)。为保证运算精度,滤波输出值用双字节表示,其中一个字节整数,一字节小数,否则有可能因为每次舍去尾数而使输出不会变化。

    设Yn-1存放在30H(整数)和31H(小数)两单元中,Yn存放在32H(整数)和33H(小数)中。滤波程序如下:

    展开全文
  • 常用数字滤波算法

    万次阅读 2017-05-25 16:19:49
    常用数字滤波算法 第1种方法:限幅滤波法(又称程序判断滤波法)  A方法: 根据经验判断,确定两次采样允许的最大偏差值(设为A),每次检测到新值时判断: 如果本次值与上次值之差A,则本次值无效,放弃...
    常用数字滤波算法 
    

    第1种方法:限幅滤波法(又称程序判断滤波法)

      A方法: 根据经验判断,确定两次采样允许的最大偏差值(设为A),每次检测到新值时判断: 如果本次值与上次值之差<=A,则本次值有效,如果本次值与上次值之差>A,则本次值无效,放弃本次值,用上次值代替本次值。

      B优点: 能有效克服因偶然因素引起的脉冲干扰。

      C缺点: 无法抑制那种周期性的干扰,平滑度差。

    第2种方法:中位值滤波法

      A方法: 连续采样N次(N取奇数),把N次采样值按大小排列,取中间值为本次有效值。

      B优点: 能有效克服因偶然因素引起的波动干扰,对温度、液位的变化缓慢的被测参数有良好的滤波效果。

      C缺点: 对流量、速度等快速变化的参数不宜。

    第3种方法:算术平均滤波法

      A方法: 连续取N个采样值进行算术平均运算,N值较大时:信号平滑度较高,但灵敏度较低;N值较小时:信号平滑度较低,但灵敏度较高。N值的选取:一般流量,N=12;压力:N=4。

      B优点: 适用于对一般具有随机干扰的信号进行滤波,这样信号的特点是有一个平均值,信号在某一数值范围附近上下波动。

      C缺点: 对于测量速度较慢或要求数据计算速度较快的实时控制不适用,比较浪费RAM 。

    第4种方法:递推平均滤波法(又称滑动平均滤波法)

      A方法: 把连续取N个采样值看成一个队列,队列的长度固定为N,每次采样到一个新数据放入队尾,并扔掉原来队首的一次数据(先进先出原则) 。把队列中的N个数据进行算术平均运算,就可获得新的滤波结果。N值的选取:流量,N=12;压力:N=4;液面,N=4~12;温度,N=1~4。

      B优点: 对周期性干扰有良好的抑制作用,平滑度高,适用于高频振荡的系统。

      C缺点: 灵敏度低,对偶然出现的脉冲性干扰的抑制作用较差,不易消除由于脉冲干扰所引起的采样值偏差,不适用于脉冲干扰比较严重的场合,比较浪费RAM。

    第5种方法:中位值平均滤波法(又称防脉冲干扰平均滤波法)

      A方法: 相当于“中位值滤波法”+“算术平均滤波法”,连续采样N个数据,去掉一个最大值和一个最小值,然后计算N-2个数据的算术平均值。N值的选取:3~14。

      B优点: 融合了两种滤波法的优点,对于偶然出现的脉冲性干扰,可消除由于脉冲干扰所引起的采样值偏差。

      C缺点: 测量速度较慢,和算术平均滤波法一样,比较浪费RAM。

    第6种方法:限幅平均滤波法

      A方法: 相当于“限幅滤波法”+“递推平均滤波法”,每次采样到的新数据先进行限幅处理,再送入队列进行递推平均滤波处理。

      B优点: 融合了两种滤波法的优点,对于偶然出现的脉冲性干扰,可消除由于脉冲干扰所引起的采样值偏差。

      C缺点: 比较浪费RAM 。

    第7种方法:一阶滞后滤波法

      A方法: 取a=0~1,本次滤波结果=(1-a)*本次采样值+a*上次滤波结果。

      B优点: 对周期性干扰具有良好的抑制作用,适用于波动频率较高的场合。

      C缺点:相位滞后,灵敏度低,滞后程度取决于a值大小,不能消除滤波频率高于采样频率的1/2的干扰信号。

    第8种方法:加权递推平均滤波法

      A方法: 是对递推平均滤波法的改进,即不同时刻的数据加以不同的权,通常是,越接近现时刻的资料,权取得越大,给予新采样值的权系数越大,则灵敏度越高,但信号平滑度越低。

      B优点: 适用于有较大纯滞后时间常数的对象和采样周期较短的系统。

      C缺点: 对于纯滞后时间常数较小,采样周期较长,变化缓慢的信号,不能迅速反应系统当前所受干扰的严重程度,滤波效果差。

    第9种方法:消抖滤波法

      A方法: 设置一个滤波计数器,将每次采样值与当前有效值比较: 如果采样值=当前有效值,则计数器清零。如果采样值<>当前有效值,则计数器+1,并判断计数器是否>=上限N(溢出),如果计数器溢出,则将本次值替换当前有效值,并清计数器。

      B优点: 对于变化缓慢的被测参数有较好的滤波效果,可避免在临界值附近控制器的反复开/关跳动或显示器上数值抖动。

      C缺点: 对于快速变化的参数不宜,如果在计数器溢出的那一次采样到的值恰好是干扰值,则会将干扰值当作有效值导入系统。

    第10种方法:限幅消抖滤波法

      A方法: 相当于“限幅滤波法”+“消抖滤波法”,先限幅后消抖。

      B优点: 继承了“限幅”和“消抖”的优点,改进了“消抖滤波法”中的某些缺陷,避免将干扰值导入系统。

      C缺点: 对于快速变化的参数不宜。

    第11种方法:IIR 数字滤波器

      A方法: 确定信号带宽, 滤之。 Y(n) = a1*Y(n-1) + a2*Y(n-2) + ... + ak*Y(n-k) + b0*X(n) + b1*X(n-1) + b2*X(n-2) + ... + bk*X(n-k)。

      B优点: 高通,低通,带通,带阻任意。设计简单(用matlab)。

      C缺点: 运算量大。

     

    部分程序:

    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、限幅消抖滤波法
    /*
    */

    展开全文
  • AD转换常用的10种数字滤波方法,并附有c语言实现功能,各有优缺点均有说明。
  • 1、中位值平均滤波法(又称防脉冲干扰平均滤波法) /******************************************** 说明:采一组队列去掉最大值和最小值 优点:融合了两种滤波的优点。对于偶然出现的脉冲性干扰,可消 除有其引起的...

    核心思想是多次样本求平均值,在求平均值之前剔除掉干扰值。干扰值一般是最大或最小,当然还可以扩大范围,将次大次小值也进行剔除。
    递推中位值滤波法还可以演变成即时的,获取AD值后立即处理,不进行缓存,进一步节省空间。
    1、中位值平均滤波法(又称防脉冲干扰平均滤波法)

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

    #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);
    }
    

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

    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);
    }
    
    展开全文
  • 常见的几种数字滤波算法及特点

    千次阅读 2020-04-04 18:57:17
    1. 均值滤波(算术平均,去极值平均,加权平均,滑动平均) 2.中值滤波 3.限幅滤波 4.限速滤波 5.惯性滤波 常用的排序方法
  • 数字滤波的定义和常用方法

    万次阅读 2017-06-05 15:39:21
    2.2常用滤波方法 1.算数平均值滤波  对某一被测参数在第 k 个采样时刻连续采样 n 次得到 n 个采样数据 xki ( i=1,2,…,n ),计算这n个数据的算数平均值作为本次滤波器的输出yk。   式中 yk 是第 k 次滤波器的...
  • 几种常用滤波方法

    万次阅读 2017-08-08 10:44:17
    第1种方法:限幅滤波法(又称程序判断滤波法) A方法: 根据经验判断,确定两次采样允许的最大偏差值(设为A),每次检测到新值时判断: 如果本次值与上次值之差A,则本次值无效,放弃本次值,用上次值代替本次值...
  • AD采集中常用数字滤波

    千次阅读 2019-04-13 21:18:01
    在AD采集中经常要用到数字滤波,而不同情况下又有不同的滤波需求,下面是10种经典的软件滤波方法的程序和优缺点分析: 1、限幅滤波法(又称程序判断滤波法) 2、中位值滤波法 3、算术平均滤波法 4、递推平均滤波法...
  • AD数字采样 采样滤波 常用软件滤波方法
  • B、方法: 相当于“限幅滤波法”+“递推平均滤波法”; 每次采样到的新数据先进行限幅处理, 再送入队列进行递推平均滤波处理。 C、优点: 融合了两种滤波法的优点; 对于偶然出现的脉冲性干扰,可消除由于脉冲...
  • 数字滤波常用的软件方法代码实例可以给软件开发人员提供在数字滤波方面用软件实现的方法,对提高软件开发速度有帮助。
  • 数字信号处理】十大经典软件滤波算法 2、matlab设计滤波器 经典滤波器的滤波思路是从频率域上将噪声滤掉,关键是设计相应的滤波器传递函数H(s)、H(z),分别对应着模拟滤波器和数字滤波器的实现。模拟滤波器主要...
  • 常用数字滤波方法都有哪些,写出其中三种数字经典滤波的概念,是根据傅里叶分析和变换提出的一个工程概念。根据高等数学理论,任何一个满足一定条件的信号,都可以被看成是由无限个正弦波叠加而成。换句话说,...
  • 数字滤波技术总结

    千次阅读 2019-04-08 21:41:22
    所谓数字滤波,就是通过一定的计算或判断程序减少干扰在有用信号中的比重。故实质上它是一种程序滤波。 所谓数字滤波,就是通过一定的计算或判断程序减少干扰在有用信号中的比重。故实质上它是一种程序滤波。 (1) ...
  • 数字滤波算法——程序判断滤波

    千次阅读 2021-09-28 20:24:02
    在实际生产中,相邻两次采样值之间的变化都有一个合理的限度。...这种由程序进行简单判断的数字滤波算法称为“程序判断滤波”,也称“限幅滤波”。相应程序如下: #define D 10 //相邻两次采样之间最大允许变化值
  • 数字滤波算法汇总与C语言实现

    千次阅读 2020-01-14 16:03:15
    滤波是信号分析与处理过程中的一个非常重要的环节,滤波的效果的好坏可以直接影响后续一系列的对信号的处理。滤波可以分为硬件滤波和数字滤波。后者由于稳定性好、灵活性...本文主要总结并比较几种常用数字滤波技术。
  • 通用数字滤波算法

    2021-03-14 22:31:57
    数字滤波是指利用数学的方法对原始数据进行处理,去掉原始数据中掺杂的噪声数据,获得最具有代表性的数据集合。数据采样是一种通过间接方法取得事物状态的技术,如将事物的温度、压力、流量等属性通过一定的转换技术将...
  • 数字滤波程序,方法,优缺点,几种常用数字滤波程序分析
  • 后者为随机信号,它不是周期信号,可用数字滤波方法予以消弱或滤除。所谓数字滤波,就是通过一定的计算或判断程序来减少干扰信号在有用信号中的比重,故实际上它是一种软件滤波。硬件滤波具有效率高的优点,但要增加...
  • 软件实现数字滤波

    千次阅读 2017-06-01 18:20:59
    原文地址:软件实现数字滤波作者:小龙 数字滤波器,说白了,就是多次采样求平均值的一个过程,精确一点的,就是再顺序排列,去掉首位再求平均值,哈哈!!这就是数字滤波器的原理!!就是求平均数!! 单片机...
  • 数字滤波方法有很多种,每种方法有其不同的特点和使用范围。从大的范围可分为3类。 1、克服大脉冲干扰的数字滤波法 (一). 限幅滤波法; (二).中值滤波法 2、抑制小幅度高频噪声的平均滤波法 (一).算数平均...
  • 采用数字滤波算法克服随机干扰的误差具有以下优点: 数字滤波无需其他的硬件成本,只用一个计算过程,可靠性高,不存在阻抗匹配问题。尤其是数字滤波可以对频率很低的信号进行滤波,这是模拟滤波器做不到的。 数字...
  • ad数字滤波

    2014-04-11 12:00:56
    AD转换中常用的十种数字滤波法,在AD采集中经常要用到数字滤波,而不同情况下又有不同的滤波需求,下面是10种经典的软件滤波方法的程序和优缺点分析
  • 数字滤波算法

    千次阅读 2018-11-22 12:27:33
    数字滤波算法

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 12,630
精华内容 5,052
关键字:

常用的数字滤波方法