我们有一个粒子探测器硬连线使用16位和8位缓冲。每隔一段时间,都会有一些预测的粒子通量峰值通过它,这是可以的。不好的是,这些通量通常会超过缓冲器存储它们的能力;因此,会发生溢出。在图表上,它们看起来像通量突然下降,并开始再次增长。您能提出一种最准确的方法来检测数据溢出点吗?
探测器在物理上是无法访问的,因此通过替换缓冲器来“正确地”修复它似乎不是一个选择。
更新:根据请求一些澄清。我们在数据处理设备上使用python;检测器本身使用的技术非常晦涩(就像它是由一个完全不相关的第三方开发的),但是它绝对是简单的,即没有运行一个“真正的”OS,只是一些低级的东西来记录检测器的读数和响应远程命令,比如电源循环。内存损坏和其他问题现在不是一个问题。溢出发生的原因很简单,因为探测器的设计者使用16位缓冲来计算粒子通量,有时流量超过每秒65535粒子。
更新2:正如一些读者所指出的那样,预期的解决方案将与分析通量剖面来检测急剧下降(例如,一个数量级)有关,以试图将它们与正常波动分开。另一个问题是:恢复(原始流量下降到溢出水平以下的点)可以通过简单地运行校正程序来检测反流(x轴)通量剖面吗?
发布于 2009-05-29 13:33:10
int32[] unwrap(int16[] x)
{
// this is pseudocode
int32[] y = new int32[x.length];
y[0] = x[0];
for (i = 1:x.length-1)
{
y[i] = y[i-1] + sign_extend(x[i]-x[i-1]);
// works fine as long as the "real" value of x[i] and x[i-1]
// differ by less than 1/2 of the span of allowable values
// of x's storage type (=32768 in the case of int16)
// Otherwise there is ambiguity.
}
return y;
}
int32 sign_extend(int16 x)
{
return (int32)x; // works properly in Java and in most C compilers
}
// exercise for the reader to write similar code to unwrap 8-bit arrays
// to a 16-bit or 32-bit array发布于 2009-05-29 04:47:27
当然,理想的情况是,您可以将检测软件的最大值设置为65535,以防止造成您悲痛的那种绕线。我知道这并不总是可能的,或者至少不总是有可能迅速完成的。
当粒子通量超过65535时,是这样快,还是通量逐渐增大,然后逐渐减小?这对您可能用来检测这一点的算法产生了影响。例如,如果通量上升得足够慢:
true flux measurement
5000 5000
10000 10000
30000 30000
50000 50000
70000 4465
90000 24465
60000 60000
30000 30000
10000 10000那么,当你溢出的时候,你会有一个很大的负值下降。负下降幅度比其他任何时候都大得多。这可以作为一个信号,你已经溢出。若要查找溢出时间周期的结束,可以查找从65535到不太远的值的大幅跳转。
所有这一切都取决于最大的真实通量是可能的,并取决于流量上升和下降的速度。例如,是否有可能在一个测量周期内得到超过128 k的计数?一个测量值可以是5000个,下一个测量值是50000吗?如果数据表现得不够好,你可能只能在统计上判断你什么时候溢水了。
发布于 2009-05-29 04:21:56
您的问题需要提供更多关于您的实现的信息--您使用的是什么语言/框架?
软件中的数据溢出(我认为这就是您所说的)是错误的做法,应该避免。当您看到(奇怪的数据输出)只是一个副作用时,可能发生的数据溢出,但它只是冰山一角,您可以看到的各种问题。
您可以很容易地体验到更严重的问题,如内存损坏,这会导致程序大声崩溃,或者更糟糕的是,不为人所知。
首先,是否可以进行任何验证,以防止溢出?
https://stackoverflow.com/questions/924355
复制相似问题