2010-10-16 10 views
19

Ho letto alcune spiegazioni su come l'autocorrelazione può essere calcolata in modo più efficiente utilizzando il segnale di un segnale, moltiplicando la parte reale per il complesso coniugato (dominio di Fourier), quindi utilizzando l'inverso di fft, ma Ho difficoltà a realizzarlo in MATLAB perché ad un livello dettagliato, non so davvero cosa sto facendo. : o) Qualsiasi tipo di anime là fuori si preoccupa di condividere qualche codice e saggezza?Calcola autocorrelazione utilizzando FFT in MATLAB

Grazie!

+1

Is C'è qualche ragione per cui non puoi semplicemente usare la funzione di autocorrelazione esistente di MATLAB ione? (Forse a casa?) –

+0

@Paul R: 'xcorr' fa parte della toolbox di elaborazione del segnale. –

+1

@Oli: OK - Immagino che l'OP non abbia gli strumenti di elaborazione del segnale? Io uso Octave piuttosto che MATLAB e sembra avere xcorr. –

risposta

25

Proprio come lei ha dichiarato, prendere la FFT e moltiplicare puntuale con il suo complesso coniugato, quindi utilizzare la FFT inversa (o, nel caso di cross-correlazione di due segnali: 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 realtà, se si guarda il codice di xcorr.m, che è esattamente quello che sta facendo (solo deve fare i conti con tutti i casi di imbottitura, normalizzazione, vettore/ingresso a matrice, ecc ...)

+0

spot on. grazie mille! – skj

+1

Invece di prendere il coniugato complesso, è possibile anche invertire un segnale e quindi eseguire la FFT di quello. Uno potrebbe essere più facile dell'altro, a seconda del programma. – endolith

+0

perché è necessario eseguire il pad su '2^nextpow2 (2 * len-1)' e non '2^nextpow2 (len)'? – Marius

23

A Wiener–Khinchin theorem, la densità di potenza spettrale (PSD) di una funzione è la trasformata di Fourier dell'autocorrelazione. Per i segnali deterministici, il PSD è semplicemente la magnitudo al quadrato della trasformata di Fourier. Vedi anche lo convolution theorem.

Quando si tratta di trasformate di Fourier discreta (cioè utilizzando FFT), si ottiene effettivamente l'autocorrelazione ciclica. Per ottenere una corretta autocorrelazione (lineare), prima di prendere la trasformata di Fourier è necessario azzerare i dati originali al doppio della loro lunghezza originale. Quindi, qualcosa di simile a:

x = [ ... ]; 
x_pad = [x zeros(size(x))]; 
X  = fft(x_pad); 
X_psd = abs(X).^2; 
r_xx = ifft(X_psd);