打印
[匠人手记]

一阶滤波的动态系数调整程序

[复制链接]
3226|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
victor3l|  楼主 | 2012-7-13 11:24 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 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吧,匠人的流程图中并没有体现出来,麻烦匠人或者做过这个的大侠指点一下谢谢。急用

相关帖子

沙发
vi51| | 2012-8-30 00:08 | 只看该作者
finDat = (255-num)*newDat + num*oldDat;
这一公式不对吧!应该是:
finDat = (255-num)*oldDat + num*newDat;

使用特权

评论回复
板凳
vi51| | 2012-8-30 20:12 | 只看该作者
我修改了一阶滤波的动态调整系数的程序如下:
uchar AdjFac()//调整参数
{
bit directFlag = 0;//数据变化的方向
uchar filCount = 0;//滤波计数器
uchar coef = 0;//最终的滤波系数
xdata ulong temp = 0;//这个最为采样一次新数据的暂存值
temp = FilChOne();
if(temp >= oldDat)//程序进来了
{
  oldDat=temp;
  temp = FilChOne();
  if(temp >= oldDat)
  {
   oldDat=temp;
   directFlag = 1;
  }
  else
  {
   oldDat=temp;
   directFlag = 0;
  }
}
else if(temp < oldDat)
{
  oldDat=temp;
  temp = FilChOne();
  if(temp < oldDat)
  {
   oldDat=temp;
   directFlag = 1;
  }
  else
  {
   oldDat=temp;
   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();
if(newDat<oldDat)
{
finDat=oldDat-newDat;
finDat=finDat*num;
finDat=finDat+128;
finDat>>=8;
finDat=oldDat-finDat;
}
else if(newDat>oldDat)
{
finDat=newDat-oldDat;
finDat=finDat*num;
finDat=finDat+128;
finDat>>=8;
finDat=oldDat+finDat;
}
else finDat=oldDat;
return (finDat );
}

这里的oldData是全局变量,刚开始复制为0,调用滤波后我把ulong FriFilOne()
的值赋给oldData。

使用特权

评论回复
地板
vi51| | 2012-8-31 16:53 | 只看该作者
做了个程序出来,我试过,有效果。
/************************************************************/
unsigned char Adjk()//调整参数
{
bit directFlag = 0;//数据变化的方向
unsigned char filCount = 0;//滤波计数器
unsigned char coef = 120;//最终的滤波系数
xdata unsigned long temp = 0;//这个最为采样一次新数据的暂存值
temp =LRAV();
if(temp >= oldValue)//程序进来了
{
  temp = LRAV();
  if(temp >=oldValue)
  {
    directFlag = 1;
  }
  else
  {
    directFlag = 0;
  }
}
else if(temp < oldValue)
{
   temp = LRAV();
  if(temp < oldValue)
  {
   directFlag = 1;
  }
  else
  {
   directFlag = 0;   
  }
}
//上面部分判断的是增长方向

if( directFlag)//增长方向一致   
{
  filCount += 1;//滤波计数器增1
  if(((temp-oldValue) > 10) ||((oldValue-temp) > 10) )//变化量大于阀值
  {
   filCount += 2;  
  }
  if(filCount >= 6)//滤波计数器的最大值时10  
  {
   filCount = 0;
   coef += 20;
   if(coef > 255)
    coef = 255;
  }
}
else
{
  coef = 120;
  filCount = 0;
}
return coef;//返回系数
}

/************************************************************/
unsigned long LRAV()
{
unsigned char i;
unsigned long Value;
unsigned long Sum;
Sum=0;
Data[c++]=count();
if(c==N)c=0;
for(i=0;i<N;i++)
{
Sum+=Data[i];
}
Value=Sum>>2;
return(Value);
}

/************************************************************/
unsigned long GAV()
{
unsigned char k;
unsigned long NewValue;
unsigned long ReturnValue;
NewValue=LRAV();
k=Adjk();
if(NewValue<oldValue)
{
ReturnValue=oldValue-NewValue;
ReturnValue=ReturnValue*k;
ReturnValue=ReturnValue+128;
ReturnValue>>=8;
ReturnValue=oldValue-ReturnValue;
oldValue=ReturnValue;
}
else if(NewValue>oldValue)
{
ReturnValue=NewValue-oldValue;
ReturnValue=ReturnValue*k;
ReturnValue=ReturnValue+128;
ReturnValue>>=8;
ReturnValue=oldValue+ReturnValue;
oldValue=ReturnValue;
}
else ReturnValue=oldValue;
return(ReturnValue);
}

使用特权

评论回复
5
yes慢的| | 2012-11-27 09:33 | 只看该作者
:loveliness:

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

77

主题

308

帖子

5

粉丝