关注、星标公众号,直达精彩内容ID:技术让梦想更伟大整理:李肖遥

单片机主要作用是控制外围的器件,并实现一定的通信和数据处理。但在某些特定场合,不可避免地要用到数学运算,尽管单片机并不擅长实现算法和进行复杂的运算。下面主要是介绍如何用单片机实现数字滤波。在单片机进行数据采集时,会遇到数据的随机误差,随机误差是由随机干扰引起的,其特点是在相同条件下测量同一量时,其大小和符号会现无规则的变化而无法预测,但多次测量的结果符合统计规律。为克服随机干扰引起的误差,硬件上可采用滤波技术,软件上可采用软件算法实现数字滤波。滤波算法往往是系统测控算法的一个重要组成部分,实时性很强。采用数字滤波算法克服随机干扰的误差具有以下优点:

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

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

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

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

限幅滤波算法

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

 1#define A //允许的最大差值 2 3char data; //上一次的数据 4 5char filter() 6 7{ 8 9    char datanew; //新数据变量1011    datanew=get_data(); //获得新数据变量1213    if((datanew-data)>A||(data-datanew>A))1415        return data;1617    else1819        return datanew;2021}

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

中值滤波算法

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

 1#define N 11 //定义获得的数据个数 2 3char filter() 4 5{ 6 7    char value_buff[N]; //定义存储数据的数组 8 9    char count,i,j,temp;1011    for(count=0;count1213    {1415        value_buf[count]=get_data();1617        delay(); //如果采集数据比较慢,那么就需要延时或中断1819    }2021    for(j=0;j2223    {2425        if(value_buff[i]>value_buff[i+1])2627        {2829            temp=value_buff[i];3031            value_buff[i]=value_buff[i+1];3233            value_buff[i+1]=temp;3435        }3637    }3839return value_buff[(N-1)/2];4041}

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

算术平均滤波算法

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

 1char filter() 2 3{ 4 5    int sum=0; 6 7    for(count=0;count 8 9    {1011        sum+=get_data();1213        delay():1415    }1617    return (char)(sum/N);1819}

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

加权平均滤波算法

由于前面所说的“算术平均滤波算法”存在平滑度和灵敏度之间的矛盾。为了协调平滑度和灵敏度之间的关系,可采用加权平均滤波。它的原理是对连续N次采样值分别乘上不同的加权系数之后再求累加,加权系数一般先小后大,以突出后面若干采样的效果,加强系统对参数变化趋势的认识。各个加权系数均小于1的小数,且满足总和等于1的结束条件。这样加权运算之后的累加和即为有效采样值。其中加权平均数字滤波的数学模型是:式中:D为N个采样值的加权平均值:XN-i为第N-i次采样值;N为采样次数;Ci为加权系数。加权系数Ci体现了各种采样值在平均值中所占的比例。一般来说采样次数越靠后,取的比例越大,这样可增加新采样在平均值中所占的比重。加权平均值滤波法可突出一部分信号抵制另一部分信号,以提高采样值变化的灵敏度。样例程序代码如下:

 1char codejq[N]={1,2,3,4,5,6,7,8,9,10,11,12}; //code数组为加权系数表,存在程序存储区 2 3char codesum_jq=1+2+3+4+5+6+7+8+9+10+11+12; 4 5char filter() 6 7{ 8 9    char count;1011    char value_buff[N];1213    int sum=0;1415    for(count=0;count1617    {1819        value_buff[count]=get_data();2021        delay();2223    }2425    for(count=0;count2627        sum+=value_buff[count]*jq[count];2829    return (char)(sum/sum_jq);3031}

滑动平均滤波算法

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

 1char value_buff[N]; 2 3char i=0; 4 5char filter() 6 7{ 8 9    char count;1011    int sum=0;1213    value_buff[i++]=get_data();1415    if(i==N)1617        i=0;1819    for(count=0;count2021        sum=value_buff[count];2223    return (char)(sum/N);2425}

低通滤波

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

1Yn=a* Xn+(1-a) *Yn-123式中 Xn——本次采样值45Yn-1——上次的滤波输出值;67a——滤波系数,其值通常远小于1;89Yn——本次滤波的输出值。

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

1fL=a/2Pit pi为圆周率3.14…23式中 a——滤波系数;45t——采样间隔时间;67例如:当t=0.5s(即每秒2次),a=1/32时;89fL=(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(小数)中。-END-整理文章为传播相关技术,版权归原作者所有 || 如有侵权,请联系删除 |

往期好文合集

研究生,该学单片机还是PLC?"单片机解密"是什么?如何才能学好单片机?

最 后

若觉得文章不错,转发分享,也是我们继续更新的动力。5T资源大放送!包括但不限于:C/C++,Linux,Python,Java,PHP,人工智能,PCB、FPGA、DSP、labview、单片机、等等在公众号内回复「更多资源」,即可免费获取,期待你的关注~

滑动平均滤波_单片机数字滤波算法如何实现?(附代码)相关推荐

  1. 数字滤波算法(一)——滑动平均滤波算法

    一.数字滤波器简介 数字滤波器是指通过一定的数据逻辑构成的可以滤除输入信号中的特定的噪声的算法,这里所指的数字滤波器主要包括平均值滤波.FIR滤波.CIC滤波等,在之后的实验中,我们将介绍不同数字滤波 ...

  2. c语言 算术平均滤波法_单片机数字滤波的算法

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

  3. [MATLAB学习]:Matlab生成滑动平均滤波算法文件并移植到STM32单片机上运行——基于CubeMX

    前言 人生如逆旅,我亦是行人. 今天分享一个在 MATLAB 上生成C算法文件,并将其移植到 keil5上,运行至 STM32 单片机,一个很有用的方法. 准备工作: 已安装 MATLAB 的软件(注 ...

  4. 滑动平均滤波c语言_常用滤波算法及C语言程序实现

    1.限幅滤波法(又称程序判断滤波法) A.方法: 根据经验判断,确定两次采样允许的最大偏差值(设为A) 每次检测到新值时判断: 如果本次值与上次值之差<=A,则本次值有效 如果本次值与上次值之差 ...

  5. 通达信 移动平均算法_单片机数字滤波的算法

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

  6. 滑动平均滤波算法——MATLAB实现

    算法原理 滑动平均滤波算法的基本思想是设定一个宽度固定的滑动窗口,该窗口沿着时间序列滑动,同时取窗内数据的算术平均值作为输出值,而由输出值组成另一个数字序列,也就是滤波后的序列.设N为滑动窗口的宽度, ...

  7. python 滤波_[开发技巧]·Python极简实现滑动平均滤波(基于Numpy.convolve)

    [开发技巧]·Python极简实现滑动平均滤波(基于Numpy.convolve) ​ 1.滑动平均概念 滑动平均滤波法(又称递推平均滤波法),时把连续取N个采样值看成一个队列 ,队列的长度固定为N ...

  8. 算法学习笔记之滑动平均滤波算法

    滑动平均滤波算法只采样一次,将一次采样值和过去的若干次采样值一起求平均,得到的有效采样值即可投入使用.如果取N个采样值求平均,存储区中必须开辟N个数据的暂存区.每新采集一个数据便存入暂存区中,同时去掉 ...

  9. 利用FFT分析比较卡尔曼滤波算法、低通滤波算法、滑动平均滤波的频谱

    1 卡尔曼滤波 详见博客 https://blog.csdn.net/moge19/article/details/81750731 2 低通滤波 2.1 算法推导 一阶RC滤波器的硬件电路如图: 图 ...

最新文章

  1. 从头开始写框架(一):浅谈JS模块化发展
  2. 初学Portal的基本概念
  3. python 图形界面文本处理_python3.6 +tkinter GUI编程 实现界面化的文本处理工具
  4. python基础单词-学Python必背的初级单词,快来看看学吧
  5. mysql常见的错误码
  6. 1.10-SpringMVC直接访问WEB-INF下jsp中的页面
  7. java坐标移动题目case_用java怎样编写一个二维坐标平移程序
  8. 招兵买马,韩国现代将前GM研究员招致麾下
  9. 关于Cohen-Sutherland算法和Liang-Barsky算法
  10. 百度深度学习图像识别决赛代码分享(OCR)
  11. Proteus8.6软件安装教程
  12. Unity打安卓包 Android 所有错误解决方案大全(几乎囊括所有打包错误 )
  13. WPF UserControl响应PreviewKeyDown事件方法
  14. 常用的Git代码托管平台
  15. postman的批量传送数据和接口关联
  16. 关闭弹出的WPS广告提示
  17. Dart笔记(10):Runes
  18. 什么是Socket 编程
  19. 程序员面试,面试官更注重代码量、项目经验还是操作系统、数据结构这种基础课程?...
  20. 互联网校招技术面试解析

热门文章

  1. 计算机教师资格证怎么报名时间,教师资格证考试必须在电脑上报名吗?
  2. 寒假集训D1.22.12.28
  3. 软件工程专业毕业设计(论文)写作框架
  4. 如何为云平台打造高性能CC防火墙
  5. Real-world Anomaly Detection in Surveillance Videos【CVPR 2018】(首次引入MIL)
  6. 测试caffe安装成功_用VSCODE调试Caffe程序
  7. 大数据在发电厂的应用_首例违反生活垃圾焚烧发电厂自动监测数据应用管理规定的违法企业被查处...
  8. 算法与程序设计(五):回溯法
  9. C++上机练习:关门人和开门人
  10. php mysql问答系统_PHP+MYSQL问答系统V3.7