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

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

3天内不再提示

如何用单片机实现数字滤波?6种数字滤波算法解析

贸泽电子设计圈 来源:未知 作者:佚名 2018-02-28 09:41 次阅读

单片机主要作用是控制外围的器件,并实现一定的通信和数据处理。但在某些特定场合,不可避免地要用到数学运算,尽管单片机并不擅长实现算法和进行复杂的运算。下面主要是介绍如何用单片机实现数字滤波。

在单片机进行数据采集时,会遇到数据的随机误差,随机误差是由随机干扰引起的,其特点是在相同条件下测量同一量时,其大小和符号会现无规则的变化而无法预测,但多次测量的结果符合统计规律。为克服随机干扰引起的误差,硬件上可采用滤波技术,软件上可采用软件算法实现数字滤波。滤波算法往往是系统测控算法的一个重要组成部分,实时性很强。

采用数字滤波算法克服随机干扰的误差具有以下优点:

1、数字滤波无需其他的硬件成本,只用一个计算过程,可靠性高,不存在阻抗匹配问题。尤其是数字滤波可以对频率很低的信号进行滤波,这是模拟滤波器做不到的。

2、数字滤波使用软件算法实现,多输入通道可共用一个滤波程序,降低系统开支。

3、只要适当改变滤波器的滤波程序或运算,就能方便地改变其滤波特性,这对于滤除低频干扰和随机信号会有较大的效果。

4、在单片机系统中常用的滤波算法有限幅滤波法、中值滤波法、算术平均滤波法、加权平均滤波法、滑动平均滤波等。

(1)限幅滤波算法

该运算的过程中将两次相邻的采样相减,求出其增量,然后将增量的绝对值,与两次采样允许的最大差值A进行比较。A的大小由被测对象的具体情况而定,如果小于或等于允许的最大差值,则本次采样有效;否则取上次采样值作为本次数据的样本。

算法的程序代码如下:

#defineA //允许的最大差值

chardata; //上一次的数据

char filter()

{

chardatanew; //新数据变量

datanew=get_data(); //获得新数据变量

if((datanew-data)>A||(data-datanew>A))

return data;

else

returndatanew;

}

说明:限幅滤波法主要用于处理变化较为缓慢的数据,如温度、物体的位置等。使用时,关键要选取合适的门限制A。通常这可由经验数据获得,必要时可通过实验得到。

(2)中值滤波算法

该运算的过程是对某一参数连续采样N次(N一般为奇数),然后把N次采样的值按从小到大排列,再取中间值作为本次采样值,整个过程实际上是一个序列排序的过程。

算法的程序代码如下:

#define N11 //定义获得的数据个数

char filter()

{

charvalue_buff[N]; //定义存储数据的数组

char count,i,j,temp;

for(count=0;count

{

value_buf[count]=get_data();

delay(); //如果采集数据比较慢,那么就需要延时或中断

}

for(j=0;j

{

for(value_buff[i]>value_buff[i+1]

{

temp=value_buff[i];

value_buff[i]=value_buff[i+1];

value_buff[i+1]=temp;

}

}

returnvalue_buff[(N-1)/2];

}

说明:中值滤波比较适用于去掉由偶然因素引起的波动和采样器不稳定而引起的脉动干扰。若被测量值变化比较慢,采用中值滤波法效果会比较好,但如果数据变化比较快,则不宜采用此方法。

(3)算术平均滤波算法

该算法的基本原理很简单,就是连续取N次采样值后进行算术平均。

算法的程序代码如下:

char filter()

{

int sum=0;

for(count=0;count

{

sum+=get_data();

delay():

}

return (char)(sum/N);

}

说明:算术平均滤波算法适用于对具有随机干扰的信号进行滤波。这种信号的特点是有一个平均值,信号在某一数值附近上下波动。信号的平均平滑程度完全到决于N值。当N较大时,平滑度高,灵敏度低;当N较小时,平滑度低,但灵敏度高。为了方便求平均值,N一般取4、8、16、32之类的2的整数幂,以便在程序中用移位操作来代替除法。

(4)加权平均滤波算法

由于前面所说的“算术平均滤波算法”存在平滑度和灵敏度之间的矛盾。为了协调平滑度和灵敏度之间的关系,可采用加权平均滤波。它的原理是对连续N次采样值分别乘上不同的加权系数之后再求累加,加权系数一般先小后大,以突出后面若干采样的效果,加强系统对参数变化趋势的认识。各个加权系数均小于1的小数,且满足总和等于1的结束条件。这样加权运算之后的累加和即为有效采样值。其中加权平均数字滤波的数学模型是:

式中:D为N个采样值的加权平均值:XN-i为第N-i次采样值;N为采样次数;Ci为加权系数。加权系数Ci体现了各种采样值在平均值中所占的比例。一般来说采样次数越靠后,取的比例越大,这样可增加新采样在平均值中所占的比重。加权平均值滤波法可突出一部分信号抵制另一部分信号,以提高采样值变化的灵敏度。

样例程序代码如下:

char codejq[N]={1,2,3,4,5,6,7,8,9,10,11,12}; //code数组为加权系数表,存在程序存储区

char codesum_jq=1+2+3+4+5+6+7+8+9+10+11+12;

char filter()

{

char count;

char value_buff[N];

int sum=0;

for(count=0;count

{

value_buff[count]=get_data();

delay();

}

for(count=0;count

sum+=value_buff[count]*jq[count];

return(char)(sum/sum_jq);

}

(5)滑动平均滤波算法

以上介绍和各种平均滤波算法有一个共同点,即每获取一个有效采样值必须连续进行若干次采样,当采速度慢时,系统的实时得不到保证。这里介绍的滑动平均滤波算法只采样一次,将一次采样值和过去的若干次采样值一起求平均,得到的有效采样值即可投入使用。如果取N个采样值求平均,存储区中必须开辟N个数据的暂存区。每新采集一个数据便存入暂存区中,同时去掉一个最老数据,保存这N个数据始终是最新更新的数据。采用环型队列结构可以方便地实现这种数据存放方式。

程序代码如下:

char value_buff[N];

char i=0;

char filter()

{

char count;

int sum=0;

value_buff[i++]=get_data();

if(i==N)

i=0;

for(count=0;count

sum=value_buff[count];

return (char)(sum/N);

}

(6)低通滤波

将普通硬件RC低通滤波器的微分方程用差分方程来表求,变可以采用软件算法来模拟硬件滤波的功能,经推导,低通滤波算法如下:

Yn=a* Xn+(1-a) *Yn-1

式中 Xn——本次采样值Yn-1——上次的滤波输出值;a——滤波系数,其值通常远小于1;Yn——本次滤波的输出值。

由上式可以看出,本次滤波的输出值主要取决于上次滤波的输出值(注意不是上次的采样值,这和加权平均滤波是有本质区别的),本次采样值对滤波输出的贡献是比较小的,但多少有些修正作用,这种算法便模拟了具体有教大惯性的低通滤波器功能。

滤波算法的截止频率可用以下式计算:

fL=a/2Pit

pi为圆周率3.14…式中 a——滤波系数;t——采样间隔时间;例如:当t=0.5s(即每秒2次),a=1/32时;fL=(1/32)/(2*3.14*0.5)=0.01Hz

当目标参数为变化很慢的物理量时,这是很有效的。另外一方面,它不能滤除高于1/2采样频率的干搅信号,本例中采样频率为2Hz,故对1Hz以上的干搅信号应采用其他方式滤除,低通滤波算法程序于加权平均滤波相似,但加权系数只有两个:a和1-a。为计算方便,a取一整数,1-a用256-a,来代替,计算结果舍去最低字节即可,因为只有两项,a和1-a,均以立即数的形式编入程序中,不另外设表格。虽然采样值为单元字节(8位A/D)。为保证运算精度,滤波输出值用双字节表示,其中一个字节整数,一字节小数,否则有可能因为每次舍去尾数而使输出不会变化。

设Yn-1存放在30H(整数)和31H(小数)两单元中,Yn存放在32H(整数)和33H(小数)中。滤波程序如下:副表6.

今天就写到这,因为数字滤波的算法还有很多种方法,比如一阶滞后低通滤波器(惯性滤波法),限时滤波,容错冗余三中取二滤波法等等。不过由于个人能力和时间的原因,还没能把它们一一地列出。以后我会不断地找资料把它们完善。


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

    关注

    6036

    文章

    44555

    浏览量

    634908
  • 算法
    +关注

    关注

    23

    文章

    4608

    浏览量

    92855
  • 数字滤波
    +关注

    关注

    1

    文章

    56

    浏览量

    16854

原文标题:你必须了解的单片机数字滤波的这些算法~~太全面了!

文章出处:【微信号:Mouser-Community,微信公众号:贸泽电子设计圈】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    AMC1304后接的数字滤波器接口应该是什么样的?

    在看完AMC1304手册后依旧有部分疑问以及无法确定的细节,希望得到帮助 目前在尝试使用STM32F7中的DFSDM进行数字滤波滤波器输入支持SPI、 曼彻斯特编码 、PDM 和并行输入。 存在
    发表于 11-28 06:43

    模拟滤波器到数字滤波器的转换步骤

    将模拟滤波器转换为数字滤波器是一个涉及多个步骤的过程,旨在保持滤波器性能的同时,适应数字信号处理的需求。以下是将模拟滤波器转换为
    的头像 发表于 11-26 10:03 675次阅读

    ADS1256的数字滤波器时可以自己设置吗?

    想问下TI,ADS1256的数字滤波器时可以自己设置吗,还是通过ADC的DATA RATE的设置,默认是设置到相对于的数字滤波
    发表于 11-26 07:13

    数模转换器与数字滤波器的结合应用

    数模转换器(DAC)与数字滤波器的结合应用在现代电子系统中非常普遍,这种结合能够显著提高系统的性能、精度和可靠性。以下是对数模转换器与数字滤波器结合应用的介绍: 一、数模转换器(DAC)的作用
    的头像 发表于 11-25 16:20 267次阅读

    ADC3663数字滤波器如何使用呢?

    板上用到了ADC3663,看数据手册上,它可以有数字滤波功能,甚至不需要前级的抗混叠滤波器(这么理解对吗)。 我想问下,这个数字滤波器如何使用呢?咱们是否有推荐的资料,如源码等。 因为看了手册也不知道从何处着手呢
    发表于 11-18 07:12

    基于FPGA实现FIR数字滤波

    数字信号处理系统中,有限脉冲响应(finite impulse response,FIR)数字滤波器是一个非常重要的基本单元。近年来,由于FPGA具有高速度、高集成度和高可靠性的特点而得到快速发展
    的头像 发表于 11-05 16:26 534次阅读
    基于FPGA<b class='flag-5'>实现</b>FIR<b class='flag-5'>数字滤波</b>器

    用DM642做音频的数字滤波时总是有很大的杂声,怎么解决?

    此前在用DM642做音频的数字滤波时,滤波后的结果在通过AIC23B输出时总是有很大的杂声,这几天偶然将之前的AIC23B的接口协议修改为IIS Mode后,输出端的杂声就没了,滤波效果也很明显
    发表于 10-30 07:43

    滤波参数tor对数字滤波结果的影响

    在探讨滤波参数tor对数字滤波结果的影响时,首先需要澄清一点:在标准的滤波理论和技术文献中,并没有直接名为“tor”的滤波参数。这可能是一个误写、特定领域的专有名词或是对某个参数的非标
    的头像 发表于 09-21 09:39 492次阅读

    Δ-Σ ADC中的数字滤波器类型

    电子发烧友网站提供《Δ-Σ ADC中的数字滤波器类型.pdf》资料免费下载
    发表于 09-06 09:50 0次下载
    Δ-Σ ADC中的<b class='flag-5'>数字滤波</b>器类型

    数字滤波器的实现方法

    数字滤波器是一通过对数字信号进行处理来完成对数字信号或模拟信号进行滤波的仪器。其实现方式多样,
    的头像 发表于 08-20 16:06 761次阅读

    AMC1210四通道数字滤波器数据表

    电子发烧友网站提供《AMC1210四通道数字滤波器数据表.pdf》资料免费下载
    发表于 08-19 09:15 0次下载
    AMC1210四通道<b class='flag-5'>数字滤波</b>器数据表

    数字滤波器的原理和应用

    数字滤波器是一数字乘法器、加法器和延时单元组成的算法或装置,其输入和输出均为数字信号。它的主要功能是通过一定的运算关系改变输入信号所含频
    的头像 发表于 08-05 16:19 1096次阅读
    <b class='flag-5'>数字滤波</b>器的原理和应用

    数字滤波器是如何工作的

    之前我们在说明数字滤波器的时候,多为Python来进行示例验证的。实际应用中,多为C/C++,无论是在嵌入式系统中,还是PC机上,尤其对于时间或者实时性要求比较严格的情况下,C/C++应该是我们的首选。
    的头像 发表于 06-13 10:09 537次阅读
    <b class='flag-5'>数字滤波</b>器是如何工作的

    数字滤波器的频率响应与模拟滤波器的频率响应有何区别

    数字滤波器的频率响应与模拟滤波器的频率响应有何区别  数字滤波器和模拟滤波器是用于信号处理和滤波的两
    的头像 发表于 02-05 09:10 1584次阅读

    数字滤波器在中频处理中的分类及区别

    数字滤波器在中频处理中的分类主要依据其用途和性能要求。
    的头像 发表于 01-29 17:03 931次阅读