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

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

3天内不再提示

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

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

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

1 、问题的提出

在我们通过AD采集获取数据时,不可避免会受到干扰信号的影响,而且很多时候我们希望尽可能的将这种影响减到最小。为实现这一目的,人们想了很多办法,有硬件方面的,也有软件方面的。在硬件难以改变或者软件能够达到相应效果时,我们一般采用软件方法来实现,通常称之为数字滤波。

实现数字滤波的算法有很多种,根据不同的应用需求我们可以选择不同滤波算法来实现。对于一般的AD采集最常见的是周期性干扰和随机性噪声,对于此类干扰一般采用算术平均的方法就能得到比较理想的效果。其计算公式如下:

使用简单的算术平均值算法虽然能够实现滤波,但在一些情况下有一个问题可能会有影响,那就是当做算术平均的数量比较大时会出现曲线并不是十分平滑的情况。这很容易理解,因为一次采集n个数做算术平均得到一个结果,当n越大则间隔的时间就越长。为了解决这一问题我们并不是甲酸完后就将n个数同时丢弃,而是将最早的数丢弃并采用最新采集的数代替,这就是所谓的递推算术平均算法。但其计算公式并没有发生变化。

2 、算法设计

我们如何实现这种递推方式的平滑滤波器呢?首先我们来看一看一般的算术平均算法是如何实现的。算术平均算法就是采集N个数然后对这N个数取平均值作为最终的结果。我们将这些数的序列记录如下:

这N个数计算完毕后就会丢弃,然后再采集N个数。很显然,如果N值较大,采集所耗费的时间跨度就会比较长,数据看起来可能就并不那么平滑,而且数据的输出速率会慢很多,也不能展示数据的变化过程。而递推平均算法则不存在这些问题。同样是一个长度为N的数据队列,但没采样一次数据,我们就用最新的数据替换掉最久的数据,并输出算术平均值。我们将这些数的序列记录如下:

这样每采样一个数据我们都会输出一个滤波后的数据,而不是等待采集N个数据后才会输出,这样既可保证数据的连续性也可达到平滑滤波的效果。

3 、代码实现

我们分析了平滑滤波器的实现算法,接下来我们来讨论如何实现这一滤波器。首先我们将滤波器作为一个对象,我们实现的滤波器操作也将面向这一对象来实现。那么我们实现对滤波器对象的操作需要确定该对象的那些属性呢?

作为滤波器肯定需要获取当前采集到的数据值;同时我们为了实现对N个数据的递推平均就需要有一个存储这N个数的队列;我们需要记录最新的数据硬件存储到哪个位置就需要一个位置指针;同时我们也需要知道N的大小,所以我们将它们都定义滤波器对象的属性。平滑滤波的过程必须要计算算术平均值,而递推算术平均则是在每次采集一个数据之时都计算平均值,可是如果N值较大时,就会存在大量的重复计算。我们考虑到上一次采样的平均值已经得到,我们将其记录下来的话就可以用最新采集的数据替换掉最老的数据,从而得到新的平均值,所以我们将上一时间的输出值记录下来作为对象的一个属性。根据以上分析我们可定义滤波器对象类型为:

1 /*定义平滑滤波对象类型*/
2 typedef struct FilterObject{
3   float newValue;       //最新测量值
4   float lastValue;      //上一个输出值
5   float *buffer;        //数据缓存区
6   int16_t position;    //写操作位置指针
7   uint16_t bufCount;    //滤波的数量
8 }FilterObjectType;

我们获得了滤波器对象,接下来我们基于该对象实现平滑滤波器。对于平滑滤波自然是要采取计算平均值的过程。但我们使用了循环队列的操作方式,所以判断新数据指针当前所处的位置。具体实现如下:

1 /*平滑滤波处理函数,返回滤波后的值 */
 2 float SmoothingFilter(FilterObjectType *filter)
 3 {
 4   float result=0.0;
 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   result=filter->lastValue-filter->buffer[filter->position]/filter->bufCount;
22  
23   result=result+filter->newValue/filter->bufCount;
24  
25   filter->buffer[filter->position++]=filter->newValue;
26  
27   filter->lastValue=result;
28  
29   filter->newValue=0.0;
30   return result;
31 }

4 、应用总结

我们实现了基于算术平均的平滑滤波器,对于消除周期性干扰有良好的抑制作用,对于一般具有随机干扰的信号也能进行滤波。对于数据平滑度较高有不错的效果。

但是这种滤波方式有几点是需要注意的。第一,它的灵敏度低。这很好理解,因为我们总是对N个数采取平均值算法,所以新数据对平均值的影响有限,数据变化不明显,响应较慢,而且N越大越明显。第二.对偶然出现的脉冲性干扰的抑制作用较差。第三,不易消除由于脉冲干扰所引起的采样值偏差。所以这种滤波器并不适用于脉冲干扰比较严重的场合。

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

    关注

    158

    文章

    7334

    浏览量

    174813
  • 数字滤波器
    +关注

    关注

    4

    文章

    250

    浏览量

    46748
  • 算法设计
    +关注

    关注

    0

    文章

    24

    浏览量

    8021
收藏 人收藏

    评论

    相关推荐

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

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

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

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

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

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

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

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

    单片机软件滤波方法对比

    引起的采样值偏差。C、缺点:测量速度较慢,和算术平均滤波法一样,比较浪费RAM。6、限幅平均滤波法A、方法:相当于“限幅滤波法”+“
    发表于 10-24 15:53

    十大滤波算法程序大全

    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

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

    本文档的主要内容详细介绍的是十大滤波算法的资料介绍包括了:限幅滤波法(程序判断滤波法),中位值滤波法,
    发表于 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>详细资料说明