autocorrelation, matlab/octave

Gast #658998
Hallo Leute,

ich verstehe nicht warum bei meiner T=1 peridosichen
Funktion die Autokorrelationsfunktion nicht periodisch ist.

Die Andeutungen der Parabeln sind zwar zu sehen,
aber die Peaks der 100% Übereinstimmung im Abstand T
werden nicht erreicht.

Im Anhang hab ich einen Screenshot beigefügt
wie es bei mir aussieht.
Rot ist die Autokorrelation.

und hier ist mein Code
************************************
#!/usr/bin/env octave

x1 = -1:0.1:1;
x5 = repmat(x1, 1, 5);
t = linspace(0, 5, length(x5));

for i=0:length(x5)
    clf;
    hold on;
    plot(t, x5, 'b');
    plot(t, shift(x5, -i), 'g');

    plot(t, autocor(shift(x5, -i))', 'r');

    pause(0.2);
    grid;
end

pause;

************************************

Was hab ich übersehen oder Gedankenfehler gemacht?

Grüsse, Daniel
Angehängte Dateien:
Gast
Moin Daniel,

was stört dich? Die Höhe oder der Abstand delta_t?

Ich hab mal mit ein Beispiel mit Matlab gemacht:
1
y=sin(0:.1:6*pi);
2
corr=xcorr(y,y);
3
plot(corr)

Sieht wunderbar aus. Dass die peaks nach links und rechts kleiner werden 
ist klar, das Integral wird durch die Verschiebung "kürzer" - mal ganz 
doof ausgedrückt.

pumpkin
Angehängte Dateien:
Gast
Hi,

ah wahrscheinlich hast du recht
wärne es nicht 5 Perioden sondern unendlich nach rechts und links
und würde man sich dann einen Ausschnitt betrachten, dann
wären die Peaks alle gleich hoch.

Ich könnte probieren mehr Perioden zu nehmen und die autocor
aber über ein paar wenige anschauen

Gruss, Daniel
Gast
.. und im Code

octave:6> x1=-1:0.1:1;
octave:7> x1000=repmat(x1, 1, 1000);
octave:8> xc=autocor(x1000)';
octave:9> t = linspace(0,1,length(x1)*5);
octave:10> plot(t,x1000(1:length(t)));
octave:11> hold on;
octave:12> grid
octave:13> plot(t,xc(1:length(t)),'r');
Angehängte Dateien:
Gast
wenigstens ist jetzt klarer ;)

Also im Grunde handelt es sich bei Matlab und Octave mit
den Funktionen autocor/xcor um Autokorrelation der Energiesignale.
Ausserhalb des gegebenen x Intervalles wird Funktion zu 0 angenommen
und Integral von -inf bis +inf berechnet.
Bin gerade beim Lernen und versuch die ganzen unterschiedlichen
Definitionen voneinander abzugrenzen.
Sowas wie Autokorrelation für Leistungssignale gibt's
wahrscheinlich nicht in Matlab?
Gast
Richtig! Bisher habe ich keine für Leistungssignale entdeckt (ich hab 
aber auch noch nicht danach gesucht). Kann man sich aber selbst 
schreiben, es gibt ne nette Funktion namens circshift() die ich da 
verwenden würde. Kannst du dir ja mal zu Gemüte ziehen.

pumpkin
Gast
xcorr(x1,x1) liefert übrigens auch die zyklische Autokorrelation. Für 
eine "normale" Autokorrelation muss man noch genügend (ich glaub 
length(x1)-1) 0en an jedes Signal anhängen.
Admin Persönliche Seite
xcorr macht eine normale Autokorrelation:
> x=[3 2 1];
> xcorr(x)
ans =

   3   8  14   8   3

Zyklische Autokorrelation:
> ifft(abs(fft(x)) .^ 2)
ans =

  14  11  11

Herleiten kann man sich das mit:
Faltung(x, y) = IDFT(DFT(x) * DFT(y))
Korrelation(x, y) = Faltung(x, reverse(y)) = IDFT(DFT(x) * 
DFT(reverse(y)))
Autokorrelation(x) = Faltung(x, reverse(x)) = IDFT(DFT(x) * 
DFT(reverse(x))) = IDFT(DFT(x) * conj(DFT(x))) = IDFT(abs(DFT(x)).^2)

Die autocor-Funktion arbeitet mit autocov() und ist mit etwas Vorsicht 
zu genießen:
> autocor(x)
ans =

   1.00000
   0.00000
  -0.50000

EDIT: ein reverse() vergessen
Gast
hab gerade nachgedacht, es gilt nur für x reel oder?

kleiner Fehler Andreas?
Autokorrelation(x) = Faltung(x, -x)

Aber Danke für diesen Trick!
Gruss, Daniel
Hi ...

Also bezüglich der Einhüllenden -> Rückgang der Amplitude zu den Rändern 
hin gibts 2 Möglichkeiten dies zu reduzieren:

.) biased cross correlation -> hier steigt jedoch die Varianz des 
Schätzers der Korrelation nach aussen an. (am besten einfach ausprobiern 
-> Matlab-Normalisierung)

.) frequeny based correlation -> FFT^-1(FFT(w) . *FFT(w)) fällt der 
Abfall nach aussen weg da ja eine periodische Fortsetzung angenommen 
wird.

lg Peter

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 19 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.