c语言 算术平均滤波法_单片机数字滤波的算法
单片机主要作用是控制外围的器件,并实现一定的通信和数据处理。但在某些特定场合,不可避免地要用到数学运算,尽管单片机并不擅长实现算法和进行复杂的运算。下面主要是介绍如何用单片机实现数字滤波。
在单片机进行数据采集时,会遇到数据的随机误差,随机误差是由随机干扰引起的,其特点是在相同条件下测量同一量时,其大小和符号会现无规则的变化而无法预测,但多次测量的结果符合统计规律。为克服随机干扰引起的误差,硬件上可采用滤波技术,软件上可采用软件算法实现数字滤波。滤波算法往往是系统测控算法的一个重要组成部分,实时性很强。
采用数字滤波算法克服随机干扰的误差具有以下优点:
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
c语言 算术平均滤波法_单片机数字滤波的算法相关推荐
- c语言 算术平均滤波法_基本C语言滤波算法
11种软件滤波方法的示例程序 假定从8位AD中读取数据(如果是更高位的AD可定义数据类型为int),子程序为get_ad(); 1.限副滤波 /* A值可根据实际情况调整 value为有效值,new ...
- c语言 算术平均滤波法_c语言滤波算法
c 语言滤波算法 C 语言软件滤波方法及相关示例 1 .限幅滤波法(又称程序判断滤波法) A .方法: 根据经验判断,确定两次采样允许的最大偏差值(设为 A ) 每次检测到新值时判断: 如果本次值与上 ...
- 通达信 移动平均算法_单片机数字滤波的算法
单片机主要作用是控制外围的器件,并实现一定的通信和数据处理.但在某些特定场合,不可避免地要用到数学运算,尽管单片机并不擅长实现算法和进行复杂的运算.下面主要是介绍如何用单片机实现数字滤波. 在单片机进 ...
- 滑动平均滤波_单片机数字滤波算法如何实现?(附代码)
关注.星标公众号,直达精彩内容ID:技术让梦想更伟大整理:李肖遥 单片机主要作用是控制外围的器件,并实现一定的通信和数据处理.但在某些特定场合,不可避免地要用到数学运算,尽管单片机并不擅长实现算法和进 ...
- 滤波算法 | 算术平均滤波法
算术平均滤波法适用于对一般的具有随机干扰的信号进行滤波.这种信号的特点是信号本身在某一数值范围附近上下波动 ,如测量流量.液位: 基本方法:按输入的N 个采样数据,寻找这样一个 Y , ...
- 单片机学c语言还是python好_单片机开发用哪种语言最好?
在过去的几十年中,单片机的规格变化不大,但是语言和支持软件的扩展为应用程序开发开辟了许多途径.多年来,对单片机进行编程涉及到两种语言的选择:C语言和汇编语言.但是随着现在可用于微处理器的新语言,用户在 ...
- 单片机c语言必背代码_单片机编程用C语言还是汇编?
单片机是一种可编程器件,单片机的出现使硬件设计变得更为简单,产品的功能也更强大,而程序就是单片机的灵魂.目前功能稍微复杂一点的电子产品,都是以单片机为核心,再加以不通的外设电路实现不通的功能需求.单片 ...
- c语言adc采集取平均值,单片机ADC采样算法----递推平均值采样法
在上一篇文章单片机ADC采样算法---平均值采样法中分析了平均值采样法的使用,上篇文章中的平均值采样法是连续采样100个数据,然后求平均值,这种方法存在一个问题,就是采集100个值之后,下一次又重新采 ...
- 从左到右的流水灯单片机课程设计实验报告c语言版,流水灯_单片机课程设计-实验-LED流水灯.doc...
实验 LED流水灯 P0口作输出口,经74LS244驱动,接8只发光二极管LED0-LED7.当单片机的引脚输出为低电平时发光二极管点亮,为高电平时息灭.编写程序,使8个发光二极管循环点亮,时间间隔约 ...
最新文章
- 通过Google挖掘细分市场的一个案例
- python使用方法-在Python中使用next()方法操作文件的教程
- Java14-day05【集合(Collection常用方法-遍历、List特有方法、List集合子类特点、LinkedList集合的特有功能、ListIterator)】
- linux敏感目录文件,Windows系统和Linux系统常见敏感信息路径
- 基于华为云的Django网站部署
- Java代码总结【1】_查询手机号码归属地
- Android学习(二十)Notification通知栏
- Ubuntu下安装配置JDK
- 大数据如何促进经济增长?中国优势及应对 | 互联网经济学
- 保点发布RFID鲜肉跟踪方案
- Spring Boot整合批量文件下载功能
- 保险的现金价值是什么意思?
- 【Cocos Creator实战教程(6)】——镜头跟随
- Vmware Vsphere HA创建集群步骤
- Struts2进阶版
- PostgreSQL不等于判断
- java catch 空指针异常_在Java中避免空指针异常(Null Pointer Exception)
- 描述一系列的几何图形,包括矩形,圆形,三角形
- jsp学生学籍信息管理系统
- java -jar命令运行jar包时指定外部依赖jar包
热门文章
- oracle19c 安装权限_Oracle19c 安装及SQL developer连接
- 如何获取投票提交地址_简单实用 | 2019全国医院擂台赛投票攻略(县域版)
- 命令行下 pdb 调试 Python 程序
- ProxyChains
- Java加密与解密的艺术~安全协议~模型分析
- C++学习之路 | PTA乙级——1090 危险品装箱 (25 分)(精简)
- python复杂非线性方程_非线性方程python入门——屠龙刀
- java链表list_java自定义List链表
- mysql ==null_mysql = null 问题
- hash和一致性hash