tiempo - transformada de fourier matlab pdf
Calcular autocorrelaciĆ³n usando FFT en matlab (2)
He leído algunas explicaciones de cómo la autocorrelación se puede calcular de manera más eficiente usando la fft de una señal, multiplicando la parte real por el complejo conjugado (dominio de Fourier), luego usando la función inversa, pero estoy teniendo problemas para darme cuenta de esto en matlab porque en un nivel detallado, realmente no sé lo que estoy haciendo. : o) ¿Alguna alma amable por ahí se preocupa por compartir algún código y sabiduría?
¡Gracias!
Como dijiste, toma el fft y multiplícalo puntualmente por su complejo conjugado, luego usa el fft inverso (o en el caso de la 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.m
, eso es exactamente lo que está haciendo (solo tiene que lidiar con todos los casos de relleno, normalización, entrada de vector / matriz, etc.)
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 las señales deterministas, el PSD es simplemente la magnitud cuadrada de la transformada de Fourier. Ver también el teorema de convolución .
Cuando se trata de transformaciones discretas de Fourier (es decir, utilizando FFT), en realidad obtienes la autocorrelación cíclica. Para obtener una autocorrelación (lineal) adecuada, debe rellenar con cero los datos originales al doble de su longitud original antes de tomar la transformada de Fourier. Entonces algo así como:
x = [ ... ];
x_pad = [x zeros(size(x))];
X = fft(x_pad);
X_psd = abs(X).^2;
r_xx = ifft(X_psd);