在实际生产中,相邻两次采样值之间的变化都有一个合理的限度。如果相邻两次采样值之间的变化为超过预定的范围,说明该采样值未收到明显干扰,可以采信。如果相邻两次采样值之间的变化超过预定范围,说明采样值收到明显干扰,不能采信。对于不可信得采样数据,必须输出一个合理的替代数据,以保证采样序列的连续性和完整性。
一、采用前一个数值替代
在要求不高的场合,可以用前一个采样数据来替代。这种由程序进行简单判断的数字滤波算法称为“程序判断滤波”,也称“限幅滤波”。相应程序如下:
#define D 10 //相邻两次采样之间最大允许变化值
int history; //上次采样值
int filter()
{
int new;
new=SampleADC(); //进行一次采样
if((new-history>D)||(history-new>D))//与前一次采样值比较
new=history; //如果超过允许范围,以前一次数据为准
history=new; //刷新上次采样值
return new; //返回本次有效值
}
二、采用预测数值替代
当被检测物理量处于明显变化阶段时,相邻两个采样值之间的差别也比较明显,这时采用前一个采样值替代当前采样值就会存在较大误差。因此可以利用被检测物理量的变化趋势来进行预测,选择一个更加合理的数据来替代当前受干扰的采样值,使得替代误差大大减小。
为了掌握被检测物理量的变化趋势,至少需要 两次以上的采样记录。如果采用最简单的线性预测算法,只要两个历史采样值就可以了。线性预测算法的含义为“当前采样值的变化趋势与前一次采样值的变化趋势相同”,即采样值在短期内保持相同的上升或下降趋势。设相邻3次采样值依次为x0,x1和x2,则有:
x2-x1=x1-x0
由此可得:
x2=2x1-x0
即由两个历史采样值x0和x1可以预测当前采样值x2,用这个预测值来替代受干扰的当前采样值会更加合理。改进的程序如下:
#define D 10
int history[2];
int filter()
{
int new;
new=SampleADC();
if((new-history[1]>D)||(history[1]-new>D))
{
new=2*history[1]-history[0];
if(new<0)new=0;
if(new>4095)new=4095;
}
history[0]=history[1];
history[1]=new;
retuen new;
}
程序判断滤波的关键是合理确定采样周期和相邻两次采样值得最大允许变化值。
程序判断滤波本质上是低通滤波,由于毛刺型突发干扰为高频干扰,故可以被很好地滤除。另一方面,程序判断滤波采用限幅手段来达到滤波目的,对于幅度比较小的噪声干扰无能为力,即不能滤除随机干扰,因此只能用于对精度要求不是很高的场合。