Thursday 16 November 2017

Moving Average Peak Erkennung


Update: Der bisher beste Algorithmus ist dieser. Diese Frage untersucht robuste Algorithmen zur Erkennung plötzlicher Peaks in Echtzeit-Zeitreihen-Daten. Betrachten Sie den folgenden Datensatz: (Matlab-Format, aber es geht nicht um die Sprache, sondern um den Algorithmus) Sie können deutlich sehen, dass es drei große Gipfel und einige kleine Gipfel gibt. Dieser Dataset ist ein spezifisches Beispiel für die Klasse von Zeitreihe-Datasets, über die die Frage geht. Diese Klasse von Datensätzen hat zwei allgemeine Merkmale: Es gibt grundlegende Rauschen mit einem allgemeinen Mittel Es gibt große Spitzen oder höhere Datenpunkte, die deutlich von dem Rauschen abweichen. Wir können auch annehmen, dass die Breite der Peaks nicht vorher bestimmt werden kann, die Höhe der Peaks deutlich von den anderen Werten abweicht, die der verwendete Algorithmus in Echtzeit berechnen muss (so ändern sich mit jedem neuen Datenpunkt). Für eine solche Situation muss ein Grenzwert sein Die Signale auslöst. Der Grenzwert kann jedoch nicht statisch sein und muss in Echtzeit auf der Basis eines Algorithmus bestimmt werden. Meine Frage: was ist ein guter Algorithmus zur Berechnung solcher Schwellen in Echtzeit Gibt es spezielle Algorithmen für solche Situationen Was sind die bekanntesten Algorithmen Robust Algorithmen oder nützliche Einsichten sind alle sehr geschätzt. (Kann in einer beliebigen Sprache Antwort: seine über den Algorithmus) Ich habe dies zu tun, um eine abrupte Änderung der Lichtintensität auf einem Photosensor zu erkennen. Ich tat dies durch gleitende Durchschnitt, und ignorieren alle Datenpunkte, die größer als ein Schwellenwert ist. Es ist zu beachten, dass diese Schwelle sich von der einen Spitzenwert bestimmenden Schwelle unterscheidet. Also, sagen Sie nur Datenpunkte, die innerhalb eines stddev zu Ihrem gleitenden Durchschnitt ist, und betrachten diese Datenpunkte mit mehr als drei Stddev als Peaks. Dieser Algorithmus hat sehr gut für unseren Kontext der Anwendung dieser Zeit. Ndash justhalf Ah, ich verstehe. Ich erwartete es nicht in der Code-Form. Wenn ich diese Frage früher schon früher gesehen hätte, würdest du diese Antwort viel schneller bekommen. Jedenfalls war meine Anwendung damals, um festzustellen, ob der Photosensor von der Umgebungslichtquelle blockiert ist (deshalb benötigen wir den gleitenden Durchschnitt, da das Umgebungslicht Quelle kann allmählich im Laufe der Zeit ändern). Wir haben dies als ein Spiel, wo Sie Ihre Hand über die Sensoren nach bestimmten Muster schweben sollte erstellt. D ndash justhalf Smoothed z-Score algo (sehr robust Schwellenwert Algorithmus) Ich habe einen Algorithmus, der sehr gut funktioniert für diese Arten von Datensätzen konstruiert. Es beruht auf dem Prinzip der Dispersion. Wenn ein neuer Datenpunkt eine gegebene x-Zahl von Standardabweichungen von einem bewegten Mittelwert entfernt ist, die Algorithmussignale (auch als z-Wert bezeichnet). Der Algorithmus ist sehr robust, da er einen separaten Bewegungsmechanismus und eine Abweichung konstruiert, so dass Signale den Schwellenwert nicht verfälschen. Zukünftige Signale werden daher mit ungefähr der gleichen Genauigkeit identifiziert, ungeachtet der Menge der vorhergehenden Signale. Der Algorithmus nimmt 3 Eingänge: Lag die Verzögerung des sich bewegenden Fensters. Schwelle die z-Wertung, bei der der Algorithmus den Einfluss (zwischen 0 und 1) der neuen Signale auf den Mittelwert und die Standardabweichung signalisiert und beeinflusst. Zum Beispiel wird eine Verzögerung von 5 die letzten 5 Beobachtungen verwenden, um die Daten zu glätten. Eine Schwelle von 3,5 wird signalisieren, wenn ein Datenpunkt 3,5 Standardabweichungen von dem bewegten Mittelwert entfernt ist. Und ein Einfluss von 0,5 gibt Signale die Hälfte des Einflusses, dass normale Datenpunkte haben. Ebenso ignoriert ein Einfluss von 0 die Signale vollständig für die Neuberechnung der neuen Schwelle: Ein Einfluss von 0 ist daher die robusteste Option 1 am wenigsten. Es funktioniert wie folgt: Der Matlab-Code für diese Demo finden Sie am Ende dieser Antwort. Um das Demo zu verwenden, führen Sie es einfach aus und erstellen Sie eine Zeitreihe selbst, indem Sie auf das obere Diagramm klicken. Der Algorithmus beginnt nach der Verzögerung der Beobachtungen zu arbeiten. Anhang 1: Matlab - und R-Code für den Algorithmus Dieser Code (beide Sprachen) ergibt für die Daten der ursprünglichen Frage folgendes Ergebnis: Anhang 2: Matlab-Demonstrationscode (klicken, um Daten zu erzeugen) Der obige Code wurde so geschrieben Den Algorithmus neu berechnen. Natürlich könnte man auch leicht den Code so ändern, dass die gefiltertY. AvgFilter und stdFilter werden gespeichert, und die Werte werden einfach aktualisiert, wenn neue Informationen ankommen (dies macht auch den Algorithmus viel schneller). Für Demonstrationszwecke habe ich beschlossen, den gesamten Code in einer einzigen Funktion zusammenzustellen. Wenn Sie diese Funktion irgendwo, bitte geben Sie mir oder diese Antwort. Wenn Sie Fragen zu diesem Algorithmus haben, posten Sie sie in den Kommentaren unten oder erreichen Sie mich auf LinkedIn. (Y (t) y (t-1)) ampamp (y (t) y (t1)) Es ist ein Ansatz, um Peaks auf der Grundlage der folgenden Beobachtung zu erkennen: Zeit t ist ein Peak Vermeidet falsche Positives durch Warten, bis der Aufwärtstrend vorbei ist. Es ist nicht genau Echtzeit in dem Sinne, dass es den Peak um einen dt vermissen wird. Kann die Empfindlichkeit gesteuert werden, indem eine Vergleichsgrenze erforderlich ist. Es gibt einen Kompromiß zwischen der verrauschten Erfassung und der zeitlichen Verzögerung der Erfassung. Sie können das Modell bereichern, indem Sie weitere Parameter hinzufügen: wobei dt und m Parameter zur Steuerung der Empfindlichkeit vs Zeitverzögerung ist hier der Code zur Reproduktion des Plots in python: Durch Einstellung von m 0,5. Können Sie ein Cleaner-Signal mit nur einem falschen positiv: In der Signalverarbeitung, Peak-Erkennung wird oft über Wavelet-Transformation durchgeführt. Sie haben grundsätzlich eine diskrete Wavelet-Transformation auf Ihre Zeitreihendaten. Nulldurchgänge in den zurückgegebenen Detailkoeffizienten entsprechen Spitzen im Zeitreihensignal. Sie erhalten unterschiedliche Spitzenamplituden, die bei verschiedenen Detailkoeffizienten ermittelt wurden, wodurch Sie eine mehrstufige Auflösung erhalten. Wenn der Grenzwert oder andere Kriterien von zukünftigen Werten abhängen, dann ist die einzige Lösung (ohne Zeitmaschine oder andere Kenntnisse über zukünftige Werte), jede Entscheidung zu verzögern, bis man genügend Zukunftswerte hat. Wenn Sie eine Stufe über einen Mittelwert haben möchten, der z. B. 20 Punkte überspannt, müssen Sie warten, bis Sie mindestens 19 Punkte vor jeder Höchstentscheidung haben, sonst könnte der nächste neue Punkt Ihre Schwelle 19 Punkte vollständig wegwerfen . Ihr aktuelles Grundstück hat keine Peaks. Es sei denn, Sie irgendwie im Voraus wissen, dass der nächste Punkt ist nicht 1e99, die nach der Skalierung Ihrer Grundstücke Y Dimension, wäre flach bis zu diesem Punkt. Ich habe ein Signal, das ich bei 500khz Probe. Ich versuche, einen Anstieg, Abfall und die Spitze in den eingehenden Daten zu erkennen. Die Basis des Peaks könnte für 250 usec oder 2,5 msec sein, die Amplitude könnte 6db oder 15db über dem Noise Floor sein. Ich habe nicht gute snr leider. Der DC-Pegel des Signals ist nicht konstant, sondern bewegt sich viel langsamer als die AC-Komponente. Am Entscheidungspunkt muss ich die Steigung des Anstiegs und des Sinkens kennen. Dies ist ein hartes Echtzeit-System und ich muss wirklich eine Entscheidung im 100usec treffen, nachdem die Abwärtssteigung bis zum DC-Niveau erreicht ist. Ich bin auf der Suche nach Anregungen, wie kann ich effizient implementieren einen Algorithmus, der anständig ist. Derzeit habe ich einen laufenden Durchschnitt (letzten 25 Datenpunkte hinzugefügt) und versuchen, den Trend zu erkennen. Sobald ich den Trend nach oben entdecke, beginne ich, den Trend nach unten zu suchen, und sobald ich das mache, sammle ich vielleicht noch 50 Proben und beginne zu berechnen. Noise jetzt leicht schrauben diesen Algorithmus, daher die Frage. Zum Wohle der anderen, habe ich am Ende Umsetzung eines Moving Average gefolgt von Integrator. Gleitender Durchschnitt der vergangenen 64 Daten geglättet genug, aber verlorenen Anstieg zu einem Grad, die Integration der letzten 8 Werte gewonnen den Anstieg und ich suche einfach für Aufstieg und Fall, später habe ich eine lineare Regression für die Steigung. Funktioniert ok, nicht groß, aber ok. Gefragt Jul 7 12 at 8:01 Ich bin nicht sehr gut mit DSP versiert. Kannst du mich auf eine mögliche Umsetzung hinweisen Auf der Grundlage deiner Antwort und meiner begrenzten Kenntnisse, denke ich, dass der Link (holoborodkopavelnumerical-methodsnumerical-derivativzwnj8203ehellip) genau das macht, was du erwähnst. Wenn ich einen solchen Ansatz verwenden würde, weiß ich nicht 1) Wie kann ich meine Frequenzen bestimmen 2) Wie wählt man Filterkoeffizienten aus ndash Ktuncer Auch der folgende Link löst ein ähnliches Problem und enthält viele Links . Dsprelatedshowmessage1237401.php ndash Ktuncer Ihre Antwort 2017 Stack Exchange, IncConsider mit einem Signal im Zeitbereich, und Sie wollen das Signal glätten. Moving Average und Gaußsche Filter, die verwendet werden. Wie wählen Sie, die für was Was sind die Bedingungen, unter denen Gaussian ist besser und Bedingungen, unter denen gleitende Durchschnitt besser ist Was ich versuche, mit diesem Signal zu tun ist, Peak-Erkennung zunächst, dann gelten kleine Fenster auf jedem Teil und Abbildung (Doppler-Verschiebungen) für jedes Teil, um die Bewegungsrichtung aus der Frequenzänderung herauszufinden. Ich möchte das Signal in Zeit-Domain ohne Verlust von Informationen im Frequenzbereich zu glätten. Ich dachte für den Teil der herauszufinden, die Doppler-Verschiebungen, mit STFT wäre eine gute idea. If Referenz könnte auf einige Papier, das wäre auch wirklich hilfreich sein. Ein zentriert gleitenden Durchschnitt Filter ist ein Finite-Impulsantwort (FIR) Filter, die das gleiche Gewicht auf alle Proben im Fenster beeinflusst. Wenn Sie nur über Zeitbereichseigenschaften kümmern und sich nicht um seine relativ schlechte Leistung im spektralen Bereich kümmern, für ein Signal, das ziemlich stationär über dem Fenster ist, können Sie es verwenden. Es hat extrem schnell laufende Implementierung und kann leicht für sehr kurze Signale verwendet werden. Im spektralen Bereich nehmen Sie an, dass Sie die gleiche Signalamplitude bei drei Frequenzen f1 lt f2 ltf3: S (f1) S (f2) S (f3) haben. Das Amplitudenspektrum dieses Filters ist im allgemeinen nicht abnehmend. So können Sie am Ende mit einem gefilterten Signal s, für die S (f2) 0 lt S (f1) lt S (f3). Mit anderen Worten, das Frequenzverhalten ist nicht völlig natürlich. Wenn Sie Ihr Signal im Zeitbereich betrachten, ziemlich lang und mit einem nicht stationären Verhalten, könnte ein Gaußscher Filter eine klügere Wahl sein, wenn Sie nur diese zwei Optionen haben und wenn Online-Filter oder Rückmeldung kein Problem sind. Es ist ein unendlicher Impulsantwortfilter. Es bietet einen schönen Kompromiss zwischen der Zeit und dem Frequenzbereich (in dem seine Antwort abnimmt). Und erlauben einige schnelle rekursive Implementierungen zu. Sie können sogar eine Approximation eines Gaußschen Filters emulieren, indem mehrere gleitende Mittelwerte verschiedener Längen kombiniert werden. So würde ich für den Gaussian gehen, wenn Ihr nur Ziel ist, das Signal zu glätten. Aber ich glaube, dass für mehr beteiligten Verarbeitung, könnten andere Filter mehr geeignet. Vorsicht vor der Einzigartigkeit am rechten Ende, though. Beantwortet Sep 29 16 am 13:13

No comments:

Post a Comment