Frage

Wir verwenden eine Datenerfassungskarte, um Messwerte von einem Gerät zu erfassen, dessen Signal auf einen Spitzenwert ansteigt und dann auf nahezu den ursprünglichen Wert zurückfällt.Um den Spitzenwert zu finden, durchsuchen wir derzeit das Array nach dem höchsten Messwert und verwenden den Index, um den Zeitpunkt des Spitzenwerts zu bestimmen, der in unseren Berechnungen verwendet wird.

Dies funktioniert gut, wenn der höchste Wert der gesuchte Spitzenwert ist. Wenn das Gerät jedoch nicht richtig funktioniert, können wir einen zweiten Spitzenwert sehen, der höher als der ursprüngliche Spitzenwert sein kann.Wir führen über einen Zeitraum von 90 Sekunden 10 Messwerte pro Sekunde von 16 Geräten durch.

Mein erster Gedanke ist, die Messwerte durchzugehen und zu prüfen, ob der vorherige und der nächste Punkt unter dem aktuellen Wert liegen, um einen Peak zu finden und eine Reihe von Peaks zu erstellen.Vielleicht sollten wir den Durchschnitt mehrerer Punkte auf beiden Seiten der aktuellen Position betrachten, um Störungen im System zu berücksichtigen.Ist dies die beste Vorgehensweise oder gibt es bessere Techniken?


Wir verwenden LabVIEW und ich habe das überprüft LAVA-Foren und es gibt eine Reihe interessanter Beispiele.Dies ist Teil unserer Testsoftware und wir versuchen zu vermeiden, zu viele nicht standardmäßige VI-Bibliotheken zu verwenden, daher hoffte ich auf Feedback zu den beteiligten Prozessen/Algorithmen und nicht zu spezifischem Code.

War es hilfreich?

Lösung

Sie könnten es mit der Signalmittelung versuchen, d. h.Ermitteln Sie für jeden Punkt den Mittelwert mit den umliegenden drei oder mehr Punkten.Wenn die Störgeräusche sehr groß sind, kann es sein, dass selbst das nicht hilft.

Mir ist klar, dass dies sprachunabhängig war, aber wenn Sie davon ausgehen, dass Sie LabView verwenden, gibt es in LabView viele vorgefertigte Signalverarbeitungs-VIs, mit denen Sie Glättung und Rauschunterdrückung durchführen können.Der NI-Foren sind ein großartiger Ort, um speziellere Hilfe zu solchen Dingen zu erhalten.

Andere Tipps

Es gibt viele, viele klassische Methoden zur Peakerkennung, von denen jede funktionieren könnte.Sie müssen sehen, was insbesondere die Qualität Ihrer Daten einschränkt.Hier sind grundlegende Beschreibungen:

  1. Zwischen zwei beliebigen Punkten in Ihren Daten, (x(0), y(0)) Und (x(n), y(n)), addieren y(i + 1) - y(i) für 0 <= i < n und nenne das T („Reise“) und eingestellt R ("steigen auf y(n) - y(0) + k für entsprechend klein k. T/R > 1 zeigt einen Höhepunkt an.Dies funktioniert gut, wenn ein großer Weg aufgrund von Geräuschen unwahrscheinlich ist oder wenn sich Geräusche symmetrisch um eine Basiskurvenform verteilen.Akzeptieren Sie für Ihre Anwendung den frühesten Peak mit einem Wert über einem bestimmten Schwellenwert oder analysieren Sie die Kurve der Werte für Weg pro Anstieg, um interessantere Eigenschaften zu finden.

  2. Verwenden Sie angepasste Filter, um die Ähnlichkeit mit einer Standard-Peakform zu bewerten (im Wesentlichen verwenden Sie ein normalisiertes Skalarprodukt gegen eine Form, um eine Kosinusmetrik der Ähnlichkeit zu erhalten).

  3. Entfalten Sie anhand einer Standard-Peakform und prüfen Sie, ob hohe Werte vorliegen (obwohl ich häufig finde, dass 2 bei einfacher Instrumentenausgabe weniger rauschempfindlich ist).

  4. Glätten Sie die Daten und prüfen Sie, ob Tripletts gleichmäßig verteilter Punkte vorhanden sind x0 < x1 < x2, y1 > 0.5 * (y0 + y2), oder überprüfen Sie die euklidischen Abstände wie folgt: D((x0, y0), (x1, y1)) + D((x1, y1), (x2, y2)) > D((x0, y0),(x2, y2)), die auf der Dreiecksungleichung beruht.Durch die Verwendung einfacher Verhältnisse erhalten Sie wiederum einen Bewertungsmechanismus.

  5. Passen Sie ein sehr einfaches 2-Gaußsches Mischungsmodell an Ihre Daten an (Numerical Recipes verfügt beispielsweise über einen schönen vorgefertigten Codeblock).Nehmen Sie den früheren Gipfel.Dadurch werden überlappende Spitzen korrekt behandelt.

  6. Finden Sie die beste Übereinstimmung der Daten mit einer einfachen Gauß-, Cauchy-, Poisson- oder What-have-you-Kurve.Werten Sie diese Kurve über einen weiten Bereich aus und subtrahieren Sie sie von einer Kopie der Daten, nachdem Sie die Spitzenposition notiert haben.Wiederholen.Nehmen Sie den frühesten Peak, dessen Modellparameter (wahrscheinlich Standardabweichung, aber einige Anwendungen berücksichtigen möglicherweise Kurtosis oder andere Merkmale) ein Kriterium erfüllen.Achten Sie auf Artefakte, die zurückbleiben, wenn Spitzenwerte von den Daten subtrahiert werden.Die beste Übereinstimmung kann anhand der in Nr. 2 oben vorgeschlagenen Art der Übereinstimmungsbewertung ermittelt werden.

Ich habe das, was Sie tun, schon einmal gemacht:Finden von Peaks in DNA-Sequenzdaten, Finden von Peaks in aus gemessenen Kurven geschätzten Ableitungen und Finden von Peaks in Histogrammen.

Ich ermutige Sie, sorgfältig auf die richtige Grundlinie zu achten.Die Wiener-Filterung oder andere Filterung oder einfache Histogrammanalyse ist oft eine einfache Möglichkeit, bei Vorhandensein von Rauschen eine Basislinie zu ermitteln.

Wenn Ihre Daten typischerweise verrauscht sind und Sie die Daten von der Karte als nicht referenzierte Single-Ended-Ausgabe (oder sogar referenziert, nur nicht differenziell) erhalten und wenn Sie viele Beobachtungen in jedem Datenpunkt mitteln, versuchen Sie, diese zu sortieren Beobachtungen und das Wegwerfen des ersten und letzten Quartils und die Mittelung des verbleibenden Quartils.Es gibt eine Vielzahl solcher Taktiken zur Eliminierung von Ausreißern, die wirklich nützlich sein können.

Dieses Problem wurde eingehend untersucht.

Es gibt eine Reihe sehr aktueller Implementierungen im TSpectrum* Klassen von WURZEL (ein Werkzeug zur Analyse der Kern-/Teilchenphysik).Der Code funktioniert in ein- bis dreidimensionalen Daten.

Der ROOT-Quellcode ist verfügbar, sodass Sie diese Implementierung bei Bedarf herunterladen können.

Von dem TSpektrum Klassendokumentation:

Die in dieser Klasse verwendeten Algorithmen wurden in den folgenden Referenzen veröffentlicht:

[1] M. Morhac et al.:Hintergrundeliminierungsmethoden für mehrdimensionale Zufalls-Gammastray-Spektren.Kerninstrumente und -methoden in der Physikforschung A 401 (1997) 113-132.

[2] M. Morhac et al.:Effiziente ein- und zweidimensionale Gold-Entfaltung und ihre Anwendung auf die Zersetzung von Gammastrahlenspektren.Kerninstrumente und -methoden in der Physikforschung A 401 (1997) 385-408.

[3] M. Morhac et al.:Identifizierung von Peaks bei mehrdimensionalem Zufalls-Gammastrahlenspektren.Kerninstrumente und Methoden in der Forschung Physik A 443 (2000), 108-125.

Für diejenigen unter Ihnen, die kein NIM-Online-Abonnement haben, sind die Unterlagen in der Kursdokumentation verlinkt.


Die Kurzfassung dessen, was getan wird, besteht darin, dass das Histogramm abgeflacht wird, um Rauschen zu eliminieren, und dann mit roher Gewalt lokale Maxima im abgeflachten Histogramm erkannt werden.

Ich möchte zu diesem Thread einen Algorithmus beitragen, der Ich habe mich weiterentwickelt:

Es basiert auf dem Prinzip Streuung:Wenn ein neuer Datenpunkt eine gegebene x-Anzahl von Standardabweichungen von einem gleitenden Mittelwert entfernt ist, signalisiert der Algorithmus (auch „ Z-Score).Der Algorithmus ist sehr robust, da er a konstruiert separate gleitender Mittelwert und Abweichung, sodass die Signale den Schwellenwert nicht verfälschen.Zukünftige Signale werden daher unabhängig von der Menge der vorherigen Signale mit annähernd gleicher Genauigkeit identifiziert.Der Algorithmus benötigt drei Eingaben: lag = the lag of the moving window, threshold = the z-score at which the algorithm signals Und influence = the influence (between 0 and 1) of new signals on the mean and standard deviation.Zum Beispiel ein lag von 5 verwendet die letzten 5 Beobachtungen, um die Daten zu glätten.A threshold Ein Wert von 3,5 gibt an, ob ein Datenpunkt 3,5 Standardabweichungen vom gleitenden Mittelwert entfernt ist.Und ein influence von 0,5 gibt Signale Hälfte des Einflusses, den normale Datenpunkte haben.Ebenso ein influence von 0 ignoriert Signale vollständig für die Neuberechnung des neuen Schwellenwerts:Ein Einfluss von 0 ist daher die robusteste Option.

Es funktioniert wie folgt:

Pseudocode

# Let y be a vector of timeseries data of at least length lag+2
# Let mean() be a function that calculates the mean
# Let std() be a function that calculates the standard deviaton
# Let absolute() be the absolute value function

# Settings (the ones below are examples: choose what is best for your data)
set lag to 5;          # lag 5 for the smoothing functions
set threshold to 3.5;  # 3.5 standard deviations for signal
set influence to 0.5;  # between 0 and 1, where 1 is normal influence, 0.5 is half

# Initialise variables
set signals to vector 0,...,0 of length of y;   # Initialise signal results
set filteredY to y(1,...,lag)                   # Initialise filtered series
set avgFilter to null;                          # Initialise average filter
set stdFilter to null;                          # Initialise std. filter
set avgFilter(lag) to mean(y(1,...,lag));       # Initialise first value
set stdFilter(lag) to std(y(1,...,lag));        # Initialise first value

for i=lag+1,...,t do
  if absolute(y(i) - avgFilter(i-1)) > threshold*stdFilter(i-1) then
    if y(i) > avgFilter(i-1)
      set signals(i) to +1;                     # Positive signal
    else
      set signals(i) to -1;                     # Negative signal
    end
    # Adjust the filters
    set filteredY(i) to influence*y(i) + (1-influence)*filteredY(i-1);
    set avgFilter(i) to mean(filteredY(i-lag,i),lag);
    set stdFilter(i) to std(filteredY(i-lag,i),lag);
  else
    set signals(i) to 0;                        # No signal
    # Adjust the filters
    set filteredY(i) to y(i);
    set avgFilter(i) to mean(filteredY(i-lag,i),lag);
    set stdFilter(i) to std(filteredY(i-lag,i),lag);
  end
end

Demo

Demonstration of robust thresholding algorithm

> Ursprüngliche Antwort

Diese Methode stammt im Wesentlichen aus David Marrs Buch „Vision“.

Gaußsche Unschärfe Ihres Signals mit der erwarteten Breite Ihrer Spitzen.Dadurch werden Rauschspitzen beseitigt und Ihre Phasendaten bleiben unbeschädigt.

Dann Kantenerkennung (LOG reicht aus)

Dann waren Ihre Kanten die Kanten von Merkmalen (wie Gipfeln).Suchen Sie zwischen den Kanten nach Spitzen, sortieren Sie die Spitzen nach Größe, und schon sind Sie fertig.

Ich habe Variationen davon verwendet und sie funktionieren sehr gut.

Ich denke, du willst kreuzkorrelieren Ihr Signal mit einem erwarteten, vorbildlichen Signal.Aber es ist so lange her, dass ich mich mit Signalverarbeitung beschäftigt habe, und selbst dann habe ich nicht viel davon beachtet.

Ich weiß nicht viel über Instrumentierung, daher ist das vielleicht völlig unpraktisch, aber andererseits könnte es eine hilfreiche andere Richtung sein.Wenn Sie wissen, wie die Messwerte fehlschlagen können, und es bei solchen Fehlern ein bestimmtes Intervall zwischen den Peaks gibt, warum führen Sie dann nicht in jedem Intervall einen Gradientenabstieg durch?Wenn der Abstieg Sie in ein zuvor abgesuchtes Gebiet zurückführt, können Sie ihn abbrechen.Abhängig von der Form der abgetasteten Oberfläche kann dies auch dazu beitragen, Peaks schneller zu finden als durch Suchen.

Gibt es einen qualitativen Unterschied zwischen dem gewünschten Peak und dem unerwünschten zweiten Peak?Wenn beide Spitzen „scharf“ sind, d. h.kurze Zeitdauer – wenn man das Signal im Frequenzbereich betrachtet (durch FFT), erhält man in den meisten Bändern Energie.Wenn der „gute“ Peak jedoch zuverlässig Energie bei Frequenzen aufweist, die im „schlechten“ Peak nicht vorhanden sind, oder umgekehrt, können Sie sie möglicherweise auf diese Weise automatisch unterscheiden.

Sie könnten etwas anwenden Standardabweichung Befolgen Sie Ihre Logik und achten Sie auf Spitzen über x %.

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