单片机中常用的一些滤波算法

2019-04-15 17:26发布

0 引言 在单片机的数据采集系统中,测量通道串入随机干扰是难免的,从而使A/D转换送入单片机的数据存在误差,这种因随机干扰产生的误差称为随机误差。随机误差虽然无法预测,但多次测量结果是符合统计规律的。为克服随机干扰产生的误差,可以采用硬件抗干扰的方法,也可以采用按统计规律用软件方法实现,即采用数字滤波的方法来抑制有效信号中的干扰成分,从而消除随机误差。 1 常用的数字滤波算法及实现 在单片机的数据采集系统中,常用的数字滤波算法有限幅滤波、中位值滤波、算术平均滤波、移动平均滤波、加权平均滤波、低通滤波、中位值平均滤波等。以下就分别介绍其原理及滤波程序。 1.1 限幅滤波 限幅滤波的基本原理是把两次相邻时刻(n和n-1)的采样值Yn和Yn-1相减,求出其差值,以绝对值表示,然后将这个差值与两次采样允许的最大偏差值ΔY比较,如果两次采样值的差值超过了允许的最大偏差值ΔY,则认为发生了随机干扰,并认为最后一次采样值Yn非法,应予剔除。剔除Yn后,可用Yn-1代替Yn;若未超过允许的最大偏差值范围,则认为本次采样值有效。可用如下公式表示: |Yn-Yn-1|≤ΔY;则Yn有效 |Yn-Yn-1|>ΔY;则Yn-1有效 此算法的样例子程序如下: #define A 10   //A值可根据实际情况调整 char data;    //上一次的数据 char filter_1() { char datanew;  //新数据变量 datanew=get_data();   //获得新数据 //滤波算法 if ((datanew-data>A)||(data-datanew>A)  return data; return datanew; }     该算法主要用于处理变化比较缓慢的数据,如温度、物体的位置等。使用时关键在于最大偏差值的Δy的选择,通常可根据经验获得,也可按照输出参数可能的最大变化速度Vmax及采样周期T来决定ΔY的值[1],即ΔY=VmaxT。 1.2 中位值滤波 中位值滤波是先对某一参数连续采样N次(一般N取奇数),然后把N次采样值按从小到大排列,取中间值为本次采样值。 该滤波方法实际上是一种排序方法,文献[2,7,9]采用的是冒泡法排序。由于在冒泡法排序中,每出现一次前者数据大于后者数据,就要进行二者数据的交换,效率很低,故在验证时改用选择排序法。 该算法的样例子程序如下: #define N 11  //N值可根据实际情况调整 char filter_2() { char value_buf[]; char count,i,j,k,temp; for(count=0;count缓慢变化的被测参数采用此算法能收到良好的滤波效果,但对于流量、压力等快速变化的数据,不宜采用中位值滤波。 1.3 算术平均滤波 算术平均滤波法是要按输入的N个采样数据Xi(i从1到N),寻找这样一个Y,使Y与各采样值之间的偏差的平方和最小,即                      (1) 由一元函数求极值的原理,可得                     (2) 此即为算术平均滤波的基本算式。具体实现此算法的子程序如下: #define N 12 char filter_3() { int count; int sum=0; for(count=0;count,因此它不适用于脉冲干扰比较严重的场合,而适用于高频振荡的系统。通过观察不同N值下移动平均的输出响应来选取N值,以便既少占用单片机的时间,又能达到最好的滤波效果。 1.5 加权平均滤波 在算术平均滤波和移动平均滤波中,N次采样值在输出结果中的权重是均等的,取1/N。用这样的滤波算法,对于时变信号会引入滞后,N值越大,滞后越严重[1,4]。为了增加新采样数据在移动平均中的权重,以提高系统对当前采样值中所受干扰的灵敏度,可采用加权平均滤波,它是移动平均滤波算法的改进。 加权平均滤波是对连续N次采样值分别乘上不同的加权系统之后再求累加和,加权系统一般先小后大,以突出后面若干采样的效果,加强系统对参数变化趋势的辨识。各个加权系统均为小于1的小数,且满足总和等于1的约束条件。这样,加权运算之后的累加和即为有效采样值。 为方便计算,可取各加权系数均为整数,且总和为256,加权运算后的累加和除以256,即舍去低字节后便是有效采样值。具体的样例子程序如下: //code数组为加权系统表,存在ROM区。 #define N 12 char code jq[N]={1,2,3,4,5,6,7,8,9,10,11 ,12};  char code sum_jp=1+2+3+4+5+6+7+8+9+10+11 +12; char filter_5() { char count; char value_buf[N]; int sum=0; for(count=0;countdatas[pmax]) pmax=pdata; else if(_datadatas[pmax])    pmax=i;  }  else if(pdata==pmin)  {  for(i=0;i>SHIFT);   } 这种滤波方法兼容了移动平均滤波算法和中位值滤波算法的优点,所以无论对缓慢变化的信号,还是对快速变化的信号,都能取得较好的滤波效果。 1.7低通滤波 将描述模拟RC低通滤波特性的微分方程用差分方程来表示,便可以用软件算法来实现模拟滤波的功能[4]。 最简单的一阶RC低通滤波器描述其输入x(t)与输出y(t)的微分方程为                 (3) 以采样周期T对x(t)、y(t)进行采样得 yn=y(Nt) xn=x(Nt) 如果T<