Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Unscharfe Mustererkennung (https://www.delphipraxis.net/142730-unscharfe-mustererkennung.html)

alzaimar 2. Nov 2009 20:16


Unscharfe Mustererkennung
 
Hi ho,

Ich habe zwei Signale (A und B). B kopiert die Signale von A, allerdings zeitversetzt und mehr oder weniger synchron. Ich muss nun die zeitliche Distanz zwischen den beiden Signalen A und B herausbekommen.

Beispiel:

A liefert: 1-2-1-1-5-8-7-9-1-1-1-1
B liefert: 2-1-2-2-1-2-1-2-2-1-6-7-2-7-2-1-1

Die rot markierten 'Peaks' möchte ich erkennen, sowie den Abstand (6 Einheiten) herausbekommen. Da das ganze kontinuierlich vonstatten geht, kann ich mir Umfangreiche Berechnungen nicht leisten.

Bitte beachtet: Erstens ist das gedoppelte Signal bei 'B' keine 1:1 Kopie und zweitens kann ein einzelner Wert komplett ausfallen (Sequenz 5-8-7-9, also 4 Peaks vs. 6-7-2-7 (2 Peaks, Rückfall, 1 Peak).

Ich könnte z.B. einfach das 'X' wählen, für das die Summe (A[i] - B[i-X])^2 minimal ist. Das müsste passen, aber leider etwas aufwändig. Zumal ich auch Zeiten habe, bei denen ich gar keine Auffälligkeit in beiden Signalen habe. Nur wenn eben mal etwas bei 'A' passiert, dann auch garantiert etwas später bei 'B'. Und diese Differenz möchte ich automatisch berechnen und zudem immer wieder anpassen.

Ach, die Peaks, also die relevanten Signale sind schon deutlich, ich kann also eine minimale Differenz D_min = A[i+1] - A[i] definieren bzw. vorgeben.

Ich dachte an eine Art Filter:
Wenns bei A rumpelt, dann merke ich mir den Zeitstempel und ignoriere bis auf Weiteres weitere Rumpler bei A.
Wenn es dann bei B rumpelt, habe ich meine Zeitdifferenz und lasse Rumpler bei 'A' wieder zu.

Jetzt muss man nur noch 'Rumpeln' definieren...

Hat jemand eine pfiffige Idee, wie man so eine Art 'unscharfe Mustererkennung' hinbekommt?

jfheins 2. Nov 2009 20:28

Re: Unscharfe Mustererkennung
 
Ich würde jetzt mal folgendes vorschlagen:

Wenn bei A ein Peak anfängt (Differenz zu vorhergehenden 1 bis 2 Werten größer als ein d) alle werte aufsummieren. Wenn der Peak wieder abfällt aufhören zu summieren. Wenn du über einen gewissen Grenzwert gekommen bist ("Das Signal hatte eine zeitlang eine gewisse Mindesthöhe") dann war das ein "Rumpler" (Deine Bezeichnungen sind zu geil :mrgreen: )

Das gleiche bei B. Wenn die Signale ungefähr passen, sollte ungefähr die gleiche Fläche dabei rauskommen. So +/- 10% oder so als Toleranz und die Erkennung sollte funktionieren.

Uwe Raabe 2. Nov 2009 20:41

Re: Unscharfe Mustererkennung
 
Vielleicht liegt es ja an deinem Beispiel, aber wenn man immer drei Werte addiert (sehr einfache Glättung), sehen deine Reihen so aus:

A: 4, 4, 7, 14, 20, 24, 17, 11, 3, 3
B: 5, 5, 5, 5, 4, 5, 5, 5, 9, 14, 15, 17, 11, 10, 4

Ich habe mal als Schwellenwert 10 angenommen - damit sind die Rumpler und deren Dauer gut zu ermitteln. Ob man nun den Anfang oder den Mittelpunkt des jeweiligen Rumplers nimmt, muss die Praxis zeigen. Den Zeitpunkt eines solchen Rumplers in A schreibt man vielleicht in eine Queue, die dann von B als Vergleich herangezogen wird. Die Frage der Synchronisierung ist damit allerdings noch nicht gelöst. Eventuell kann man eine der besagten Ruhezeiten heranziehen um die Queue zu resetten.

alzaimar 2. Nov 2009 20:44

Re: Unscharfe Mustererkennung
 
@jfheins: Das mit der Fläche ist gut. Ich zeichne gerade Testdaten auf und werde morgen mal die Flächengeschichte testen.
@Uwe: Das Beispiel hab ich mir ausgedacht, denn die Testdaten sind im Büro. Das Aufsummieren, um Einzelpeaks herauszufiltern, könnte auch klappen.

Medium 2. Nov 2009 20:56

Re: Unscharfe Mustererkennung
 
Wäre sowas nicht ein klassisches Einsatzgebiet für eine Fuzzy Logic? (Was jfheins beschrieb kommt dem sogar prinzipiell relativ nahe.)

negaH 3. Nov 2009 06:54

Re: Unscharfe Mustererkennung
 
suche nach "Matched Filter" und "Korrelation" denn das ist genau das was du brauchst. Es hängt nun von deinen Signalströmen ab.
Eines der Signale musst du in einer "Zeitschleife" zwischenbuffern. Dieser Buffer, ein FIFO, ist dein Vergleichsmuster. Dessen Speichertiefe minus maximale detektierbare Musterlänge bestimmt den maximal detektierbaren Musterabstand. Der Matched Filter ist ein digitaler Filter und wird oft in DSPs eingesetzt. Normalerweise wird man den mit fixiertem Muster betreiben. Er bekommt den Signalstrom sequentiell und erzeugt einen Amplitudenwert der anzeigt wie stark das Signal mit dem Muster übereinstimmt. Wird dessen Muster nun aus einem FIFO hergezogen, der FIFO selber mit einem Signalstrom gefüllt, dann hast du einen Sliding Window Korrelator.
Ein Problem kann uU. die Frage werden in welchem Signalstrom kam das übereinstimmende Muster zuerst vor, also die Bestimmung der Phasenlage des Signales in Relation zum Referenzsignal.
In jedem Falle wird es rechenointensiv, denn mit jedem Sample wird ein Vergleich von Musterlänge Samples nötig. Das kann man mit einer FFT, Fourier Transformation um einen gewissen Faktor beschleunigen.
Über Wikipedia kannst du dich durch die ganze Materie hangeln.

[edit]
Phasenkorrelation wäre noch so ein Stichwort, kam nicht drauf ;)
[/edit]

Gruß Hagen

alzaimar 3. Nov 2009 07:02

Re: Unscharfe Mustererkennung
 
Das ist dann Stoff für die nächsten Wochen... :shock:

Danke!


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:31 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz