Ich habe ein analoges Signal und ich möchte Kanten/'Wellenformen' erkennen. Die zu erkennenden Wellenformen sind manchmal so einfach wie im ersten Beispiel (einfache steigende Flanke), aber auch komplexer (wie eine steigende Flanke mit einem vorhergehenden kleineren "Blob"). Das Signal hat Rauschen und unerwünschte kleinere Signale, so dass ein Ausgang wie "passender Grad" von 0.0 bis 1.0 einen Schwellenwert festlegen könnte. Eine weitere Anforderung ist die Detektionszeit: Der Algorithmus muss innerhalb von 1 'Anstiegszeit' auslösen, wie der rote Klecks-Kreis im Bild. So früh wie möglich, aber nicht vor Erreichen des Maximums.Patternmatching zur Erkennung der Signalflanke?
Alles wird auf einem STM32 ARM-Controller ausgeführt, das Signal hat 100 Punkte pro Sekunde. Eine Flankenanstiegsflanke dauert 0,5 bis 2 Sekunden, so dass der Datenbereich, der betrachtet werden soll, bei 250 bis 500 Datenpunkten liegen würde.
Ich habe gelesen über Korrelation und FFTs, aber wenn ich das Thema richtig verstehe, wird dies nur für periodische Wellenformen gelten (wie die FFT wird das Signal in sin/cos Teile zerlegen).
Ist FFT und Korrelation der richtige Weg zu nehmen oder gibt es bessere Methoden für unsere Anforderung? Wenn unser Weg stimmt, gibt es empfohlene Literatur/Suchbegriffe für einen einfachen Einstieg in das Thema?
Edit: Ich habe Beispiele für echte Daten hinzugefügt. In Picture 2 können Sie eine leicht zu erkennende Kante sehen. Wir haben keine Probleme mit diesen Kanten mit einer einfachen Kantenerkennung.
In Picture 3 liegt unser Problem: Unser aktueller Algorithmus erkennt eine Flanke bei 2565s, aber wir wollen eine Erkennung bei 2574s. Der erste 'Blob' erscheint immer mit etwa 40% - 85% des Signalpegels verglichen mit der zu erkennenden Flanke.
Ein Muss vor dieser Frage kann sinnvoll beantwortet werden: zeigen Sie echte Daten. Ich weiß aus Erfahrung, dass echte Daten * nie * wie OP-Skizzen sind. –
Ich würde vorschlagen, dass Sie eine Wavelet-Paket-Transformation dazu werfen, sehen, was Sie bekommen, und versuchen, Muster in der Ausgabe zu finden. Die Unterseite von https://en.wikipedia.org/wiki/Wavelet_packet_decomposition verweist auf vorhandene Implementierungen in MATLAB, R, C++ und Java, die Sie ausprobieren können. Ich würde empfehlen zu vermeiden, zu glatt zu sein. Ein 4-Tap Daubechies Wavelet wird wahrscheinlich gut funktionieren. (Das Haar Wavelet ist zu grob - es wird nicht die steigende Kante sehr gut darstellen.) – btilly