Forum: Digitale Signalverarbeitung / DSP / Machine Learning Implementierung Kreuzkorrelation


von Supa M. (supa_micha)


Lesenswert?

Hi,

ich hoffe, ihr könnt mir helfen. Und zwar führe ich eine 
Kreuzkorrelation zwischen zwei Signalen durch:
1
// alle Variablen als int16_t deklariert
2
#undef  STEP
3
#define STEP(k) (s1[k] * s2[k - lambda])
4
5
  for (lambda = 40; lambda <= 120; lambda++) 
6
  {   
7
    int32_t  result;
8
9
    L_result  = STEP(0);  L_result += STEP(1);
10
    L_result += STEP(2);  L_result += STEP(3);
11
    L_result += STEP(4);  L_result += STEP(5);
12
    L_result += STEP(6);  L_result += STEP(7);
13
    L_result += STEP(8);  L_result += STEP(9);
14
    L_result += STEP(10); L_result += STEP(11);
15
    L_result += STEP(12); L_result += STEP(13);
16
    L_result += STEP(14); L_result += STEP(15);
17
    L_result += STEP(16); L_result += STEP(17);
18
    L_result += STEP(18); L_result += STEP(19);
19
    L_result += STEP(20); L_result += STEP(21);
20
    L_result += STEP(22); L_result += STEP(23);
21
    L_result += STEP(24); L_result += STEP(25);
22
    L_result += STEP(26); L_result += STEP(27);
23
    L_result += STEP(28); L_result += STEP(29);
24
    L_result += STEP(30); L_result += STEP(31);
25
    L_result += STEP(32); L_result += STEP(33);
26
    L_result += STEP(34); L_result += STEP(35);
27
    L_result += STEP(36); L_result += STEP(37);
28
    L_result += STEP(38); L_result += STEP(39);
29
30
    if (result > max) 
31
    {
32
      x   = lambda;
33
      max = result;
34
    }
35
  }

Eigentlich interessiert mich aber nur die Stelle der maximalen 
Kreuzkorrelation und der entsprechende Wert. Letztendlich benötige ich 
für die Berechnung also eine Menge Rechenzeit (um nicht zu sagen, zu 
viel), obwohl mich nur ein Wert interessiert. Gibt es eine Möglichkeit, 
hier ohne eine vollständige Kreuzkorrelation auszukommen? Oder evtl. 
eine einfache Abschätzung, mit der ich dann die Suche nach dem Maximum 
auf einige wenige Berechnungen begrenzen kann?

Vielleicht habt ihr eine Idee? Mir ist leider bislang nichts eingefallen 
:-(

Vielen dank schonmal im Vorraus!
Viele Grüße
Michael

von der mechatroniker (Gast)


Lesenswert?

Wenn der zu erwartende Peak nicht allzu scharf ist, sollte es doch 
reichen, jeden 10. Wert zu berechnen. Dann kann man an den Stellen, die 
interessant werden könnten (Umgebung der relativen Maxima), die 
restlichen Werte bestimmen.

von Detlef _. (detlef_a)


Lesenswert?

Korrelation ist über die FFT berechenbar:

a korreliert mit b = ifft(fft(a)*conjugiert komplex(fft(b)))

Enweder direkt, wie Du das machst, oder über die FFT. Sonst gibs da 
keine Tricks, da muß man viel rechnen.


Cheers
Detlef

von Supa M. (supa_micha)


Lesenswert?

Entschuldigung, dass ich mich so pät erst wieder melde. Ich war Ende der 
letzten Woche unterwegs und hatte so keine Zeit, weiterzuarbeiten.

@der mechatroniker:
Deine Idee ist echt gut. Habe mir daraufhin mal die Ergebnisse der 
Kreukorellation aufzeichen lassen. Leider weisen sie überhaupt keine 
Stetigkeit auf. Schade!

@Detlef:
Daran habe ich auch zunächst gedacht. Da ich vor allem nur das Maximum 
benötige, bräuchte ich keine vollständige IFFT durchführen. Nach ersten 
Berechnungen sind aber meine Datenblöcke zu kurz, damit sich das lohnen 
würde.

Dennoch habe ich es jetzt sowiet optimiert, wie es für mcih ausreicht. 
Und zwar sind die Werte von s1 fourierverteilt, d.h. kleine Werte kommen 
sehr sehr häufig vor. Damit ist es bedeutend schneller (Faktor 5), die 
Werte entsprechend aufzuaddieren anstand eine vollständige 
Multiplikation durchzuführen.

Viele Grüße
Michael

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.