Frage

Wir haben einen Teilchendetektor festverdrahtet 16-Bit- und 8-Bit-Puffer zu verwenden. Hin und wieder gibt es bestimmt [vorhergesagt] Spitzen der Partikelflüsse durchqueren; das ist okay. Was ist nicht in Ordnung ist, dass diese Flüsse in der Regel Größen über die Kapazität der Puffer erreichen sie zu speichern; so sprudeln auftreten. Auf einem Chart sehen sie aus wie der Fluss plötzlich abfällt und beginnt wieder zu wachsen. Können Sie ein [meist] genauen Verfahren zum Nachweis von Datenpunkten schlagen von einem Überlauf leiden?

P. S. Der Detektor ist physisch nicht zugänglich, so dass es der ‚richtige Weg‘ Fixierung durch die Puffer zu ersetzen scheint nicht eine Option zu sein.

Update: Einige Präzisierungen wie gewünscht. Wir verwenden Python in der Datenverarbeitungseinrichtung; die Technologie in dem Detektor verwendete selbst ist ziemlich dunkel (es behandeln, als ob sie von einem völlig anderen Dritten entwickelt wurden), aber es ist auf jeden Fall ungekünstelt, also nicht ein ‚echtes‘ O ausgeführt wird, nur einig Low-Level-Zeug auf dem Rekord Detektorablesungen und Remote-Befehle wie Leistungszyklus zu reagieren. Speicherfehler und andere Probleme sind kein Problem jetzt. Die Überläufe auftreten, einfach deshalb, weil der Designer des Detektors 16-Bit-Puffer zum Zählen des Teilchenfluss verwendet, und manchmal der Fluß übersteigt 65535 Partikel pro Sekunde.

Update 2: Wie mehrere Leser haben darauf hingewiesen, würde die beabsichtigte Lösung etwas mit der Analyse des Flussprofils zu tun haben zu starken Rückgängen zu erkennen (zB durch eine Größenordnung) in einem Versuch zu trennen sie von normalen Schwankungen. Ein weiteres Problem entsteht: kann Restaurationen (Punkte, an denen der ursprünglichen Fluss unter dem überquellenden Pegel fällt) einfach erkannt werden, indem das Korrekturprogramm gegen die zurückgekehrt läuft (durch das x Achse) Flussprofil

War es hilfreich?

Lösung

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

Andere Tipps

Natürlich, im Idealfall würden Sie die Detektor-Software max fix bei 65.535 aus Wraparound der Art zu verhindern, dass Ihr Schmerz verursacht. Ich verstehe, dass dies nicht immer möglich ist, oder zumindest ist nicht immer möglich, schnell zu tun.

Wenn der Teilchenstrom 65535 übersteigt, macht es so schnell, oder hat der Fluss allmählich erhöhen und dann allmählich ab? Dies macht einen Unterschied, in welcher Algorithmus Sie könnte dies zu erkennen, verwenden. Zum Beispiel, wenn der Fluss steigt langsam genug:

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

dann werden Sie neigen dazu, einen haben, groß negativ Tropfen zu Zeiten, wenn Sie überschwemmt haben. Ein viel größerer negativer Tropfen, als Sie zu jeder anderen Zeit. Dies kann als Signal dienen, die Sie überschwemmt haben. Um das Ende des Überlaufzeitperiode finden Sie für einen großen Sprung auf einen Wert nicht zu weit von 65535 aussehen könnten.

All dies hängt von dem maximalen wahren Fluss, der möglich ist und wie schnell der Fluss steigt und fällt. Zum Beispiel ist es möglich, mehr als 128k zählt in einer Messperiode zu bekommen? Ist es möglich, für eine Messung 5000 und die nächste Messung zu 50000 sein? Wenn die Daten nicht ausreichend gut erzogene, können Sie in der Lage sein, nur statistisches Urteil darüber zu treffen, wenn Sie überschwemmt haben.

Ihre Frage braucht mehr Informationen über Ihre Implementierung zur Verfügung zu stellen - welche Sprache / Framework verwenden Sie

Datenüberlauf in der Software (das ist, was ich glaube, Sie sprechen) ist schlechte Praxis und soll vermieden werden. Während Sie sehen (seltsame Datenausgabe) ist nur ein Nebeneffekt, das möglich ist, wenn der Datenüberlauf auftreten, aber es ist nur die Spitze des Eisbergs der Art von Fragen können Sie sehen.

Sie können ganz einfach ernstere Probleme wie Speicherfehler auftreten, die Programme laut zum Absturz bringen kann, oder schlimmer noch, obscurely .

Gibt es eine Validierung Sie tun können, um die Überläufe zu verhindern, dass an erster Stelle auftreten?

Ich glaube wirklich nicht, können Sie es ohne Fixierung der zugrunde liegenden Puffer beheben können. Wie soll man den Unterschied zwischen den Sequenzen von Werten sagen, (0, 1, 2, 1, 0) und (0, 1, 65538, 1, 0)? Sie können nicht.

Wie wäre es mit einem HMM, wo der versteckte Zustand ist, ob Sie in einem Überlauf und die Emissionen sind Partikelfluss beobachtet?

Der schwierige Teil für die Übergänge mit den Wahrscheinlichkeitsmodellen kommen würde (die im Grunde die Zeit-Skala von Spitzen codieren) und für die Emissionen (die Sie bauen können, wenn Sie wissen, wie der Fluss verhält und wie Überlauf wirkt Messung ). Dies sind domänenspezifische Fragen, so gibt es wahrscheinlich keine vorgefertigten Lösungen gibt.

Aber man Sie das Modell haben, alles andere --- passend Ihre Daten, Quantifizieren Unsicherheit, Simulation, etc .--- ist Routine.

Sie können dies nur tun, wenn die tatsächlichen Sprünge zwischen aufeinander folgenden Werten sind viel kleiner als 65536. Ansonsten ein Überlauf-induziertes Tal Artefakt von einem echten Tal nicht zu unterscheiden ist, kann man nur vermuten. Sie können versuchen, Überläufe zu entsprechenden Restaurationen passen, indem gleichzeitig ein Signal von der rechten und der linken Analyse (unter der Annahme, dass es eine erkennbare Grundlinie).

Anders als das alles, was Sie tun können, ist Ihr Experiment anzupassen, indem sie mit unterschiedlichen ursprünglichen Partikelströme zu wiederholen, so dass echte Täler wird sich nicht bewegen, aber Artefakt diejenigen auf den Punkt der Überlauf bewegen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top