数据处理时边界超出范围引起的问题

实际的问题很简单,要计算n个数据的前后两个数据的波动情况,因为n个数据的前后波动实际只有n-1个,所以在给函数传入参数时没有注意到这一点,因此函数计算时使用一个无效数据,计算了n次差值,但是第n+1个数据是无效的,是的结果偏离真实结果。但是这一错误非常隐蔽,在传感器检测的两次事件是明显分离的时候,计算结果并没有错误(因为此时无效数据和真实数据很接近),但是当两次事件相隔非常近时,就会导致检测结果错误。

看看代码:

<code lang=”C”>/******************************************************************************
*Function : get_axis_exprid_chg_avg
*CreatDate: 2012-04-13 星期五 15:52:44
*Author : 
*
*Descrip : 计算分轴的前后波动的平均值,即 |dx2-dx1|+|dy2-dy1|+|dz2-dz1|
*Input :
*Output :
*
*Note :
******************************************************************************/
u16 get_axis_separ_chg_avg(u8 AvgNum)
{
u8 i =0;
u8 j =0;
u8 Ptr = 0; //读数据指针
u8 PtrNew = 0;
int Temp = 0;
u16 TempTotal = 0;

Ptr = RPtr;
for (i=0;i<AvgNum;i++)
{
PtrNew = Ptr+ 1;
if (PtrNew >= RING_BUF_SIZE) PtrNew = 0;
for (j=0;j<3;j++)
{
Temp = RingBuf[PtrNew][j] – RingBuf[Ptr][j];
if (Temp < 0) Temp *= -1;
TempTotal += Temp;
}
if (++Ptr >= RING_BUF_SIZE) Ptr = 0;
}
TempTotal /= AvgNum;

return TempTotal;
}
</code>
该函数的作用是计算一段时间内传感器采集的数据(3轴)波动情况,即 
(|dx2-dx1|+|dy2-dy1|+|dz2-dz1| + …… +  |dxn-dxn-1|+|dyn-dyn-1|+|dzn-dzn-1| )/(n-1)
该函数的问题在于,拿n个数据进行计算,计算了n次,实际应该计算n-1次,在计算第n次时使用第n+1组数据,而这个数据并不是有效的。如果第(n+1)个数据与前面的n个数据比较接近,则计算结果与真实情况比较接近,不容易看出错误。
在实际情况中,RingBuff是一个25*3的二维数组,作为环形缓冲区使用,如果两辆车通过的间隔时间比较长,则经过一定次数后整个环形缓冲区的数据基本稳定,所以函数的结果与真实情况没有差别。但是当两辆车紧跟通过时,第(n+1)个数据和前n个数据可能差别很大,导致判断错误。
如果只看最后的输出结果,是很难发现这种错误的。因为当特殊事件发生时,我们没办法确定是算法逻辑的问题还是具体实现函数的问题。所以模块测试很重要。

分享到: 更多
版权申明:

本站保留所有原创文章的版权,本站地址:奔跑的博客[http://www.elecbench.com]

原创文章转载时请注明出处,并添加文章所在页面的链接:http://www.elecbench.com/%e6%95%b0%e6%8d%ae%e5%a4%84%e7%90%86%e6%97%b6%e8%be%b9%e7%95%8c%e8%b6%85%e5%87%ba%e8%8c%83%e5%9b%b4%e5%bc%95%e8%b5%b7%e7%9a%84%e9%97%ae%e9%a2%98/

本站所有 2010年3月4日 以后发表、未标明为“转载”的文章均是本站原创。

发表评论


(设置自己的个性头像)

*

申请属于你的免费顶级域名