精华内容
下载资源
问答
  • AD转换常用的10种数字滤波方法,并附有c语言实现功能,各有优缺点均有说明。
  • AD采集中常用的数字滤波

    千次阅读 2019-04-13 21:18:01
    在AD采集中经常要用到数字滤波,而不同情况下又有不同滤波需求,下面是10种经典软件滤波方法的程序和优缺点分析: 1、限幅滤波法(又称程序判断滤波法) 2、中位值滤波法 3、算术平均滤波法 4、递推平均滤波法...

    在AD采集中经常要用到数字滤波,而不同情况下又有不同的滤波需求,下面是10种经典的软件滤波方法的程序和优缺点分析:
    1、限幅滤波法(又称程序判断滤波法)
    2、中位值滤波法
    3、算术平均滤波法
    4、递推平均滤波法(又称滑动平均滤波法)
    5、中位值平均滤波法(又称防脉冲干扰平均滤波法)
    6、限幅平均滤波法
    7、一阶滞后滤波法
    8、加权递推平均滤波法
    9、消抖滤波法
    10、限幅消抖滤波法
    1、限副滤波
    A、方法:
    根据经验判断,确定两次采样允许的最大偏差值(设为A)
    每次检测到新值时判断:
    如果本次值与上次值之差<=A,则本次值有效
    如果本次值与上次值之差>A,则本次值无效,放弃本次值,用上次值代替本次值
    B、优点:
    能有效克服因偶然因素引起的脉冲干扰
    C、缺点
    无法抑制那种周期性的干扰
    平滑度差
    程序:
    /* 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;
    else
    return new_value;
    }
    2、中位值滤波法
    A、方法:
    连续采样N次(N取奇数),把N次采样值按大小排列 ,取中间值为本次有效值
    B、优点:
    能有效克服因偶然因素引起的波动干扰,对温度、液位的变化缓慢的被测参数有良好的滤波效果
    C、缺点:
    对流量、速度等快速变化的参数不宜
    程序:
    /* N值可根据实际情况调整
    排序采用冒泡法*/
    #define N 11
    char filter()
    {
    charvalue_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-1;i++)
    {
    if ( value_buf>value_buf[i+1] )
    {
    temp =value_buf;
    value_buf = value_buf[i+1];
    value_buf[i+1] = temp;
    }
    }
    }
    returnvalue_buf[(N-1)/2];
    }
    3、算术平均滤波法
    A、方法:
    连续取N个采样值进行算术平均运算
    N值较大时:信号平滑度较高,但灵敏度较低
    N值较小时:信号平滑度较低,但灵敏度较高
    N值的选取:一般流量,N=12;压力:N=4
    B、优点:
    适用于对一般具有随机干扰的信号进行滤波
    这样信号的特点是有一个平均值,信号在某一数值范围附近上下波动
    C、缺点:
    对于测量速度较慢或要求数据计算速度较快的实时控制不适用
    比较浪费RAM

    程序:
    #define N 12
    char filter()
    {
    int sum = 0;
    for ( count=0;count<N;count++)
    {
    sum + =get_ad();
    delay();
    }
    return (char)(sum/N);
    }
    4、递推平均滤波法(又称滑动平均滤波法) (FIR前身)
    A、方法:
    把连续取N个采样值看成一个队列
    队列的长度固定为N
    每次采样到一个新数据放入队尾,并扔掉原来队首的一次数据.(先进先出原则)
    把队列中的N个数据进行算术平均运算,就可获得新的滤波结果
    N值的选取:流量,N=12;压力:N=4;液面,N=412;温度,N=14
    B、优点:
    对周期性干扰有良好的抑制作用,平滑度高
    适用于高频振荡的系统
    C、缺点:
    灵敏度低
    对偶然出现的脉冲性干扰的抑制作用较差
    不易消除由于脉冲干扰所引起的采样值偏差
    不适用于脉冲干扰比较严重的场合
    比较浪费RAM
    程序:
    #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、中位值平均滤波法(又称防脉冲干扰平均滤波法)
    A、方法:
    相当于“中位值滤波法”+“算术平均滤波法”
    连续采样N个数据,去掉一个最大值和一个最小值
    然后计算N-2个数据的算术平均值
    N值的选取:3~14
    B、优点:
    融合了两种滤波法的优点
    对于偶然出现的脉冲性干扰,可消除由于脉冲干扰所引起的采样值偏差
    C、缺点:
    测量速度较慢,和算术平均滤波法一样
    比较浪费RAM
    程序:

    #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-1;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、限幅平均滤波法
    A、方法:
    相当于“限幅滤波法”+“递推平均滤波法”
    每次采样到的新数据先进行限幅处理,
    再送入队列进行递推平均滤波处理
    B、优点:
    融合了两种滤波法的优点 对于偶然出现的脉冲性干扰,可消除由于脉冲干扰所引起的采样值偏差
    C、缺点:
    比较浪费RAM

    程序略 参考子程序1、3
    7、一阶滞后滤波法
    A、方法:
    取a=0~1
    本次滤波结果=(1-a)本次采样值+a上次滤波结果
    B、优点:
    对周期性干扰具有良好的抑制作用 适用于波动频率较高的场合
    C、缺点:
    相位滞后,灵敏度低 滞后程度取决于a值大小 不能消除滤波频率高于采样频率的1/2的干扰信号

    程序:
    /* 为加快程序处理速度假定基数为100,a=0~100 /
    #define a 50
    char value;
    char filter()
    {
    char new_value;
    new_value = get_ad();
    return ((100-a)value + anew_value);
    }
    8、加权递推平均滤波法
    A、方法:
    是对递推平均滤波法的改进,即不同时刻的数据加以不同的权
    通常是,越接近现时刻的数据,权取得越大。
    给予新采样值的权系数越大,则灵敏度越高,但信号平滑度越低
    B、优点:
    适用于有较大纯滞后时间常数的对象
    和采样周期较短的系统
    C、缺点:
    对于纯滞后时间常数较小,采样周期较长,变化缓慢的信号 不能迅速反应系统当前所受干扰的严重程度,滤波效果差
    程序:
    /
    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、消抖滤波法
    A、方法:
    设置一个滤波计数器
    将每次采样值与当前有效值比较:
    如果采样值=当前有效值,则计数器清零
    如果采样值<>当前有效值,则计数器+1,并判断计数器是否>=上限N(溢出)
    如果计数器溢出,则将本次值替换当前有效值,并清计数器
    B、优点:
    对于变化缓慢的被测参数有较好的滤波效果,
    可避免在临界值附近控制器的反复开/关跳动或显示器上数值抖动
    C、缺点:
    对于快速变化的参数不宜
    如果在计数器溢出的那一次采样到的值恰好是干扰值,则会将干扰值当作有效值导
    入系统
    程序:
    #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、限幅消抖滤波法
    A、方法:
    相当于“限幅滤波法”+“消抖滤波法”
    先限幅,后消抖
    B、优点:
    继承了“限幅”和“消抖”的优点
    改进了“消抖滤波法”中的某些缺陷,避免将干扰值导入系统
    C、缺点:
    对于快速变化的参数不宜
    程序略 参考子程序1、9

    展开全文
  • 数字滤波常用的软件方法代码实例可以给软件开发人员提供在数字滤波方面用软件实现的方法,对提高软件开发速度有帮助。
  • 数字滤波的定义和常用方法

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

     通过一定的计算或者判断程序对采样信号进行平滑加工,减少干扰在有用信号中的比例,通常称之为数字滤波

     数字滤波较之模拟滤波的优势
            *数字滤波不需要硬件设备,可靠性高,稳定性好,各回路之间不存
    在阻抗匹配等问题;
            *数字滤波用程序实现,多个输入通道可以“共用”一个滤波程序
            *通过算法程序或参数的修改即可实现不同的滤波方法
            *数字滤波能够对频率很低的干扰进行处理


    常用的滤波方法

    1.算数平均值滤波

            对某一被测参数在第 k个采样时刻连续采样n次得到n个采样数据

    xki ( i=1,2,,n ),计算这n个数据的算数平均值作为本次滤波器的输出yk

     通常n的工程经验值:流量测量n为8~12,压力测量n为4~8,液位测量n为4~12,温度、成分等缓慢变化的信号n为1~4。
            算数平均值滤波对周期性干扰具有良好的抑制作用,采用算术平均
    值滤波后,信噪比提高了根号n倍,但它对脉冲性干扰的抑制效果不够理想。


    式中 yk 是第 k 次滤波器的输出;xki是第i个采样值;n为采样次数,n决定了信号平滑度和灵敏度。随着n的增大,平滑度提高,灵敏度降低。


    2 加权算数平均值滤波

            在算数平均值滤波中, n次采样数据在结果中所占的比例均等,加权因子为1/ n。但有时为了突出最近几次采样值在平均值中的比例,往往对不同时刻赋以不同的加权因子。

    式中αi是加权系数0≤αi1且所有ai之和为1 αi体现了各次采样值在平均值中所占的比例。通过合理的选择αi,可以获得更好的滤波效果。

        这种方法可以根据需要突出信号序列的某一部分,抑制信号序列的另一部分。它适用于系统纯延迟时间常数τ较大而采样周期较短的情况。一般越新的采样数据赋以较大的比例。

     3.滑动平均值滤波

        由于算数平均滤波和加权算数平均滤波输出一次有效采样值必须连续采样n次,故对于采样速度较慢或要求数据更新率较高的实时系统,算术平均滤法无法使用,需要改进。

        滑动平均值滤波法把 N个测量数据看成一个队列,队列的长度固定为N,每进行一次新的采样,把测量结果放入队尾,而去掉原来队首的一个数据,这样在队列中始终有N个“最新”的数据。只需要把队列中的n个数据进行平均,就可以得到新的滤波值。这样,每进行一次采样就可以计算输出一个新的有效采样值,加快了数据处理的速度。

        滑动平均值滤波法对周期性的干扰有良好的抑制效果,在占用时间少的前提前滤波效果较好,但对偶尔出现的脉冲型干扰抑制作用差。

    4.中值滤波

        中值滤波是对某一被测参数连续采样n次(一般n应为奇数),然后将这些采样值进行排序,选取中间值为本次采样值。

    中值滤波对于去掉偶然因素引起的波动或者采样器不稳定而造成的误差所引起的脉冲性干扰比较有效,如电网的波动、变送器的临时故障等。对温度、液位等缓慢变化的被测参数,采用中值滤波法一般能收到良好的滤波效果。但对流量、速度等快速变化的被测参数,一般不宜采用。

    5. 防脉冲干扰的算术平均值滤波

        算数平均值滤波不易消除脉冲性干扰引起的测量值的偏差,可以考虑把中值滤波方法与之结合起来,做到既能防止脉冲干扰的影响,又能使周期性干扰得到平滑处理。

        基本思想是:把连续采集的n 个数据进行比较,去掉一个最大值和一个最小值,剩余的 n-2 个数据取算术平均值作为本次滤波的输出。

     

        这种方法兼有算术平均值滤波和中值滤波的优点,对快变和慢变参

    数都有抑制干扰的作用,但是运算工作量较大,影响系统的实时性。

    6.惯性滤波

        假设xk 是本次采样值,yk-1是上一次的滤波输出值,yk 为本次滤波输出值。

    则yk = ayk-1 + (1-a)xk

    注:k和k-1是下标

    由于通常情况下采样周期T远小于滤波器的时间常数 Tf ,即输入信号的频率快,而滤波环节时间常数相对较大。因此,本次滤波的输出值yk主要取决于上次的滤波输出值 yk-1,本次采样值 xk 对输出的影响较小,但具有一定的修正作用。这种方法模拟了具有较大惯性的低通滤波器功能,当目标参数为变化很慢的物理量时,效果很好。但是该方法带来了相位滞后,滞后相位角度的大小与α的选取相关。该方法不能滤除频率高于采样频率的1/2的干扰信号。

    7.程序判断滤波

    分成限幅滤波和限速滤波

    限幅滤波就是限制本次的采样值和上一次的采样值的差值不超过自己设定的一个值

    当不超出时,取本次采样值

    超出时,取上一次采样值。这样就达到了滤除变化较大的采样值,达到平滑的效果。它的原理也决定了它只能用于变化速度较慢的被测参数。


    限速滤波(不讲)


    8.复合数字滤波

    在实际应用中,有时既要消除大幅度的脉冲干扰,有要做数据平滑。因此常把前面介绍的两种以上的方法结合起来使用,形成复合滤波。


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

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

    展开全文
  • 常用数字滤波算法 第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

    展开全文
  • 在AD采集中经常要用到数字滤波,而不同情况下又有不同滤波需求,下面是10种经典软件滤波方法的程序和优缺点分析: 1、限幅滤波法(又称程序判断滤波法) 2、中位值滤波法 3、算术平均滤波法 4、递推平均滤波法...
  • 融合了两种滤波优点; 对于偶然出现脉冲性干扰,可消除由于脉冲干扰所引起采样值偏差。 D、缺点: 比较浪费RAM。 E、整理:shenhaiyu 2013-11-01 */ #define FILTER_N 12 int Filter_Value; int filt
  • AD转换时常用的滤波方法(1)

    千次阅读 2017-09-29 22:47:20
    在AD采集中经常要用到数字滤波,而不同情况下又有不同滤波需求,下面是10种经典软件滤波方法的程序和优缺点分析: 1、限幅滤波法(又称程序判断滤波法)  2、中位值滤波法  3、算术平均滤波法  4、递推...
  • 在AD采集中经常要用到数字滤波,而不同情况下又有不同滤波需求,下面是10种经典软件滤波方法的程序和优缺点分析: 限幅滤波法(又称程序判断滤波法) 中位值滤波法 算术平均滤波法 递推平均滤波法(又称...
  • ad数字滤波

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

    千次阅读 2013-11-14 13:14:23
    0 引言 在单片机的数据采集系统中,测量通道串入随机干扰是难免的,从而使A/D转换送入单片机的数据存在误差,这种因随机干扰产生的误差称为随机误差。随机误差虽然无法预测...1 常用的数字滤波算法及实现 在单片机
  • 在工业过程控制系统中,由于被控对象的环境比较恶劣,干扰源比较多,仪器、仪表采集的信息常会受到干扰,所以在模拟系统中,为了消除干扰,...下面给出几种常用的数字滤波方法的C语言函数,这些函数有一定的通用性,适用于PC...
  • 常用的5种图像平滑处理操作方法: 1)方框滤波——boxFilter函数 2)均值滤波——blur函数 3)高斯滤波——GaussianBlur函数 4)中值滤波——medianBlur函数 5)双边滤波——bilateralFilter函数 前三种都属于...
  • 通过对常用数字滤波器设计和实现,掌握数字信号处理工作原理及设计方法;熟悉用双线性变换法设计 IIR 数字滤波器原理与方法,掌握利用数字滤波器对信号进行滤波的方法,掌握数字滤波器计算机仿真方法,并...
  • 1引言 仪器仪表设备在现场测试过程中,由于生产变量的测试数据对生产过程具有重要的意义,因此对各种物理量测试数据精度要求是比较高的。...2常用的几种软件滤波方法 (1)中值滤波法:即每次取N个A
  • 后者为随机信号,它不是周期信号,可用数字滤波方法予以消弱或滤除。所谓数字滤波,就是通过一定计算或判断程序来减少干扰信号在有用信号中比重,故实际上它是一种软件滤波。硬件滤波具有效率高优点,但要增加...
  • STM32实战七 数字滤波

    千次阅读 2019-06-30 15:34:58
    数字滤波是数据处理是常用、灵活、有效的方法。前面的按键程序已经用到了滤波,属于开关量滤波,这里要讨论的是模拟量滤波程序,包括最常用的两种方法,中值滤波和平均值滤波。 中值滤波的原理是,每次取最近几个数...
  • 常见几种数字滤波算法及特点

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

    千次阅读 2013-04-12 16:35:36
    在工业过程控制系统中,由于被控对象的环境比较恶劣,干扰源比较多,仪器、仪表采集的信息常会受到干扰,所以在模拟系统中,为了消除干扰,常...下面给出几种常用的数字滤波方法的C语言函数,这些函数有一定的通用性,用Turbo
  • 常用的例子,比如美图秀秀的磨皮,去掉了脸部细节信息(痘坑,痘印,暗斑等)。高通滤波则相反。高通/低通滤波1.理想的高/低通滤波顾名思义,高通滤波器为:让高频信息通过,过滤低频信息;低通滤波相反。理想的低通...
  • 数字滤波方法有很多种,每种方法有其不同的特点和使用范围。从大的范围可分为3类。 1、克服大脉冲干扰的数字滤波法 (一). 限幅滤波法; (二).中值滤波法 2、抑制小幅度高频噪声的平均滤波法 (一).算数平均...
  • JavaDsp数字信号处理(DSP)方面的Java封装,包含常用的一些处理方法,如滤波、信号变换等等。该类库是我本科毕业设计中的一部分,绝大部分都是我自己写实现的,很少部分算法有我另外几个朋友参与讨论和实现,在此表示...
  • Date: 2019.04.03【Tag:算法总结】 前言     图像滤波是图像去噪经典方法滤波过程本质就是卷积过程,...本文主要是对常用数字图像滤波去噪算法进行总结,并给出常用滤波算法matlab实现(不调用函数)。
  • JavaDsp数字信号处理(DSP)方面的Java封装,包含常用的一些处理方法,如滤波、信号变换等等。该类库是我本科毕业设计中的一部分,绝大部分都是我自己写实现的,很少部分算法有我另外几个朋友参与讨论和实现,在此表示...
  • JavaDsp数字信号处理(DSP)方面的Java封装,包含常用的一些处理方法,如滤波、信号变换等等。该类库是我本科毕业设计中的一部分,绝大部分都是我自己写实现的,很少部分算法有我另外几个朋友参与讨论和实现,在此表示...
  • JavaDsp数字信号处理(DSP)方面的Java封装,包含常用的一些处理方法,如滤波、信号变换等等。该类库是我本科毕业设计中的一部分,绝大部分都是我自己写实现的,很少部分算法有我另外几个朋友参与讨论和实现,在此表示...
  • 针对数字伪造合成图像中最常用的模糊操作,本文提出了一种基于图像形态学滤波边缘特性的盲取证算法;该方法用同态滤波和形态学滤波方法增强了模糊操作的图像边缘, 分析了离焦模糊和人工模糊边界特点, 利用离焦模糊...
  • 掌握线性滤波和中值滤波两种最典型、最常用的图像平滑方法,对输出结果加以比较、加深理解。 实验内容 1)编写并调试窗口为3×3、5×5的平滑滤波函数; (如[1 1 1; 1 1 1 ; 1 1 1]/9、[1 2 1; 2 4 2;...
  • JavaDsp数字信号处理(DSP)方面的Java封装,包含常用的一些处理方法,如滤波、信号变换等等。该类库是我本科毕业设计中的一部分,绝大部分都是我自己写实现的,很少部分算法有我另外几个朋友参与讨论和实现,在此表示...

空空如也

空空如也

1 2 3 4 5 ... 12
收藏数 227
精华内容 90
关键字:

常用的数字滤波方法