Saltar al contenido

Calcule la autocorrelación usando FFT en Matlab

La guía paso a paso o código que encontrarás en este post es la resolución más rápida y efectiva que encontramos a tu duda o dilema.

Según el teorema de Wiener-Khinchin, la densidad espectral de potencia (PSD) de una función es la transformada de Fourier de la autocorrelación. Para señales deterministas, la PSD es simplemente la magnitud al cuadrado de la transformada de Fourier. Véase también el teorema de convolución.

Cuando se trata de transformadas discretas de Fourier (es decir, usando FFT), en realidad se obtiene la autocorrelación cíclica. Para obtener una autocorrelación (lineal) adecuada, debe rellenar con ceros los datos originales al doble de su longitud original antes de realizar la transformada de Fourier. Entonces algo como:

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

Tal como lo indicó, tome el fft y multiplíquelo puntualmente por su conjugado complejo, luego use el fft inverso (o en el caso de correlación cruzada de dos señales: 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 )

De hecho, si miras el código de xcorr.meso es exactamente lo que está haciendo (solo que tiene que lidiar con todos los casos de relleno, normalización, entrada de vector/matriz, etc.)

Puedes favorecer nuestro análisis mostrando un comentario o valorándolo te lo agradecemos.

¡Haz clic para puntuar esta entrada!
(Votos: 2 Promedio: 4)


Tags :

Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *