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.

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


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

    关注

    6074

    文章

    45340

    浏览量

    663443
  • 算法
    +关注

    关注

    23

    文章

    4760

    浏览量

    97136
  • 数字滤波
    +关注

    关注

    1

    文章

    64

    浏览量

    17234

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

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

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    深入解析AMC1210:适用于电机控制的多功能数字滤波

      在电机控制应用领域,精确的电流测量和位置解码至关重要。TI推出的AMC1210数字滤波器,为这一领域提供了强大而灵活的解决方案。本文将深入剖析AMC1210的特性、工作原理、接口模式以及在
    的头像 发表于 11-29 14:03 1532次阅读
    深入<b class='flag-5'>解析</b>AMC1210:适用于电机控制的多功能<b class='flag-5'>数字滤波</b>器

    用于单片机几种C语言算法

    为克服随机干扰引起的误差,硬件上可采用滤波技术,软件上可采用软件算法实现数字滤波滤波算法往往是
    发表于 11-27 06:00

    哪些数字滤波算法适用于电能质量在线监测装置?

    在电能质量在线监测装置中,数字滤波算法的核心作用是 抑制干扰噪声、提取有效信号(如基波、谐波、暂态分量)、消除测量误差 ,最终确保电压 / 电流的幅值、频率、相位、谐波含量及暂态事件(暂升 / 暂降
    的头像 发表于 09-18 11:28 463次阅读

    DAC频率响应特性解析:从sinc函数衰减到补偿技术

    本文介绍了DAC频率响应特性,探讨sinc函数导致的信号衰减规律,对比数字滤波与模拟滤波补偿技术
    的头像 发表于 07-15 14:48 583次阅读
    DAC频率响应特性<b class='flag-5'>解析</b>:从sinc函数衰减到补偿技术

    技术干货 | DAC频率响应特性解析:从sinc函数衰减到补偿技术

    本章解析DAC频率响应特性,探讨sinc函数导致的信号衰减规律,对比数字滤波与模拟滤波补偿技术,帮助优化AWG模块输出信号的频率平坦度,提升测试测量精度。
    的头像 发表于 07-09 16:30 635次阅读
    技术干货 | DAC频率响应特性<b class='flag-5'>解析</b>:从sinc函数衰减到补偿技术

    STM32单片机片上数字滤波器操作文档 快速入门数字滤波器在单片机上的实现

    这个文档,是为了帮助大家快速入门数字滤波器在单片机上的实现
    的头像 发表于 06-23 16:53 1326次阅读
    STM32<b class='flag-5'>单片机</b>片上<b class='flag-5'>数字滤波</b>器操作文档 快速入门<b class='flag-5'>数字滤波</b>器在<b class='flag-5'>单片机</b>上的<b class='flag-5'>实现</b>

    常用的数字滤波算法及其特性

    常用的软件滤波器有限幅滤波法、中位值滤波法、算数平均滤波法、递推平均滤波法、中位值平均滤波法、限
    的头像 发表于 06-18 09:04 781次阅读

    磁致伸缩位移传感器物理滤波数字滤波

    磁致伸缩位移传感器在实际应用中,为了提高测量精度和稳定性,通常会采用物理滤波数字滤波技术。
    的头像 发表于 04-16 15:17 511次阅读
    磁致伸缩位移传感器物理<b class='flag-5'>滤波</b>和<b class='flag-5'>数字滤波</b>

    基于FPGA的FIR数字滤波器设计

    在现代通信信号处理领域中,随着各种精密计算和快速计算的发展对信号处理的实时性、快速性的要求越来越高。以往的模拟滤波器无法克服电压漂移、温度漂移和噪声等问题,从而带来了许多误差和不稳定因素。而数字滤波器具有稳定性高、精度高、设计灵活、实现
    的头像 发表于 03-06 12:31 1764次阅读
    基于FPGA的FIR<b class='flag-5'>数字滤波</b>器设计

    模拟电路在数字滤波器中的作用是什么?

    模拟电路在数字滤波器之前
    发表于 02-12 08:32

    ADS1114内部有一个数字滤波器,其带宽大概只有2Hz,用CD4051在每个通道之间切换,这样合理吗?

    一个系统中有12 路PT100测量温度,打算用一片ADS1114做数据采集,前级用CD4051在12个通道之间进行切换。一秒钟切换15次。 现在有个问题,ADS1114内部有一个数字滤波器,其带宽大概只有2Hz,我用CD4051在每个通道之间切换,这样合理吗?这个滤波
    发表于 02-10 08:28

    开年干货来袭:PLB实现滤波

    概述HPMicroMCU的TRIGMUX具有滤波功能,为部分输入信号提供了数字滤波器,支持滤刺模式、延时模式、滤峰模式和滤谷模式。但这滤波器仅针对外部从引脚的输入信号,不能对内部的信号进行滤波
    的头像 发表于 02-08 13:38 944次阅读
    开年干货来袭:PLB<b class='flag-5'>实现</b><b class='flag-5'>滤波</b>器

    ADS1292采集到的信号的波形,50Hz的干扰很严重怎么解决?

    ADS1292采集到的信号的波形如下: 但是50Hz的干扰很严重,已经加了右腿驱动了,还能看到明显的干扰。 请问如何把这个干扰滤除? 是需要采集之后做数字滤波吗?有没有数字滤波算法供参考一下?
    发表于 02-05 08:05

    ADS1293内部的数字滤波器是怎么样的作用?

    请问ADS1293内部的数字滤波器是怎么样的作用? 从DS中我看到该AFE有数字滤波器,请问它是心电算法中常见的低通滤波器吗?效果如何?可以配置吗
    发表于 01-20 07:37

    滤波器的一些常识

    滤波器简介:滤波器是一用于信号处理的设备或系统,用于改变信号的频率特性,以实现信号的滤波、增强、去噪或降噪等功能。
    的头像 发表于 12-18 17:05 1503次阅读
    <b class='flag-5'>滤波</b>器的一些常识