8次滑动滤波如下:
ulong FilChOne()
{
uchar i;
static xdata ulong datBuf[8] = {0};
xdata ulong avrVal = 0;
datBuf[7] = RdChOne();
for(i = 0; i < 7; i++)//这里的循环控制变量不能是8,是8 的话就越界了。要注意。
{
datBuf[i] = datBuf[i+1];//上面吧数组初始化成0很关键,否则数组初始值是随机的,故刚开始加的时候的值不确定,对总重求和造成影响
avrVal += datBuf[i];
}
avrVal += datBuf[7];//上面循环中少加了最后一个
avrVal = (avrVal >> 3);//这里是求平均值
return avrVal;
}
一阶滤波如下
ulong FriFilOne()
{
xdata ulong newDat = 0;
xdata ulong finDat = 0;
newDat = FilChOne();
finDat = (255-FACTOR)*newDat + FACTOR*oldDat;
return (finDat >> 8);
}
这里面的FACTOR是滤波系数。
问题是:为什么滤波系数不同导致最后的结果相差很大,并且当系数越大输出越小。当系数为20时输出1240左右,当把系数改成100时,输出仅有800了,这是为什么啊?通过8次滑动滤波和一阶滤波后数据还是本鞥很好的稳定,读到的AD内码值大概跳动8左右,别人的程序能够固定到跳动在3以内,还有什么办法使数据更稳定了? |