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

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

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

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

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

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

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

(1)限幅滤波算法

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

算法的程序代码如下:

#define A //允许的最大差值

char data; //上一次的数据

char filter()

{

char datanew; //新数据变量

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

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

return data;

else

return datanew;

}

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

(2)中值滤波算法

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

算法的程序代码如下:

#define N 11 //定义获得的数据个数

char filter()

{

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

char count,i,j,temp;

for(count=0;count<N;count++) //获取数据

{

value_buf[count]=get_data();

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

}

for(j=0;j<N-1;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;

}

}

return value_buff[(N-1)/2];

}

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

(3)算术平均滤波算法

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

算法的程序代码如下:

char filter()

{

int sum=0;

for (count=0;count<N;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 code jq[N]={1,2,3,4,5,6,7,8,9,10,11,12}; //code数组为加权系数表,存在程序存储区

char code sum_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<N;count++)

{

value_buff[count]=get_data();

delay();

}

for(count=0;count<N;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<N;count++)

sum=value_buff[count];

return (char)(sum/N);

}

参考资料:

嵌入式底层开发 - AIOT时代,嵌入式人才的破局之道! - 创客学院直播室​www.makeru.com.cn

嵌入式底层开发 - AIOT时代,嵌入式人才的破局之道! - 创客学院直播室​www.makeru.com.cn

嵌入式开发直播课 - 走进嵌入式 - 创客学院直播室​www.makeru.com.cn

通达信 移动平均算法_单片机数字滤波的算法相关推荐

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

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

  2. 通达信金融终端_尘缘整合_V7.12

    http://pan.baidu.com/s/1gvtPO http://pan.baidu.com/s/1xqrk6 通达信金融终端_尘缘整合_V7.12 转载于:https://www.cnblo ...

  3. 通达信 移动平均算法_通达信线性回归通道主图指标公式;通达信顶底轻松买卖副图指标公式...

    作者: 黄老师  发布时间: 06/04 2020 16:00 信线性回归通道主图指标: UR:=6;LR:=6;TC1:=IF(H=HHV(H,8*UR),H,DRAWNULL);TC2:=CONS ...

  4. 通达信 移动平均算法_通达信洗盘监庄指标副图公式

    作者: 黄老师  发布时间: 06/03 2020 08:00 VARC:=LOW;VARD:=REF(LOW,1);VARE:=SMA(ABS(VARC-VARD),3,1)/SMA(MAX(VAR ...

  5. 通达信 移动平均算法_通达信仓位管理主图指标公式

    作者: 黄老师  发布时间: 06/02 2020 15:00 MA10:MA(C,10)COLORWHITE,LINETHICK2;MA30:MA(C,30)COLOR238E23,LINETHIC ...

  6. 通达信 移动平均算法_通达信组合指标,如何使用股票池进行自动交易?实现程序化交易...

    除了使用股票池自动交易外,也可以使用预警指标公式自动下单或者图表自动交易来实现股票程序化交易.这一节先介绍利用股票池来实现自动化交易和实现股票程序化交易. 股票池自动交易图文 1.绑定 order.d ...

  7. roe公式 通达信 去年四季度_价格围绕价值上下波动-----价格偏离曲线公式

    在经济学里,有一商品价格波动理论:商品价格总是围绕着价值上下波动.在股票中,存不存在这样情况?股票价格在某时段里,会围绕着某一价格上下波动?经过多长时间观察和测试.本人发现了一个现象,当股票价格突然大 ...

  8. 通达信公式大全_通达信MACD金叉的选股公式大全

    公式来源于网络,我只是用其中一个,一起复制来了,有需要的自取吧.1.0轴上方第一次金叉选股公式: DIFF:=EMA(CLOSE,12) - EMA(CLOSE,26); DEA := EMA(DIF ...

  9. python 通达信公式函数_通达信zig函数的python实现

    通达信zig函数的python实现 代码 # coding: utf-8 """ Created on Sat Jan 05 18:53:39 2019 http://w ...

最新文章

  1. feedback from waic
  2. [20170617]vim中调用sqlplus.txt
  3. 中奖福利事宜 和 跪求意见
  4. 图片跟随鼠标移动并放大js特效
  5. 分数的表示以及计算(c++)
  6. java编写一个整钱换零_Java编写钱币转换为大写程序
  7. python 输出文件中返回码为200的接口的平均响应时间_python-处理日志文件,找出各个接口状态码为 200时的平均响应时间...
  8. SVN源码服务器搭建-详细教程(我的收藏)
  9. java基础---线程
  10. pe修改rpc服务器不可用,电脑rpc服务器不可用,教你电脑rpc服务器不可用怎么解决...
  11. linux 中文输入鼠标跳动,解决wps for linux 中文输入法光标不跟随的问题
  12. vector begin()用法
  13. tms xdata、sparkle服务运行时显示拒绝访问的错误
  14. 1334: PIPI计数
  15. Clojure 学习入门(18)—— 数据类型
  16. python连接不上数据库_python连接各种数据库
  17. 岭回归与lasso回归算法
  18. K8s安全管理:认证、授权、准入控制
  19. 用EasyRTSPServer模拟摄像机RTSP流实现RTSP摄像机模拟器
  20. html中repeat平铺图片5张,no-repeat

热门文章

  1. 足球数据【图文直播】API调用示例代码
  2. flutter 适配Android ios全面屏
  3. VBA学习笔记8:单元格的合并与拆分
  4. Javascript查找字符串中的某个值,截取其之前。和之后的值
  5. 社会化分享排名:QQ空间第一、新浪微博第二
  6. 网络安全应急响应具体操作流程
  7. Three.js(7):局部纹理刷新
  8. 微信新功能,暴露了微信的焦虑
  9. 计算机中那些事儿(六):让你的计算机飞一般的感觉
  10. 量化接口api是什么?