Korrelation 2er Signale

Im Unterforum Microcontroller - Beschreibung: Hardware - Software - Ideen - Projekte

Elektronik Forum Nicht eingeloggt       Einloggen       Registrieren




[Registrieren]      --     [FAQ]      --     [ Einen Link auf Ihrer Homepage zum Forum]      --     [ Themen kostenlos per RSS in ihre Homepage einbauen]      --     [Einloggen]

Suchen


Serverzeit: 28 12 2025  00:35:37      TV   VCR Aufnahme   TFT   CRT-Monitor   Netzteile   LED-FAQ   Oszilloskop-Schirmbilder            


Elektronik- und Elektroforum Forum Index   >>   Microcontroller        Microcontroller : Hardware - Software - Ideen - Projekte


Autor
Korrelation 2er Signale

    







BID = 465972

Pinsel

Gerade angekommen


Beiträge: 14
Wohnort: Hessen
Zur Homepage von Pinsel
 

  


Hallo zusammen,

ich möchte gerne 2 Signale aufnehmen und auf Ähnlichkeit überprüfen. Dies soll später auf einem Controller stattfinden.

Erst einmal zur Theorie:

Für Testzwecke habe ich

- Messdaten von 2 Signalen
- Das 1. Signal beinhaltet sagen wir 1000 Samples
- Das 2. Signal beinhaltet 100 Samples und ist ein Ausschnitt aus dem 1. Signal
- Nun will ich die beiden so vergleichen (korrelieren), um herauszufinden, wo sich mein 2. Signal im 1. Signal befindet. Also an welcher Stelle sich die beiden Signale am ähnlichsten sind.

Prinzipiell soll es so funktionieren (hab ich gelesen), dass ich die beiden Signale Punk für Punkt multipliziere und die Ergebnisse aufsummiere. Dann sollte ich ein Maß für die Ähnlichkeit haben. Ich verstehe jedoch das Prinzip nicht so ganz, weil wenn ich 2 völlig unterschiedliche Signale >0 habe und die Punkt für Punkt multipliziere und die Ergebnisse aufaddiere, bekomme ich doch auf jeden Fall einen Wert >0 raus. An dieser Stelle sollte ich aber doch einen Korrelationsfaktor von 0 herausbekommen, da die Signale doch völlig verschieden sind??

Hoffe jemand kann mir helfen

MFG

BID = 465983

BjörnB

Stammposter

Beiträge: 242
Wohnort: Dortmund

 

  

Hallo,

die Methode mit dem Multiplizieren funktioniert eigentlich nur für binäre Signale, bei denen jedes Sample nur 0 oder 1 sein kann. Sind die Samples z.B. ganze Bytes, dann kann man jedoch stattdessen einfach die zueinandergehörigen Bytes miteinander vergleichen. Im ersten Durchlauf wird also z.B. Sample 1 von Signal 1 mit Sample 1 von Signal 2 verglichen und bei Gleichheit ein Zähler hochgezählt, danach Sample 2 von Signal 1 mit Sample 2 von Signal 2 usw. bis zu in Deinem Fall Sample 100. Sind beide Signale identisch, dann steht danach im Zähler eine 100, gibt es keine Korrelation, dann eine 0, ansonsten ein Wert dazwischen. Diesen Wert speicherst Du zunächst ab. Nun wird das Ganze mit um ein Sample verschoben Signalen wiederholt, also Sample 2 von Signal 1 mit Sample 1 von Signal 2 verglichen bis Sample 101 von Signal 1 mit Sample 100 von Signal 2.

Du musst also zwei Schleifen programmieren, die äußere initiiert den Vergleich von jeweils verschobenen Samplereihen, hätte in Deinem Fall also 901 Durchläufe (1/1:1/2-100/1:100/2 bis 901/1:1/2-1000/1:100/2), die innere Schleife führt die eigentlichen Vergleiche (jeweils 100) durch. Wenn Du nun nach jedem Durchlauf der äußeren Schleife den Zählerwert und die Verschiebung speicherst, so lässt sich die maximale Korrelation und die dazuzugehörige Verschiebung bestimmen.

Schöne Grüße,
Björn

BID = 465999

perl

Ehrenmitglied



Beiträge: 11110,1
Wohnort: Rheinbach


Zitat :
weil wenn ich 2 völlig unterschiedliche Signale >0 habe
Diese Signale sind eben nicht völlig unterschiedlich, sondern durch die Bedingung ">0" korrelierst du ein DC-Signal mit einem anderen DC-Signal.

http://de.wikipedia.org/wiki/Autokorrelationsfunktion


_________________
Haftungsausschluß:



Bei obigem Beitrag handelt es sich um meine private Meinung.



Rechtsansprüche dürfen aus deren Anwendung nicht abgeleitet werden.



Besonders VDE0100; VDE0550/0551; VDE0700; VDE0711; VDE0860 beachten !

[ Diese Nachricht wurde geändert von: perl am 23 Okt 2007 13:39 ]

BID = 466011

steinb

Gerade angekommen


Beiträge: 7

Anders als in einem früheren Beitrag behauptet, funktioniert die beschriebene Korrelationsmethode nicht nur mit Binärwerten, sondern natürlich auch mit analogen (und somit eben auch mit mehr als 1-bittig digitalisierten) Signalen.

Du scheinst eine Korrelation erreichen zu wollen, bei der die im früheren Beitrag erwähnte DC-Korrelation wegfällt. Also filtere vorab die DC-Komponente der Signale heraus, so dass Du mit vorzeichenbehafteten Signalen anfängst. Evtl. geht das schon elektrisch, so dass der Mittelwert z.B. immer einen definierten ADC-Wert ergibt, den Du leicht abziehen kannst; alternativ könntest Du das Signal natürlich auch durch einen digitalen Hochpass jagen.

Noch etwas:
Ist es überhaupt wichtig, dass das Korrelationssignal bei nur DC-Korrelation Null wird? So, wie es sich anhörts, suchst Du ja doch nur die Signalverschiebung, bei dem die Korrelation maximal wird -- und diese Stelle dürfte sich nicht ändern, wenn die Signale konstante Offsets tragen.

Da Korrelationen neu für dich zu sein scheinen, ist dir eine interessante und nicht ganz intuitive Eigenschaft vielleicht unbekannt:
Das Berechnen der Korrelation für alle möglichen Verschiebungen geht auch schneller als mit dem von dir skizzierten Algorithmus mittels (schneller) Fouriertransformation (ungefähre Idee: Rücktransformation der Einzelwertmultiplikation der jeweiligen Transformierten ist die Korrelation; Details sehe Mathematiknachschlagewerk, z.B. Bronstein). Der entsprechende Algorithmus ist aber nicht gerade einfach zu programmieren, besonders, wenn die Anzahl der Eingangsdaten keine 2er Potenz ist. Außerdem brauchst Du ja vielleicht gar nicht die Korrelationswerte zu _allen_ möglichen Verschiebungen -- wenn Du versuchst, mit weniger auszukommen, hier aber eine kleine Warnung: Je nach Art der Eingangssignale kann es viele Nebenmaxima geben, also kann der Versuch, das Korrelationsmaxima zu finden ohne die Korrelation wirklich überall auszuwerten, fehleranfällig sein.

Viel Erfolg!

[ Diese Nachricht wurde geändert von: steinb am 23 Okt 2007 15:11 ]

BID = 466012

Pinsel

Gerade angekommen


Beiträge: 14
Wohnort: Hessen
Zur Homepage von Pinsel

Danke für die schnellen Antworten.

Bei mir handelt es sich um 2 Analogsignale welche durch einen AD Wandler eingelesen werden sollen.

Ein schönes Applet findet man hier:
http://www.jhu.edu/~signals/convolve/

Habe mir nun mit Matlab eine Funktion geschrieben die mir Schritt für Schritt die 2 Signale vergleicht und anschließend normiert (durch den Effektivwert der einzelnen Signalen teilt).
Nun habe ich bei Übereinstimmung einen Faktor von 1

MFG

BID = 466015

Pinsel

Gerade angekommen


Beiträge: 14
Wohnort: Hessen
Zur Homepage von Pinsel

@steinb

ich berechne meinen Korrelationsfaktor so:

\fed\mixoncorr(x)=gauss(sum(x(i)*y(i+k),i=1,n)/sqrt(sum(x(i)^2,i=1,n)*sum(y(i+k)^2,i=1,n)))

Also laut Matlab geht das wunderbar und programmiert habe ich das auch schnell.
Wie sieht es bei dieser Formel mit der Rechengeschwindigkeit aus?
Hoffe ein uC kann so etwas bearbeiten.

MFG

BID = 466018

perl

Ehrenmitglied



Beiträge: 11110,1
Wohnort: Rheinbach


Zitat :
Hoffe ein uC kann so etwas bearbeiten.
Wenn du sehr viel Zeit für die Berechnung hast, mag das gehen, aber die meisten µC haben einfach nicht genug Speicher.
Ansonsten ist das eine typische Aufgabe für einen DSP, wie du sie vorzugsweise bei Analog Devices, Freescale oder TexasInstruments findest. Nicht ganz so verbreitet sind die DSPs von Atmel und die die dsPic von Microchip, die leistungsmäßig eine Zwischenstufe darstellen.

_________________
Haftungsausschluß:



Bei obigem Beitrag handelt es sich um meine private Meinung.



Rechtsansprüche dürfen aus deren Anwendung nicht abgeleitet werden.



Besonders VDE0100; VDE0550/0551; VDE0700; VDE0711; VDE0860 beachten !

BID = 466266

steinb

Gerade angekommen


Beiträge: 7

@Pinsel,

Meine Anmrkung bezog sich, wie Perl richtig erkannt hat, darauf, dass in vielen Anwendungen die Berechnung zeitkritisch ist. Wie gesagt, es sollte auch nur eine "vielleicht interessiert es Dich" - Anmerkung sein.

In deiner Formel (in der "corr(k)" übrigends sinnvoller als "corr(x)" wäre), wenn i 100 Werte abläuft und k 900 (um alle Samples des Signals mit 1000 Werten zu benutzen), braucht die naive Berechnung der Zähler der 900 Korrelationswerte bereits 900 x 100 x 100 Multiplikationen; die im Nenner zähle ich 'mal nicht, da man bei geschickter Umsetzung (Matlab macht das aber sicher nicht) die Arbeit eigentlich nur einmal, nicht 900x hat, denn es ändern sich im Nenner nur wenige Werte wenn man k ändert.

Also 9 Millionen Multiplikationen.
Könnte auf einem Mikrocontroller mit Hardware-Multiplizierer innerhalb von einer bis wenigen Sekunden abgearbeitet sein. Bei naiver Implementierung, wenn der Nenner in deiner Formel für jeden k-Wert komplett neu berechnet wird, das dreifache. Für einen Mikrocontroller ohne Hardwaremultiplizierer kannst Du diesen Schätzwert noch mit einem Faktor von ganz grob geschätzt ca. 30 multiplizieren -- wie eilig hast Du es?

Ein heutiger PC oder ein schneller (und gut programmierter) DSP schafft das natürlich in einer Hundertstelsekunde. Meine Anmerkung würde in diesem Beispiel gerade einmal eine kleine Beschleunigung (vielleicht Faktor 1 bis 6 oder so, sehr abhängig von Hardware und Implementierung) bei erheblichem Einarbeitungs- und Programmieraufwand ermöglichen.
Aber sie skaliert gut: Wenn Du 10mal mehr Samples verarbeiten wolltest, hätte ich oben wohl nicht "1 bis 6", sonder eher "7 bis 40" mal schreiben müssen. Aber in den Speicher vieler Mikronkontroller passen natürlich auch nicht 10 mal so viele Samples

Ein anderer Ansatz wäre, wie früher angedeutet, einfach corr(k) nicht für alle denkbaren Werte von k zu berechnen. Das aber kann, wie gesagt, im Einzelfall schief gehen. Aber wenn Du z.B. nach einer kompletten Berechnung nur die Synchronisation halten willst, kann es z.B. ausreichen, nur Werte von k in der unmittelbaren Nähe des bereits gefunden zu untersuchen.

Speicher:
100 plus 1000 Samples in 8bit Auflösung passen bequem in 2 kByte Speicher, wie viele "größere" Mikrokontroller schon eingebaut haben. Aber achte auf einen (vorzugsweise schnellen) Hardware-Multiplizierer! Bei höherer Auflösung brauchst du mehr Speicher (oder musst dich mit solchen zeit- und nervenaufreibenden Dingen befassen, beispielsweise byte-Grenzen zu überschreiten, indem Du 2 Werte in 3 Bytes quetschst, oder z.B. auf 900 und 100 Samples heruntergehen). Beliebte Anfängerfehler, wie beim Aufsummieren Overflows zu produzieren (für Summe und Zwischenwerte reichen 8-bit natürlich nicht, und im Nenner auch die 15 nicht, die ein vorzeichenbehafteter 16-bit Wert effektiv bietet), wirst Du ja meiden, oder?

[ Diese Nachricht wurde geändert von: steinb am 24 Okt 2007 18:24 ]


Zurück zur Seite 1 im Unterforum          Vorheriges Thema Nächstes Thema 


Zum Ersatzteileshop


Bezeichnungen von Produkten, Abbildungen und Logos , die in diesem Forum oder im Shop verwendet werden, sind Eigentum des entsprechenden Herstellers oder Besitzers. Diese dienen lediglich zur Identifikation!
Impressum       Datenschutz       Copyright © Baldur Brock Fernsehtechnik und Versand Ersatzteile in Heilbronn Deutschland       

gerechnet auf die letzten 30 Tage haben wir 17 Beiträge im Durchschnitt pro Tag       heute wurden bisher 0 Beiträge verfasst
© x sparkkelsputz        Besucher : 187981119   Heute : 313    Gestern : 11123    Online : 438        28.12.2025    0:35
10 Besucher in den letzten 60 Sekunden        alle 6.00 Sekunden ein neuer Besucher ---- logout ----viewtopic ---- logout ----
xcvb ycvb
0.131057024002