打印

两个滤波函数为什么对内码的利用率不一样?

[复制链接]
1422|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
victor3l|  楼主 | 2012-7-12 17:23 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
同样是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个函数的区别,或者这是什么原因造成这种情况?谢谢

相关帖子

沙发
chenbb8| | 2012-7-12 23:06 | 只看该作者
马上要睡觉了,思维比较迟钝,而且LZ还不给分~~~
所以就帮你看了第一个短点的函数
一看就发现了在循环里 数组溢出了
ulong  FilChOne()
{
uchar i;
static xdata  ulong datBuf[8] = {0};//这里的static很关键,没有他就不能累加,因为每次进来数据都要初始化一次原来的数据就丢失了。相反的原因是不能用这个函数处理多路Ad的数据,因为当处理第二路是这个数组中有第一路的数据,股受到干扰。
xdata ulong   avrVal = 0;
for(i = 0; i < 7; i++)
{
  datBuf = datBuf[i+1];//上面吧数组初始化成0很关键,否则数组初始值是随机的,故刚开始加的时候的值不确定,对总重求和造成影响
  avrVal += datBuf[i];
}
datBuf[7] = RdChOne();
avrVal += datBuf[7];
avrVal = (avrVal >> 3);//这里是求平均值
return avrVal;  
}

第一种方法没用到队列,导致效率比较低,不推荐使用,第二种方法我没看~睡觉去

使用特权

评论回复
板凳
sneec| | 2012-7-12 23:46 | 只看该作者
循环里并没有溢出.
第一个函数,首先更新datBuf[7],然后使datBuf[0] = datBuf[1] ,datBuf[1] = datBuf[2],datBuf[2] = datBuf[3],datBuf[3] = datBuf[4],datBuf[4] = datBuf[5],datBuf[5] = datBuf[6],datBuf[6] = datBuf[7],无论什么时候,数组里面datBuf[6]、datBuf[7]是一样的;而第二个函数,每次只更新数组的一个值,再求平均。不知道是不是这个不同导致2个函数结果不一样。

使用特权

评论回复
地板
sneec| | 2012-7-12 23:47 | 只看该作者
datBuf = datBuf[i+1];这里确实溢出了.大眼了

使用特权

评论回复
5
victor3l|  楼主 | 2012-7-13 09:02 | 只看该作者
2# chenbb8
谢谢您

使用特权

评论回复
6
victor3l|  楼主 | 2012-7-13 09:02 | 只看该作者
3# sneec
谢谢您

使用特权

评论回复
7
nevermore008| | 2012-7-13 13:17 | 只看该作者
第一个数组溢出了

使用特权

评论回复
8
chenbb8| | 2012-7-13 13:46 | 只看该作者
4# sneec 编辑帖子的时候发现chrome的高级回复出现问题,因此复制到IE里编辑 导致几个[]被丢失,补回了一个,昨晚发完帖子的时候也发现了这地方又少了一个,不过想下,如果LZ连这点小错误,都纠正不了的话,也太那啥了,因此就没动

使用特权

评论回复
9
chenbb8| | 2012-7-13 14:01 | 只看该作者
5# victor3l 百度下 环形队列 就知道了,感觉和你的第二个例子的差不多
因为你的例子里队列只需要写入,不需要先进先出这个功能,因此数据长度和头指针都不需要,只需要一个尾指针 供写入就好了

使用特权

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

本版积分规则

77

主题

308

帖子

5

粉丝