Forum: Digitale Signalverarbeitung / DSP / Machine Learning diskrete Kreuzkorrelation berechnen


von Zod M. (do0zy)


Lesenswert?

Hallo zusammen,

für ein aktuelles Projekt möchte ich die Kreuzkorrelation zweier 
zeitdiskreter Signale auf einem uC berechnen. Verwenden möchste ich 
einen Atmel SAMD21 Controller. Meine Frage bezieht sich aber nur auf die 
Mathematik der Berechnung bzw. der implementierung in c-Code.
Die Signale möchte ich für den den Test zunächst nur "simulieren" d.h. 
ich habe mir zwei "perfekte" Sinus (0->2pi) Signale mit einer 
Phasenverschiebung von pi/4 zueinander als diskrete Werte mit 100 
Datenpunkten in zwei Arrays gespeichtert.
Ziel meiner Berechung ist es, möglichst genau zu berechnen in welchem 
zeitlichen Abstand die beiden Signale zueinander verschoben sind. Hierzu 
meine Frage:

Kann ich die Kreuzkorrelation der beiden Signale für alle möglichen 
Zeitverschiebungen berechen und dann nur noch nachschauen, bei welcher 
Zeitverschiebung die "Überlappung" beider Signale am größten ist?
D.h. die beiden Signale können ja maximal 100 Datenpunkte außeinander 
liegen und bei einer der 100 möglichen Verschiebungen müsste das 
Ergebnis der Kreuzkorrelationsfunktion am größten sein. Oder bin ich mit 
der Methode eher aufm dem Holzweg?

In meinem Programmcode würde das dann bedeuten ich müsste 100 mal die 
Kreuzkorrelation der beiden Signale berechnen, wobei jede dieser 
Berechnungen wieder aus 100 mal "Aufsummieren" der Produkte bestehen 
würde. Ohne es bisher getestet zu haben scheint mir das ganz schön viel 
Rechenaufwand für den uC zu sein.

Danke für eure Hilfe.

: Bearbeitet durch User
von . . (Gast)


Lesenswert?

Versuch es mit FFT.

von Christian M. (Gast)


Lesenswert?

.                                                . schrieb im Beitrag 
#6089507:
> Versuch es mit FFT

Ja klar!

Dominik W. schrieb:
> ganz schön viel Rechenaufwand für den uC zu sein

Deshalb nimmt man normalerweise einen DSP dafür...

Gruss Chregu

von Joe F. (easylife)


Lesenswert?

Dominik W. schrieb:
> Ohne es bisher getestet zu haben scheint mir das ganz schön viel
> Rechenaufwand für den uC zu sein.

Um genau zu sein: es sind 100x100 = 10000 Multiplikationen.
Auch für einen uC durchaus machbar, die Frage ist halt, wie oft pro 
Sekunde erwartet man ein Ergebnis.

von Zod M. (do0zy)


Lesenswert?

Christian M. schrieb:
> Deshalb nimmt man normalerweise einen DSP dafür...

Mit einem DSP hab ich bisher noch nicht gearbeitet, aber vieleicht ist 
das ja jetzt die richtige Gelegenheit dazu, danke.

Joe F. schrieb:
> Um genau zu sein: es sind 100x100 = 10000 Multiplikationen.
> Auch für einen uC durchaus machbar, die Frage ist halt, wie oft pro
> Sekunde erwartet man ein Ergebnis.

Ich denke auch, dass ich da am Ende von der Rechenzeit des uCs auf eine 
maximale Aktuallisierungsrate limitiert sein werde.

Dominik W. schrieb:
> Kann ich die Kreuzkorrelation der beiden Signale für alle möglichen
> Zeitverschiebungen berechen und dann nur noch nachschauen, bei welcher
> Zeitverschiebung die "Überlappung" beider Signale am größten ist?

Nachdem niemand etwas gegen diese Methode gesagt hat, gehe ich mal davon 
aus, dass ich damit richtig liegen könnte und werde anfangen das so zu 
implementieren, danke.

Falls doch noch jemand einen effizienteren Weg kennt, würde ich mich 
natürlich nochmal über eine Antwort freuen.

: Bearbeitet durch User
von Joe F. (easylife)


Lesenswert?

Dominik W. schrieb:
> Falls doch noch jemand einen effizienteren Weg kennt, würde ich mich
> natürlich nochmal über eine Antwort freuen.

FFT (bzw genauer: Faltung mittels FFT und IFFT) wurde ja genannt. Ist 
mit Sicherheit schneller, aber auch deutlich komplizierter zu 
implementieren.

von Guest (Gast)


Lesenswert?

Joe F. schrieb:
> FFT (bzw genauer: Faltung mittels FFT und IFFT) wurde ja genannt. Ist
> mit Sicherheit schneller, aber auch deutlich komplizierter zu
> implementieren.

Sehe ich auch so, diese Art der Berechnung sollte deutlich schneller 
sein

Auch auf die Gefahr hin das gleich jemand um die Ecke kommt und rum 
meckert in der CMSIS lib ist eine Implementierung für die FFT vorhanden.

Davon abgesehen hält sich die Komplexzeit für die eigene Implementierung 
im Rahmen.

von 1000V Dc (Gast)


Lesenswert?

Vereinfachen wir mal: die LUT hat 180 Einträge für ein Grad 
Phasenauflösung. Wenn ich dann zwei Samples aufnehme, kann ich durch 
Subtraktion einfach die Phadendifferenz der Signale ermitteln?

von . . (Gast)


Lesenswert?

1000V Dc schrieb:
> Vereinfachen wir mal: die LUT hat 180 Einträge für ein Grad
> Phasenauflösung. Wenn ich dann zwei Samples aufnehme, kann ich durch
> Subtraktion einfach die Phadendifferenz der Signale ermitteln?

nein

von 1000V Dc (Gast)


Lesenswert?

Warum?

von 1000V Dc (Gast)


Lesenswert?

Also man subtrahiert nicht die Samples sondern dir Indexe ihre 
Entsprechung in der LUT. Der so berechnete Index gibt die 
Phasendifferenz an...

von . . (Gast)


Lesenswert?

1000V Dc schrieb:
> Also man subtrahiert nicht die Samples sondern dir Indexe ihre
> Entsprechung in der LUT. Der so berechnete Index gibt die
> Phasendifferenz an...

Ahja, wieder was gelernt.

von Detlef _. (detlef_a)


Lesenswert?

Dominik W. schrieb:
> Hallo zusammen,

>
> Kann ich die Kreuzkorrelation der beiden Signale für alle möglichen
> Zeitverschiebungen berechen und dann nur noch nachschauen, bei welcher
> Zeitverschiebung die "Überlappung" beider Signale am größten

> In meinem Programmcode würde das dann bedeuten ich müsste 100 mal die
> Kreuzkorrelation der beiden Signale berechnen, wobei jede dieser
> Berechnungen wieder aus 100 mal "Aufsummieren" der Produkte bestehen

Ja, der Aufwand der brute force Kreuzkorrrelation steigt mit dem Quadrat 
der Anzahl der samples, Auflösung ist ein sample.

Die Kreuzkorrelation kann man auch per FFT berechnen, dann ist der 
Aufwand kleiner, O(n*log(n)), Auflösung immer noch ein sample.

Oder man nimmt direkt das Ergebnis der FFT und vergleicht die Phasen, 
Auflösung besser als ein sample. Wenn eine Sinuswelle nicht genau in das 
'Betrachtungsfenster' reinpaßt muss man Maßnahmen treffen, ist ein 
eigenes Thema.

Man brechnet die Phase mit dem Görtzel-Algorithmus, das nennen die 
Kommunikationstechniker 'runtermischen mit einem komplexen Träger'. Die 
Auflösung ist besser als ein sample, man muss die Frequenz genau wissen.

Wenn man die Frequenz nicht so genau kennt geht das mit 
Beitrag "Frequenz, Amplitude und Phase eines Sinussignals bestimmen"
und einem Phasenvergleich, subsample Auflösung aber qudratischer Aufwand 
O(n^2).

Cheers
Detlef

von . . (Gast)


Lesenswert?

"subsample Auflösung"
Das ist wie, wenn Du dir die erste, die letzte Folge und irgendeine aus 
der Mitte von GoT ansiehst, und daraus den Inhalt der restlichen Folgen 
bestimmst ;)

von Detlef _. (detlef_a)


Lesenswert?

.                                                . schrieb im Beitrag 
#6096985:
> "subsample Auflösung"
> Das ist wie, wenn Du dir die erste, die letzte Folge und irgendeine aus
> der Mitte von GoT ansiehst, und daraus den Inhalt der restlichen Folgen
> bestimmst ;)

Nein, ist es nicht. Das ist Signalverarbeitung. Lernt man nich bei 
GoTKucken.

Cheers
Detlef

von J. V. (janvi)


Lesenswert?

probier deinen Prototypen mit Matlab aus. Da geht eine Kreuzkorrelation 
mit zwei fft in eine einzige Codezeile rein. Daten dann über File oder 
live Schnittstelle draufgeben. Die heutigen PCs sind von der 
Rechenleistung überraschend schnell, (sogar noch mit Matlab). Du siehst 
dann was funktioniert und wie lange es dauert um einen Anhaltspunkt zu 
kriegen was du auf einer eigenen Hardware brauchst. An der gleichen 
Sache bin ich mal mit FPGA gescheitert weil 22 bit Breite nötig gewesen 
wäre und die Bibliotheken bei 20 bit aufhören.

: Bearbeitet durch User
von BlueSky (Gast)


Lesenswert?

Dominik W. schrieb:
> Oder bin ich mit
> der Methode eher aufm dem Holzweg?

Das kommt darauf an, was du im Endeffekt willst, wie die 
Rahmenbedingungen aussehen, und was du über das zu erwartende Signal von 
vornherein schon weisst.

Mitunter kann eine Abwandlung bzw Weiterentwicklung von Korrelation eine 
elgante Lösung sein, manchmal eine Ressourcenvergeudung und sehr oft 
kommt es auf das Selbe raus, ob du korrelierst oder fourrieranalysierst.

von SysIngMue (Gast)


Lesenswert?

Detlef _. schrieb:
> GoTKucken

kucken?

von Detlef _. (detlef_a)


Lesenswert?

SysIngMue schrieb:
> Detlef _. schrieb:
>> GoTKucken
>
> kucken?

https://www.duden.de/rechtschreibung/kucken

Kuck da ma, Systemingenieur, bayerischer.

Cheers
Detlef

: Bearbeitet durch User
von Joe F. (easylife)


Lesenswert?

Schau schau, da kiek mal einer guck.

von bluesky (Gast)


Lesenswert?

gödoschaugst

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.