最近计划设计一些数据采集终端,主要用来模拟分布式数据采集与控制功能。由于自己的预算有限,因此,大部分功能实现均采用软件来实现,少部分必要功能由硬件实现。虽然牺牲了一些CPU处理时间,但是本身数据采集终端的功能单一,CPU也就完全能够胜任。这里就包括了温度采样功能里的滤波。
我们知道在普通环境下,外界的温度在短时间内是不会发生骤变的,因此,如果我们传感器采集的数据在短时间间隔变化较大,则有理由认为该数据为非法数据,应该被丢弃。说得专业一点就是:如果相邻两次采样值之间的变化未超过预定的范围,说明该采样值未明显干扰,可以采信。基于这个原理,某些牛人就设计了“程序判断滤波”方法,也称“限幅滤波”。
#define DX 15
Int32U history
Int32U ProgFilter()
{
Int32U temp;
temp = SampleADC();
if(((temp - history) > DX) || ((history - temp) >DX))
{
temp = history;}
history = temp;
return temp;
}
从源代码上我们可以轻松看到,对于采集出来的数据进行一次与上一次结果的比较判断,如果数据在限幅之内,则将数据保留。这时,我们忽略了一个情况,就是“如果数据限幅之外呢?这次数据就不要了吗?还是如何处理呢?”
在限幅之外时,如果数据正处于明显变化的阶段,两次采样数据也有明显的差别,这时没有有效数据而使用上一次数据来替代就有些不足,也会带来较大的误差了。如果我们这里采用合理的变化量预测,使用一个合理的数据来替代目前被干扰的,则会使误差减小。
对于可怜的MCU计算能力来,使用线性预测的方式,我想,是最好的策略了。当然,使用线性预测的算法将全再后面的帖子中详细阐述。
欢迎关注本次系列帖子。