本帖最后由 victor3l 于 2012-7-13 11:26 编辑
我根据匠人的流程图写了一阶滤波的动态调整系数的程序如下:
uchar AdjFac()//调整参数
{
bit directFlag = 0;//数据变化的方向
uchar filCount = 0;//滤波计数器
uchar coef = 0;//最终的滤波系数
xdata ulong temp = 0;//这个最为采样一次新数据的暂存值
temp = FilChOne();
if(temp >= oldDat)//程序进来了
{
temp = FilChOne();
if(temp > oldDat)
{
directFlag = 1;
}
else
{
directFlag = 0;
}
}
else if(temp < oldDat)
{
temp = FilChOne();
if(temp < oldDat)
{
directFlag = 1;
}
else
{
directFlag = 0;
}
}
//上面部分判断的是增长方向
if( directFlag)//增长方向一致 经过验证程序进来了
{
filCount += 1;//滤波计数器增1
if(((temp-oldDat) > 10) ||((oldDat-temp) > 10) )//变化量大于阀值
{
filCount += 2; //程序进来了
}
if(filCount > 10)//滤波计数器的最大值时10 //经过验证程序没有走进来 说明计算值没有大于10
{
filCount = 0;speak = ~speak;
coef += 20;
if(coef > 255)
coef = 255;
}
}
else
{
coef = 0;
filCount = 0;
}
return coef;//返回系数
}
我的一阶滤波写成这样
ulong FriFilOne()
{
xdata ulong newDat = 0;
xdata ulong finDat = 0;
uchar num = 0;
newDat = FilChOne();
num = AdjFac();
finDat = (255-num)*newDat + num*oldDat;
return (finDat >> 8);
}
这里的oldData是全局变量,刚开始复制为0,调用滤波后我把ulong FriFilOne()
的值赋给oldData。我发现我的系数始终都是0,根本没起到调整系数的目的,不知道问题出在那里?
另外的问题是: 当一阶滤波计数器并没有达到最大时,这个系数该时多少啊,不会是0吧,匠人的流程图中并没有体现出来,麻烦匠人或者做过这个的大侠指点一下谢谢。急用 |