Frage

Ich habe einige Erklärungen, wie Autokorrelation mehr lesen kann effizient die fft eines Signals berechnet, den Realteil mit dem konjugiert komplexen (Fourier-Domäne) multipliziert wird, dann die inverse fft, aber ich habe Probleme bei der Realisierung dies in Matlab, weil auf einer detaillierten Ebene.

War es hilfreich?

Lösung

Wie Sie erwähnen, nehmen Sie die fft und mehrfach punktuell durch seine komplexe Konjugat, verwenden Sie dann die inverse fft (oder im Fall von Kreuzkorrelation von zwei Signalen: Corr(x,y) <=> FFT(x)FFT(y)*)

x = rand(100,1);
len = length(x);

%# autocorrelation
nfft = 2^nextpow2(2*len-1);
r = ifft( fft(x,nfft) .* conj(fft(x,nfft)) );

%# rearrange and keep values corresponding to lags: -(len-1):+(len-1)
r = [r(end-len+2:end) ; r(1:len)];

%# compare with MATLAB's XCORR output
all( (xcorr(x)-r) < 1e-10 )

In der Tat, wenn man sich den Code der xcorr.m aussehen, das ist genau das, was es tut (nur hat es mit all den Fällen der Polsterung, Normalisieren, Vektor / Matrix-Eingangs, etc ... behandeln)

Andere Tipps

Mit der Wiener-Khinchin Satz , die Power-Spektraldichte (PSD) einem Funktion ist die Fourier-Transformation der Autokorrelations. Für deterministische Signale ist die PSD einfach die-Größe zum Quadrat der Fourier-Transformation. Siehe auch die Faltungstheorem .

Wenn es um die diskreten Fourier-Transformationen kommt (das heißt unter Verwendung von FFTs), erhalten Sie tatsächlich die zyklische Autokorrelation. Um eine ordnungsgemäße (linear) Autokorrelation zu erhalten, müssen Sie die Originaldaten auf das Doppelte seiner ursprünglichen Länge vor der Einnahme der Fourier-Transformations-Null-Pad. So etwas wie:

x = [ ... ];
x_pad = [x zeros(size(x))];
X     = fft(x_pad);
X_psd = abs(X).^2;
r_xx = ifft(X_psd);
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top