同样是8次滑动滤波,下面两个函数究竟差别在哪里?
ulong FilChOne()
{
uchar i;
static xdata ulong datBuf[8] = {0};//这里的static很关键,没有他就不能累加,因为每次进来数据都要初始化一次原来的数据就丢失了。相反的原因是不能用这个函数处理多路Ad的数据,因为当处理第二路是这个数组中有第一路的数据,股受到干扰。
xdata ulong avrVal = 0;
datBuf[7] = RdChOne();
for(i = 0; i < 8; i++)
{
datBuf[i] = datBuf[i+1];//上面吧数组初始化成0很关键,否则数组初始值是随机的,故刚开始加的时候的值不确定,对总重求和造成影响
avrVal += datBuf[i];
}
avrVal = (avrVal >> 3);//这里是求平均值
return avrVal;
}
这个滤波后得到数据较小。在一定的输入情况下,输出1140左右。
ulong FilterDatChOne()
{
uchar i;
static xdata ulong datBuf[8] = {0};
static uchar datCount = 0;
xdata ulong sum = 0;
datBuf[datCount] = RdChOne();
for(i = 0; i< 8; i++)
sum += datBuf[i];
sum = (ulong)(sum >> 3);//求均值
datCount++;
if(datCount == 8)
datCount = 0;
return sum;
}
这个函数得到的滤波值是1300左右,都是同样的输入情况下。实测情况下这个跟符合些。
求大侠指点一下这2个函数的区别,或者这是什么原因造成这种情况?谢谢 |