数字滤波技术简介
所谓数字滤波,就是通过一定的计算或判断程序减少干扰在有用信号中的比重。故实质上它是一种程序滤波。
在单片机进行数据采集时,会遇到数据的随机误差,随机误差是由随机干扰引起的,其特点是在相同条件下测量同一量时,其大小和符号会现无规则的变化而无法预测,但多次测量的结果符合统计规律。为克服随机干扰引起的误差,硬件上可采用滤波技术,软件上可采用软件算法实现数字滤波。滤波算法往往是系统测控算法的一个重要组成部分,实时性很强。
采用数字滤波算法克服随机干扰的误差具有以下优点:
1、数字滤波无需其他的硬件成本,只用一个计算过程,可靠性高,不存在阻抗匹配问题。尤其是数字滤波可以对频率很低的信号进行滤波,这是模拟滤波器做不到的。
2、数字滤波使用软件算法实现,多输入通道可共用一个滤波程序,降低系统开支。
3、只要适当改变滤波器的滤波程序或运算,就能方便地改变其滤波特性,这对于滤除低频干扰和随机信号会有较大的效果。
4、在单片机系统中常用的滤波算法有限幅滤波法、中值滤波法、算术平均滤波法、加权平均滤波法、滑动平均滤波等。
限幅滤波
def:该运算的过程中将两次相邻的采样相减,求出其增量,然后将增量的绝对值,与两次采样允许的最大差值A进行比较。A的大小由被测对象的具体情况而定,如果小于或等于允许的最大差值,则本次采样有效;否则取上次采样值作为本次数据的样本。
#define Max_wr //允许的最大差值
char data; //上一次的数据
char filter1()
{
char datanew; //新数据变量
datanew = get_data(); //获得新数据变量
if((datanew - data) > A || (data - datanew > A))
return data;
else
return datanew;
}
eg:我们通过实验采集到的数据波形如下图所示:
上图为通过实验采集到的数据波形,下图为经过限幅滤波后的波形,可以看到很多毛刺都被滤除了。
#define N 11 //定义获得的数据个数
char filter2()
{
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(i=0;i<N-j-1;i++)
{
if(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];
}
说明:限幅滤波程序设计简单、运算速度快、占用RAM少,是一种最简单的基本滤波方法。能够克服偶然因素引入的脉冲干扰,也可以消除波形上的尖峰毛刺,但是不能抑制周期性的干扰,而且其完全削除大幅度的阶跃信号,容易造成控制失调,一般不适用于开关电源这类变化剧烈,需要迅速反馈的场景,适用于水温控制等变化缓慢,安全性高的应用。使用时,关键要选取合适的门限制A的。通常这可由经验数据获得,必要时可通过实验得到。
中值滤波算法
该运算的过程是对某一参数连续采样N次(N一般为奇数),然后把N次采样的值按从小到大排列,再取中间值作为本次采样值,整个过程实际上是一个序列排序的过程。
上图为通过实验采集到的数据波形,下图为经过中值滤波后的波形,可以看到其滤波效果较限幅滤波较好,毛刺基本被滤除。
适用性分析:
这种滤波方法能够有效的克服偶然因素引起的波动干扰,特别是对于像温度、液位等变化缓慢的被测参数有良好的滤波效果,但是对于流量、速度或者其他快速变化的信号参数则不适合使用这种方法。中值滤波法的程序设计要稍复杂一些,排序可以使用冒泡法或者选择排序法等,由于引入了排序算法,所以该方法不能处理速度要求很高的信号。其运算处理速度和占用的RAM直接受所选择的数值N决定。
中值滤波比较适用于去掉由偶然因素引起的波动和采样器不稳定而引起的脉动干扰。若被测量值变化比较慢,采用中值滤波法效果会比较好,但如果数据变化比较快,则不宜采用此方法。
算术平均滤波
该方法也是先将原来设计要求的采样间隔△T进行细分,在AT内采样N次,但是对于采集进来的数据不是进行排序,而是进行算术平均,算术平均的结果作为本次采样值。N值的选取比较关键,N值较大者处理信号的平滑度会较高,但是灵敏度降低;相反,N值较小者处理信号的灵敏度提高,但是平滑度降低。该算法的基本原理很简单,就是连续取N次采样值后进行算术平均。
#define N num
char filter()
{
int sum=0;
for(count=0;count<N;count++)
{
sum+=get_data();
delay():
}
return (char)(sum/N);
}
上图为通过实验采集到的数据波形,下图为经过算术滤波后的波形。
这种滤波方法是适用于对具有随机干扰的信号进行处理,并且被处理的信号必须具有一个平均值,信号在这个平均值上下波动。该方法对于高速信号并不适用。对于毛刺信号,可以看到均值滤波将其分担到了周围的采样点上,不如中值滤波那样能够完全去除。但是对于随机噪声信号,由于其理论均值为0,均值滤波对第一段噪声有良好的滤除效果。该滤波方法运算处理速度和RAM的占用率也受所选择的数值N决定,可以使用时间复杂度较低的排序方法降低运算开销。