0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

基于递推算术平均算法的阶进平滑滤波器设计

CHANBAEK 来源:木南创智 作者:尹家军 2022-12-13 17:37 次阅读

信号采集是非常常见的需求,我们也总是希望采集到的数据是纯净而真实的,但这只是我们的希望。环境中存在太多的干扰信号,为了让我们得到的数据尽可能地接近实际值,我们需要降低这些干扰信号的影响,于是就有了滤波器的用武之地。这里我们讨论的主要是软件实现的数字滤波器,这一篇我们就来讨论基于递推算术平均算法的阶进平滑滤波器。

1 、问题的提出

前面一篇我们讨论了同时提高灵敏度和滤波效果的方法,在通常情况下,都能达到比较理想的效果。不过在有些情况下,我们的采集对象会是处于一定的区间内,并且干扰信号也主要存在于这一区间内。也就是说干扰信号的幅值并不是很大,但持续存在;而被测信号也基本处于一个稳定的被测区间内。在这种情况下,被测信号越是处于目标范围内,干扰的影响越是不可忽略。在这一篇中我们就来设计一种滤波算法实现这样的需求。

首先,我们来分析一下,干扰信号较小,但持续不断对最终数据有较大影响。因为在有些应用中,当系统稳定时,采集的数据理论上来讲是不应该出现很大波动的。基于这一点我们可以考虑对比本次采集与上次输出之间的偏差值,如果偏差值大于一定的限值则我们认为是数据发生了较大变化,远大于干扰造成的影响,干扰可以忽略,所以我们直接对数据进行更新。当数据偏差处于一定的变化范围之内时,但系统并未处于稳定状态,但干扰信号已经不能完全忽略了,我们可以进行部分滤波处理。当数据偏差小于一定的值之后,我们认为是处于稳定的范围内,这时干扰造成的影响于数据的变化不能忽略,我们需要采用完全滤波。具体如图所示:

上图中SL1和SL2是我们要设定的阶进处理区间限值。当数据偏差小于SL2时,干扰信号对最终数据的影响较大,我们需要进行完全滤波。当系统变化处于上图中的SL1和SL2之间时,数据差异变较大,干扰信号相比于数据本身的变化较小,但不可忽略,我们可以进行不完全滤波来增加系统的灵敏度。当系统处于大于SL1的区间时,干扰信号对系统的影响很小,我们可以不做滤波处理。

2 、算法设计

前面描述了这种分段增加滤波作用的滤波器的特点,接下来我们来设计这种阶进式滤波器的操作算法。

首先依然需要一个数据队列,但在不同的情况下,对数据队列的更新形式是不一样的。在前后两个数据的偏差小于SL2时,这个时候我们需要对这采集数据进行完全的滤波处理。这个时候我们只需要用最新的数据替换时间最久的老数据,然后取队列的算术平均值就得到输出数据。具体的队列更新如下:

若是数据偏差处于SL1和SL2之间,这个时候干扰信号对采集值的影响变小但并未小到可以忽略,但数据的变化幅度已经很大,为了提高灵敏度,我们一次更新多个老数据以增加新数据的在输出值的比重。具体的队列更新如下:

若是数据偏差大于SL1时,数据的变化量已经远超干扰的影响,我们可以忽略干扰信号,为了提高系统灵敏度,我们不需要在进行滤波处理。具体的队列更新如下:

但是偏差落在大于SL1的范围内时,并不预示着我们需要马上更新数据队列的全部数据,因为可能是偶然性的脉冲干扰,这时我们需要作消抖处理。我们判断如果连续多少个的采集数据均落在相应的区间,我们就认为不是偶然的脉冲干扰。这是我们就更新队列的全部数据。

3 、代码实现

我们已经详细描述了阶进式平滑滤波器的操作算法,但具体如何实现呢?我们依然将滤波器当作一个对象,我们在此只考虑分成三段的阶进式滤波算法,即不滤波,半滤波和全滤波。

我们先来分析一下,首先滤波器对象需要获取当前采集到的数据值;同时我们为了实现对N个数据的递推平均就需要有一个存储这N个数的队列;我们需要记录最新的数据硬件存储到哪个位置就需要一个位置指针;同时我们也需要知道N的大小,所以我们将它们都定义滤波器对象的属性。平滑滤波的过程必须要计算算术平均值,而递推算术平均则是在每次采集一个数据之时都计算平均值,可是如果N值较大时,就会存在大量的重复计算。我们考虑到上一次采样的平均值已经得到,我们将其记录下来的话就可以用最新采集的数据替换掉最老的数据,从而得到新的平均值,所以我们将上一时间的输出值记录下来作为对象的一个属性。除此之外,我们还需要知道滤波器的限制区间,即HL和LL,所以我们将采集数据所对应的量程范围、上限(HL)、下限(LL)比例均作为对象的属性。同时为了实现消抖,我们需要记录数据大幅变化的持续数及确认消抖的最大数值,这两个也作为对象的属性。根据以上分析我们可定义滤波器对象类型为:

1 /*定义平滑滤波对象类型*/
 2 typedef struct FilterObject{
 3   float newValue;       //最新测量值
 4   float lastValue;      //上一个输出值
 5   float *buffer;        //数据缓存区
 6   int16_t position;    //写操作位置指针
 7   uint16_t bufCount;    //滤波的数量
 8   uint16_t delayCount;  //延迟计数
 9   uint16_t delayLimit;  //延迟限值
10   float rangeLimit;     //量程范围
11   float upperRario;     //比例下限
12   float lowerRatio;     //比例下限
13 }FilterObjectType;

我们已经获得了滤波器对象,接下来将基于这一对象实现相应的滤波器功能。我们要对比当前的采集值与上一个输出值的比较,根据它们的偏差绝对值来决定采取怎样的处理方式。处理流程如下:

在偏差值小于SL2时,进行全滤波处理;在偏差值大于SL2而小于SL1时,进行半滤波处理;而在偏差值大于SL1时,不进行滤波处理。根据以上的分析及流程图我们可以设计阶进平滑滤波器的代码为:

1 /* 阶梯平滑滤波处理函数,返回滤波后的值*/
 2 float StepSmoothingFilter(FilterObjectType *filter)
 3 {
 4   float result=filter->lastValue;
 5  
 6   if(filter->position<0)
 7   {
 8     for(int i=0;i<filter->bufCount;i++)
 9     {
10       filter->buffer[i]=filter->newValue;
11     }
12     filter->position=0;
13     filter->lastValue=filter->newValue;
14   }
15  
16   if(filter->position>=filter->bufCount)
17   {
18     filter->position=0;
19   }
20  
21   if(fabs(filter->newValue-filter->lastValue)>(filter->rangeLimit*filter->upperRario/100))
22   {
23     filter->delayCount+=1;
24     if(filter->delayCount>=filter->delayLimit)
25     {
26       for(int i=0;i<filter->bufCount;i++)
27       {
28         filter->buffer[i]=filter->newValue;
29       }
30       filter->position++;
31       result=filter->newValue;
32       filter->delayCount=0;
33     }
34   }
35   else if(fabs(filter->newValue-filter->lastValue)>=(filter->rangeLimit*filter->lowerRatio/100))
36   {
37     result=filter->lastValue-filter->buffer[filter->position]/filter->bufCount;
38    
39     result=result+filter->newValue/filter->bufCount;
40    
41     filter->buffer[filter->position++]=filter->newValue;
42     if(filter->position>=filter->bufCount)
43     {
44       filter->position=0;
45     }
46    
47     result=result-filter->buffer[filter->position]/filter->bufCount;
48     result=result+filter->newValue/filter->bufCount;
49     filter->buffer[filter->position++]=filter->newValue;
50    
51     filter->delayCount=0;
52   }
53   else
54   {
55     result=filter->lastValue-filter->buffer[filter->position]/filter->bufCount;
56    
57     result=result+filter->newValue/filter->bufCount;
58    
59     filter->buffer[filter->position++]=filter->newValue;
60    
61     filter->delayCount=0;
62   }
63  
64   filter->lastValue=result;
65   filter->newValue=0.0;
66   return result;
67 }

4 、应用总结

我们实现了基于算术平均的阶进平滑滤波器。该滤波器对周期性干扰和小幅的噪声干扰均有较好的效果。而且通过不同偏差值区间进行不同的滤波处理,在数据快速变化时,能很好的提高系统的灵敏度。对于系统处于平稳状态时,也能收到很好的滤波效果。

这一滤波器有效的前提是基于干扰的幅度并不是很大而且系统的采集值基本能稳定在一定范围内的前提而实现的。如果系统存在较大幅度的脉冲干扰,在这种脉冲干扰的出现频率较低时,消抖操作能够很好的去除这种偶然性干扰。但如果出现持续性的高频大幅脉冲干扰,这一滤波器将变得无能为力。

对于限值区间SL1和SL2的取值一般只能根据采集系统的特点或者工程师的经验来判断,但并非是盲目的,因为很多情况下我们是能够判断出干扰信号的大致判断范围的。在这些系统中绝大部分的干扰变化会落在SL2的范围内,其概率可能会超过60%,而落在SL1范围内的概率可能会超过90%,所以选择合适的SL1和SL2值会取得良好的滤波效果。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 滤波器
    +关注

    关注

    160

    文章

    7732

    浏览量

    177704
  • 数字滤波器
    +关注

    关注

    4

    文章

    270

    浏览量

    46987
  • 算法设计
    +关注

    关注

    0

    文章

    24

    浏览量

    8139
收藏 人收藏

    评论

    相关推荐

    基于递推算术平均算法平滑滤波器设计

    滤波器的用武之地。这里我们讨论的主要是软件实现的数字滤波器,这一篇我们就来讨论基于递推算术平均算法平滑
    的头像 发表于 12-13 17:33 1613次阅读
    基于<b class='flag-5'>递推算术平均</b><b class='flag-5'>算法</b>的<b class='flag-5'>平滑</b><b class='flag-5'>滤波器</b>设计

    基于递推算术平均算法的带阻平滑滤波器设计

    滤波器的用武之地。这里我们讨论的主要是软件实现的数字滤波器,这一篇我们就来讨论基于递推算术平均算法的带阻平滑
    的头像 发表于 12-13 17:35 1063次阅读
    基于<b class='flag-5'>递推算术平均</b><b class='flag-5'>算法</b>的带阻<b class='flag-5'>平滑</b><b class='flag-5'>滤波器</b>设计

    基于算术平均算法的中值数字滤波器设计

    在信号采集系统中,除了我们感兴趣的数据外,难免会有一些来自于环境的干扰信号。但我们总希望我们得到的数据是纯净而真实的,为了达到这个目标,我们不得不想办法去除这些干扰信号,于是滤波器就成为我们必不可少的帮手。这一篇我们就来讨论如何通过软件实现基于中值平均
    的头像 发表于 12-13 17:41 1198次阅读
    基于<b class='flag-5'>算术平均</b><b class='flag-5'>算法</b>的中值数字<b class='flag-5'>滤波器</b>设计

    基于算术平均算法的限幅滤波器设计

    通过AD采集数据时,我们总是希望采集到的数据是纯净而真实的,而实际上环境中存在太多的干扰信号,为了让我们得到的数据尽可能地接近实际值,我们需要降低这些干扰信号的影响。所以软件实现的数字滤波器应运而生,这一篇我们就来讨论基于中值算术平均
    的头像 发表于 12-13 17:47 1248次阅读
    基于<b class='flag-5'>算术平均</b><b class='flag-5'>算法</b>的限幅<b class='flag-5'>滤波器</b>设计

    十大滤波算法程序大全

    1、限幅滤波法2、中位值滤波法3、算术平均滤波法4、递推平均
    发表于 07-29 16:17

    史上最全滤波算法(Arduino编程)

    算术平均滤波法4、递推平均滤波法(又称滑动平均滤波
    发表于 06-16 10:51

    转:史上最全滤波算法(Arduino编程)

    算术平均滤波法4、递推平均滤波法(又称滑动平均滤波
    发表于 07-28 11:08

    十一种通用滤波算法(一)

    引起的波动干扰对温度、液位的变化缓慢的被测参数有良好的滤波效果C、缺点:对流量、速度等快速变化的参数不宜3、算术平均滤波法A、方法:连续取N个采样值进行算术平均运算N值较大时:信号
    发表于 09-12 23:10

    AD采集滤波算法

    的被测参数有良好的滤波效果 C、缺点:对流量、速度等快速变化的参数不宜3、算术平均滤波法 A、方法:连续取N个采样值进行算术平均运算N值较大时:信号
    发表于 04-30 03:43

    算术平均滤波法的优缺点

    算术平均数能较好的过滤随机干扰(使正负干扰的期望相互抵消)
    发表于 07-18 06:33

    分享几种较简单而常用的滤波算法

    法)**二、中位值滤波法****三、算术平均滤波法****四、递推平均滤波法****五、中位值
    发表于 12-21 06:10

    加权递推平均滤波法是什么

    加权递推平均滤波法是对递推平均滤波法的改进,即不同时刻的数据加以不同的权。通常是,越接近现时刻的
    发表于 01-11 07:01

    十一个经典的滤波算法的介绍和示例程序详细资料免费下载

    本文档的主要内容详细介绍的是十一个经典的滤波算法的详细资料免费下载主要内容包括了:1、限幅滤波法(又称程序判断滤波法)2、中位值滤波法3、
    发表于 11-06 19:35 20次下载
    十一个经典的<b class='flag-5'>滤波</b><b class='flag-5'>算法</b>的介绍和示例程序详细资料免费下载

    滤波算法有哪些十大滤波算法的资料介绍

    本文档的主要内容详细介绍的是十大滤波算法的资料介绍包括了:限幅滤波法(程序判断滤波法),中位值滤波法,
    发表于 01-04 08:00 28次下载
    <b class='flag-5'>滤波</b><b class='flag-5'>算法</b>有哪些十大<b class='flag-5'>滤波</b><b class='flag-5'>算法</b>的资料介绍

    单片机有哪些常用滤波算法详细资料说明

    本文档的主要内容详细介绍的是单片机有哪些常用滤波算法详细资料说明包括了:1、限幅滤波法,2、中位值滤波法,3、算术平均
    发表于 07-29 17:36 4次下载
    单片机有哪些常用<b class='flag-5'>滤波</b><b class='flag-5'>算法</b>详细资料说明