检测并修复溢出

时间:2009-05-29 04:13:49

标签: math overflow data-analysis

我们有一个硬连线的粒子探测器,可以使用16位和8位缓冲区。时不时地,有一些[预测的]粒子通量峰值通过它;没关系。什么是好的是,这些通量通常达到高于缓冲容量的量值来存储它们;因此,溢出发生。在图表上,它们看起来像通量突然下降并开始再次增长。你能提出一种[大多数]准确的方法来检测遭受溢出的数据点吗?

P.S。检测器在物理上是不可访问的,因此通过更换缓冲区以“正确的方式”修复它似乎不是一种选择。

更新:根据要求做出一些澄清。我们在数据处理设施中使用python;探测器本身使用的技术非常模糊(将其视为由完全无关的第三方开发),但它绝对不简单,即没有运行“真正的”操作系统,只是一些低级别的东西来记录检测器读数并响应电源循环等远程命令。内存损坏和其他问题现在不是问题。溢出的发生仅仅是因为探测器的设计者使用16位缓冲器来计算粒子通量,有时通量超过每秒65535个粒子。

更新2:正如一些读者指出的那样,预期的解决方案将与分析通量曲线以检测急剧下降(例如一个数量级)以试图分离它们来自正常的波动。另一个问题出现了:可以通过简单地针对恢复的(通过 x 轴)通量曲线运行校正程序来检测修复体(原始通量下降到溢出水平以下的点)吗?

6 个答案:

答案 0 :(得分:1)

当然,理想情况下,您需要将探测器软件修复至最大值65535,以防止导致您悲伤的那种情况。我知道这并不总是可行的,或者至少不可能总是快速做到。

当粒子通量超过65535时,它是否快速完成,或者助焊剂是否逐渐增加然后逐渐减少?这会对您可能用于检测此问题的算法产生影响。例如,如果通量足够缓慢上升:

true flux     measurement  
 5000           5000
10000          10000
30000          30000
50000          50000
70000           4465
90000          24465
60000          60000
30000          30000
10000          10000

然后,当你有溢出时,你往往会有一个负的下降。比你在任何时候都要大得多的负面下降。这可以作为你已经溢出的信号。要查找溢出时间段的结束,您可以查找到距离65535不太远的值的大跳转。

所有这些都取决于可能的最大真实通量以及通量上升和下降的速度。例如,在一个测量周期内是否可以获得超过128k的计数?一次测量可能是5000而下一次测量是50000吗?如果数据表现不够好,您可能只能对溢出的时间进行统计判断。

答案 1 :(得分:1)

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

答案 2 :(得分:0)

您的问题需要提供有关您的实施的更多信息 - 您使用的是哪种语言/框架?

软件中的数据溢出(我认为你正在谈论的)是不好的做法,应该避免。虽然您看到(奇怪的数据输出)只是在遇到数据溢出时可能产生的一种副作用,但它只是您可以看到的各种问题的冰山一角。

您可以轻松地遇到更严重的问题,例如内存损坏,这可能导致程序大声崩溃,或者更糟糕的是,模糊

您是否可以进行任何验证以防止首先发生溢出?

答案 3 :(得分:0)

我真的不认为你可以修复它而不修复底层缓冲区。你如何区分值序列(0,1,2,1,0)和(0,1,65538,1,0)之间的区别?你不能。

答案 4 :(得分:0)

使用隐藏状态的HMM如何处于溢出状态并且排放是否被观察到粒子通量?

棘手的部分将提出转换的概率模型(基本上将编码峰的时间尺度)和排放(如果您知道通量如何表现以及溢出如何影响测量,您可以构建)。这些是针对特定领域的问题,因此可能没有现成的解决方案。

但你有一个模型,其他一切 - 适合你的数据,量化不确定性,模拟等 - 是常规的。

答案 5 :(得分:0)

如果连续值之间的实际跳跃远小于65536,则只能执行此操作。否则,溢出引起的波谷伪影与实际波谷无法区分,您只能猜测。通过同时分析来自右侧和左侧的信号(假设存在可识别的基线),您可以尝试将溢出匹配到相应的修复体。

除此之外,你所能做的只是通过用不同的原始粒子流重复它来调整你的实验,这样真正的山谷就不会移动,但是神器会移动到溢出点。