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

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

3天内不再提示

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

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

信号采集系统中,除了我们感兴趣的数据外,难免会有一些来自于环境的干扰信号。但我们总希望我们得到的数据是纯净而真实的,为了达到这个目标,我们不得不想办法去除这些干扰信号,于是滤波器就成为我们必不可少的帮手。这一篇我们就来讨论如何通过软件实现基于中值平均算术平均算法的中值数字滤波器。

1、问题的提出

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

  在我们的项目中,要求100毫秒采集100个数据,由于信号非常微弱,很容易收到干扰,所以实际采集到的数据中起伏很大,这其中有很多数据数叠加了干扰项的数据。通过示波器观察,我们发现在这些干扰项中,有周期性的频率相对低一些的干扰,也有无规律的频率很高的干扰。这些干扰信号对我们的测量结果的影响非常之大,几乎让测量结果完全不可信,所以我们必须想办法将其去除。

  我们考虑并测试了多种滤波算法,我们发现单一的滤波手段很难同时滤掉几种不同的干扰信号。所以我们尝试组合多种滤波算法以实现我们的目标。

2、算法设计

  前面我们已经描述了问题的来源,所以为了去除不同种类的干扰信号,我们必须设计一个针对多种干扰信号的滤波算法。我们知道主要的干扰信号是相对频率较低的周期干扰和相对频率较高的非周期干扰,我们将分析这两种信号的特点并针对性的采取相应的滤波手段。

  首先我们来考虑相对频率较低的周期干扰,这种干扰来自于环境并且很难避免,但这种干扰信号具有一定的规律,所以它对正常信号造成的影响也是有一定规律的。我们可以图示如下:

  如果只存在这一种周期性的低频率的干扰信号,那么我们很容易想到采用算术平局算法就能够去除,在前面我们也确实是这么做的。事实上如果存在多种频率的周期性干扰信号,只要采集到的数据样本数量足够,采用算数平均算法基本都是可以得到比较理想的结果。在我们的项目中,我们的采集频率达到了1KHz,而我们每100毫秒出一个数,所以从理论上讲,10Hz以上的周期性干扰都可以通过算术平均率波来消除。

  接下来我们来考虑相对频率较高的非周期干扰,这种干扰具有较大的随机性,有可能对信号的影响较大,也有可能对信号的影响较小,其频率和幅值都是随机的,测量结果存在很大的偶然性。我们可以简单的图示如下:

  对于这种干扰我们前面的方法对他是没有效果的,但我们的ADC采用的是积分方式来检测信号的,所以在两个采样点之间,无论这类干扰信号在何时出现都会叠加到紧接着的这个采样数据上,致使最终的采样数据比周期性干扰叠加的情况下要么大一些,要么小一些。这就存在两种情况,如果是正向干扰就会是数据变大一些,如果是反向干扰就会是数据变小一些。使得最终的测量数据更加背离原始数据或者更加接近原始数据。

  对于更加接近我们需要的数据的变化,我们先不用理会它,毕竟它更加接近我们想要的数据。对于更加偏离的那一部分数据,我们有什么办法将其去除掉呢?办法是有的,我们借鉴比赛积分中去掉偶然性的方式,去掉最高和最低的数,中间的数应该更接近与真实值。具体如下图所示:

  这样去掉最大的一些数和最小的一些数后,并不能保证得到的就是真实的信号值,但有一点我们时刻以肯定的就是,余下的值都更为接近真实的信号值。然后我们在对余下的数采取算术平均操作,得到的就是接近真实值的一个采集值了。

3、编码实现

  我们已经设计了采用中值及算术平均的方式的算法来处理这些数据。但具体该如何实现呢?这一节中我们就来讨论算法的实现。

  首先我们来分析一下实现这里算法需要涉及到哪些问题。第一,首先我们必须采集到一定数量的数据,这个数据量不可太小,理论上来讲3个数据可以实现,但事实上你会发现对此等规模的数据量使用这一算法其实没有多大意义。一般一次采集几十个数然后再做此滤波是比较有效果的。第二,因为采用丢弃一定数量的极大值和极小值减少干扰项的方法,所以在几十上百的数据量时,我们最好是将其先排序在去除比较方便。第三,我们需要选择合理的基础数据量和需要去除的极大极小数量。这一点对最终的结果和滤波的效果都会有影响。明白了上述几点后,我们就可以来实现这一滤波算法了。

/*中值平均滤波算法*/
static uint32_t MedianMeanFilter(uint32_t *pData,uint16_t aSize,uint16_t eSize)
{
    uint32_t tData;
    uint32_t result=0;
    
    if(aSize<=2*eSize)
    {
        return 0;
    }
    
    for (int i=0; i-1; i++)  //比较n-1轮
    {
        for (int j=0; j-1-i; j++)  //每轮比较n-1-i次,
        {
            if (pData[j] < pData[j+1])
            {
                tData = pData[j];
                pData[j] = pData[j+1];
                pData[j+1] = tData;
            }
        }
    }
    
    for(int j=eSize;j<(aSize-eSize);j++)
    {
        result=result+pData[j];
    }
    
    result = result/(aSize-2*eSize);
    
    return result;
}

  在上述实现中,我们先对输入的数据进行了排序。在上述代码中我们考虑到数据量不大,采用了冒泡排序的方式实现。然后我们去除了一定数量的极大值和极小值,并对余下的值取算术平均就得到了本次我们的采集值。

  对于函数中的三个参数:uint32_t *pData是需要滤波的原始采集数据;uint16_t aSize是需要滤波的原始采集数据的数量;uint16_t eSize是需要丢弃的极大值和极小值的数量。其中aSize要远大于eSize的2倍,否则大部分被舍弃,滤波的意义就不大了。

  函数的使用也很简单。比如在我们的应用中,我们以1KHz的速度采集原始值,每采集100个数出一个测量结果,去掉10个极大值和10个极小值,于是我们就可以调用函数如下:

temp[i]=MedianMeanFilter(rDatas[i],100,10);

  在这个应用中,我们测试去掉10个极大值和10个极小值可以得到比较理想的结果,当然也可以将eSize的值增大一些以强化滤波的效果,但不要太大。

4、应用总结

  我们实现了基于算术平均的中值滤波器。该滤波器对一定频率以上的周期性干扰和随机性的噪声干扰均有较好的效果。通过修改丢弃的极大值和极小值的数量可以应对在不同环境下的滤波要求。

  这一滤波算法适用于高速采集,大数据量的情况下滤波。所以必须采集到一定数量的数据,这个数据量不可太小。一般一次采集几十个数然后再做此滤波是比较有效果的。

  这一滤波算法对一定频率以上的周期性干扰和随机性的高频干扰有显著的效果。而对其他类型的干扰只具有有限的改善。

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

    关注

    160

    文章

    7727

    浏览量

    177656
  • 数字滤波器
    +关注

    关注

    4

    文章

    268

    浏览量

    46980
  • 算法设计
    +关注

    关注

    0

    文章

    24

    浏览量

    8137
收藏 人收藏

    评论

    相关推荐

    使用FPGA构建的数字滤波器设计方案

    本文简要介绍了FIR数字滤波器的结构特点和基本原理,提出基于FPGA和DSP Builder的FIR数字滤波器的基本设计流程和实现方案。##FIR 数字滤波器的详细设计。
    发表于 07-24 15:30 8786次阅读
    使用FPGA构建的<b class='flag-5'>数字滤波器</b>设计方案

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

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

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

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

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

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

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

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

    软件算法实现数字滤波问题

    软件算法实现数字滤波问题:解决方法:数字滤波算法优点:限幅滤波算法:原理描述:适用场景:参考代码
    发表于 01-20 06:58

    数字滤波器的设计与应用

    数字滤波器
    发表于 08-26 19:29 24次下载
    <b class='flag-5'>数字滤波器</b>的设计与应用

    数字滤波器的结构

    数字网络的信号流图表示 IIR数字滤波器的结构 FIR数字滤波器的结构数字滤波器的格形结构信号流图的基本概念1、定义:信号流图是一种有向图,它用带箭头
    发表于 01-07 10:24 30次下载

    数字滤波器的原理及其设计

    本章介绍数字滤波器的原理及其设计。数字滤波器的设计是数字系统综合的问题之一。所谓数字系统的综合(synthesis)就是给出设计指标的情况下,设计一个系统使之满足设计指标
    发表于 11-24 09:13 127次下载

    数字滤波器的设计实验

    数字滤波器的设计实验 一. 数字滤波器设计:(1) 数字滤波器设计步骤:a. 整理给定的滤波器设计要求
    发表于 10-30 13:34 5700次阅读
    <b class='flag-5'>数字滤波器</b>的设计实验

    什么是数字滤波器

    什么是数字滤波器 数字滤波器(digital filter)是由数字乘法器、加法器
    发表于 06-30 12:37 3972次阅读
    什么是<b class='flag-5'>数字滤波器</b>

    数字滤波器,数字滤波器原理是什么?

    数字滤波器,数字滤波器原理是什么? 在信号处理领域中,对于信号处理的实时性、快速性的要求越来越高。而在许多信息处理过程中
    发表于 03-24 14:06 2.9w次阅读

    基于matlab的数字滤波器的设计及数字滤波器基本结构

    本文主要介绍了基于matlab的数字滤波器的设计及数字滤波器基本结构。
    发表于 06-05 08:00 27次下载

    FIR数字滤波器设计

    数字滤波器的输入输出均为数字信号,信号通过数字滤波器后,可以改变频率成分的相对比例或滤除某些频率成分。数字滤波器可以分为IIR数字滤波器和F
    的头像 发表于 04-05 09:47 5561次阅读

    数字滤波器是什么 数字滤波器的性能指标

      数字滤波器的原理基于数字信号处理技术和滤波器算法,通过对离散时间信号进行处理和滤波,实现对信号频率的选择性衰减和增强。
    发表于 02-24 11:23 5280次阅读