在单片机进行数据采集时,有时会遇到数据的随机误差的问题,随机误差由随机干扰引起,其特点是在相同条件下测量同一量时,大小和符号会现无规则的变化,从而导致无法预测,但多次测量的结果符合统计规律。 为了克服随机干扰引起的误差,在硬件上采用滤波技术,在软件上采用软件算法实现数字滤波。滤波算法是系统测控算法的一个重要组成部分,实时性很强。 采用数字滤波算法克服随机干扰的误差有以下优点: 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)加权平均滤波算法 由于前面所说的 |
|Archiver|手机版|家电维修论坛
( 蜀ICP备19011473号-4 川公网安备51102502000164号 )
GMT+8, 2025-5-7 04:26 , Processed in 0.117433 second(s), 17 queries .
Powered by Discuz! X3.5
© 2001-2025 Discuz! Team.