查看: 7552|回复: 14

[其他] Debug连载帖十——软件滤波算法(1)

[复制链接]
  • TA的每日心情
    郁闷
    2021-3-10 19:44
  • 签到天数: 7 天

    连续签到: 1 天

    [LV.3]偶尔看看II

    126

    主题

    525

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    2018
    最后登录
    2023-12-25
    发表于 2015-8-30 07:31:27 | 显示全部楼层 |阅读模式
    本来这篇帖子是要连载卡尔曼滤波的,但是因为最近时间不太够,把软件滤波算法提到前面,希望各位理解。


    一:前言:
    滤波是将信号中特定波段频率滤除的操作,是抑制和防止干扰的一项重要措施。我们在工程中使用的主要是硬件滤波和软件滤波,硬件滤波种类繁多,方法多样,常见的如LC滤波,RC滤波等。其工作原理是通过元器件的物理特性和电气特性对信号进行滤波。我们前面也有介绍。软件滤波是通过特定算法对信号进行滤波,本质上都是滤波。

    下面我们开始介绍具体的滤波算法,方法各有优劣,根据自己的需要选择。

    二.典型的滤波数字算法:

       1、限幅滤波法(又称程序判断滤波法)
        A、方法:
            根据经验判断,确定两次采样允许的最大偏差值(设为A)
            每次检测到新值时判断:
            如果本次值与上次值之差<=A,则本次值有效
            如果本次值与上次值之差>A,则本次值无效,放弃本次值,用上次值代替本次值
        B、优点:
            能有效克服因偶然因素引起的脉冲干扰
        C、缺点:
            无法抑制那种周期性的干扰
            平滑度差

    /*  A值可根据实际情况调整
        value为有效值,new_value为当前采样值  
        滤波程序返回有效的实际值  */
    1. <font size="3" color="#2f4f4f">#define A 10
    2. char value;
    3. char filter()
    4. {
    5.    char  new_value;
    6.    new_value = get_ad();
    7.    if ( ( new_value - value > A ) || ( value - new_value > A )
    8.       return value;
    9.    return new_value;
    10.          
    11. }</font>
    复制代码

    2、中位值滤波法
        A、方法:
            连续采样N次(N取奇数)
            把N次采样值按大小排列
            取中间值为本次有效值
        B、优点:
            能有效克服因偶然因素引起的波动干扰
            对温度、液位的变化缓慢的被测参数有良好的滤波效果
        C、缺点:
            对流量、速度等快速变化的参数不宜

    /*  N值可根据实际情况调整
        排序采用冒泡法*/
    1. <font size="3" color="#2f4f4f">#define N  11

    2. char filter()
    3. {
    4.    char value_buf[N];
    5.    char count,i,j,temp;
    6.    for ( count=0;count<N;count++)
    7.    {
    8.       value_buf[count] = get_ad();
    9.       delay();
    10.    }
    11.    for (j=0;j<N-1;j++)
    12.    {
    13.       for (i=0;i<N-j;i++)
    14.       {
    15.          if ( value_buf[i]>value_buf[i+1] )
    16.          {
    17.             temp = value_buf[i];
    18.             value_buf[i] = value_buf[i+1];
    19.              value_buf[i+1] = temp;
    20.          }
    21.       }
    22.    }
    23.    return value_buf[(N-1)/2];
    24. }</font>
    复制代码

    3、算术平均滤波法
        A、方法:
            连续取N个采样值进行算术平均运算
            N值较大时:信号平滑度较高,但灵敏度较低(因为采样多了)
            N值较小时:信号平滑度较低,但灵敏度较高(采样少)
            N值的选取:一般流量,N=12;压力:N=4
        B、优点:
            适用于对一般具有随机干扰的信号进行滤波
            这样信号的特点是有一个平均值,信号在某一数值范围附近上下波动
        C、缺点:
            对于测量速度较慢或要求数据计算速度较快的实时控制不适用
            比较浪费RAM(如果你的芯片RAM足够大并且运算能力足够强,可以无视这条)

    1. <font size="3" color="#2f4f4f">#define N 12

    2. char filter()
    3. {
    4.    int  sum = 0;
    5.    for ( count=0;count<N;count++)
    6.    {
    7.       sum + = get_ad();
    8.       delay();
    9.    }
    10.    return (char)(sum/N);
    11. }</font>
    复制代码

    4、递推平均滤波法(又称滑动平均滤波法)
        A、方法:
            把连续取N个采样值看成一个队列
            队列的长度固定为N
            每次采样到一个新数据放入队尾,并扔掉原来队首的一次数据.(先进先出原则)
            把队列中的N个数据进行算术平均运算,就可获得新的滤波结果
            N值的选取:流量,N=12;压力:N=4;液面,N=4~12;温度,N=1~4
        B、优点:
            对周期性干扰有良好的抑制作用,平滑度高(因为我们应用了队列的思想)
            适用于高频振荡的系统   
        C、缺点:
            灵敏度低
            对偶然出现的脉冲性干扰的抑制作用较差
            不易消除由于脉冲干扰所引起的采样值偏差
            比较浪费RAM(如果你的芯片RAM足够大并且运算能力足够强,可以无视这条)
    1. <font size="3" color="#2f4f4f">

    2. #define N 12
    3. char value_buf[N];
    4. char i=0;
    5. char filter()
    6. {
    7.    char count;
    8.    int  sum=0;
    9.    value_buf[i++] = get_ad();
    10.    if ( i == N )   i = 0;
    11.    for ( count=0;count<N,count++)
    12.       sum = value_buf[count];
    13.    return (char)(sum/N);
    14. }</font>
    复制代码

    5、中位值平均滤波法(又称防脉冲干扰平均滤波法)
        A、方法:
            相当于“中位值滤波法”+“算术平均滤波法”
            连续采样N个数据,去掉一个最大值和一个最小值
            然后计算N-2个数据的算术平均值
            N值的选取:3~14
        B、优点:
            融合了两种滤波法的优点
            对于偶然出现的脉冲性干扰,可消除由于脉冲干扰所引起的采样值偏差
        C、缺点:
            测量速度较慢,和算术平均滤波法一样
            比较浪费RAM(如果你的芯片RAM足够大并且运算能力足够强,可以无视这条)
    1. <font size="3" color="#2f4f4f">
    2. #define N 12

    3. char filter()
    4. {
    5.    char count,i,j;
    6.    char value_buf[N];
    7.    int  sum=0;
    8.    for  (count=0;count<N;count++)
    9.    {
    10.       value_buf[count] = get_ad();
    11.       delay();
    12.    }
    13.    for (j=0;j<N-1;j++)
    14.    {
    15.       for (i=0;i<N-j;i++)
    16.       {
    17.          if ( value_buf[i]>value_buf[i+1] )
    18.          {
    19.             temp = value_buf[i];
    20.             value_buf[i] = value_buf[i+1];
    21.              value_buf[i+1] = temp;
    22.          }
    23.       }
    24.    }
    25.    for(count=1;count<N-1;count++)
    26.       sum += value[count];
    27.    return (char)(sum/(N-2));
    28. }</font>
    复制代码
    各位可以根据自己不同的控制系统来选择相应的滤波算法,没有万能的算法,只有最适合自己的。

    今天启程回学校了,我的上网套餐出了点问题,可能后面几天会托更,希望各位谅解。

    我知道答案 目前已有14人回答
    很开心
    回复

    使用道具 举报

    该用户从未签到

    0

    主题

    24

    帖子

    0

    注册会员

    Rank: 2

    积分
    154
    最后登录
    2018-2-6
    发表于 2015-8-31 12:00:45 | 显示全部楼层
    占楼,期待下文。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    11

    主题

    54

    帖子

    0

    注册会员

    Rank: 2

    积分
    123
    最后登录
    2018-5-8
    发表于 2015-8-31 13:32:21 | 显示全部楼层
    学习一下,楼主写的不错!
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    8

    主题

    300

    帖子

    0

    高级会员

    Rank: 4

    积分
    746
    最后登录
    2016-5-26
    发表于 2015-8-31 13:42:18 | 显示全部楼层
    谢谢分享。。。
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2018-7-23 21:04
  • 签到天数: 103 天

    连续签到: 1 天

    [LV.6]常住居民II

    228

    主题

    5379

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    16866
    最后登录
    1970-1-1
    发表于 2015-8-31 16:57:30 | 显示全部楼层
    楼主回头分享一些滤波器的参数选择整定的内容吧,很期待
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    郁闷
    2021-3-10 19:44
  • 签到天数: 7 天

    连续签到: 1 天

    [LV.3]偶尔看看II

    126

    主题

    525

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    2018
    最后登录
    2023-12-25
     楼主| 发表于 2015-8-31 17:29:43 | 显示全部楼层
    lkl0305 发表于 2015-8-31 16:57
    楼主回头分享一些滤波器的参数选择整定的内容吧,很期待

    好的,写完卡尔曼滤波就分享调滤波器的几种办法。
    很开心
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2018-7-23 21:04
  • 签到天数: 103 天

    连续签到: 1 天

    [LV.6]常住居民II

    228

    主题

    5379

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    16866
    最后登录
    1970-1-1
    发表于 2015-8-31 17:36:06 | 显示全部楼层
    MDebug 发表于 2015-8-31 17:29
    好的,写完卡尔曼滤波就分享调滤波器的几种办法。

    期待……
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    0

    主题

    4

    帖子

    0

    新手上路

    Rank: 1

    积分
    14
    最后登录
    1970-1-1
    发表于 2015-9-9 11:08:23 | 显示全部楼层
    很好,谢谢分享
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9

    主题

    443

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    1120
    最后登录
    2016-9-23
    发表于 2015-9-9 15:06:52 | 显示全部楼层
    写得不错
    回复

    使用道具 举报

    该用户从未签到

    7

    主题

    243

    帖子

    0

    高级会员

    Rank: 4

    积分
    856
    最后登录
    2016-6-11
    发表于 2015-9-19 14:19:05 | 显示全部楼层
    总结得挺好哒
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2025-9-7 15:19 , Processed in 0.097898 second(s), 29 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

    快速回复 返回顶部 返回列表