Main Content

La traducción de esta página aún no se ha actualizado a la versión más reciente. Haga clic aquí para ver la última versión en inglés.

Encontrar periodicidad utilizando la autocorrelación

La incertidumbre de la medición y el ruido pueden dificultar a veces la detección del comportamiento oscilatorio en una señal, aunque dicho comportamiento sea de esperar.

La secuencia de autocorrelación de una señal periódica presenta las mismas características cíclicas que la propia señal. Así, la autocorrelación puede ayudar a verificar la presencia de ciclos y determinar sus duraciones.

Piense en un conjunto de datos de temperatura recopilados por un termómetro dentro de un edificio de oficinas. El dispositivo hace una lectura cada media hora durante cuatro meses. Cargue los datos y represéntelos. Elimine la media para concentrarse en las fluctuaciones de temperatura. Convierta la temperatura a grados Celsius. Mida el tiempo en días. Así, la tasa de muestreo es de 2 mediciones/hora × 24 horas/día = 48 mediciones/día.

load officetemp

tempC = (temp-32)*5/9;

tempnorm = tempC-mean(tempC);

fs = 2*24;
t = (0:length(tempnorm) - 1)/fs;

plot(t,tempnorm)
xlabel('Time (days)')
ylabel('Temperature ( {}^\circC )')
axis tight

La temperatura parece oscilar, pero las longitudes de los ciclos no pueden leerse con facilidad.

Calcule la autocorrelación de la temperatura de forma que sea unitaria cuando el retardo es cero. Restrinja los desfases positivos y negativos a tres semanas. Observe la periodicidad doble de la señal.

[autocor,lags] = xcorr(tempnorm,3*7*fs,'coeff');

plot(lags/fs,autocor)
xlabel('Lag (days)')
ylabel('Autocorrelation')
axis([-21 21 -0.4 1.1])

Determine los periodos corto y largo buscando las ubicaciones de los picos y determinando las diferencias promedio de tiempo entre ellas.

Para encontrar el periodo largo, restrinja findpeaks para buscar picos separados por más del periodo corto y con una altura mínima de 0,3.

[pksh,lcsh] = findpeaks(autocor);
short = mean(diff(lcsh))/fs
short = 1.0021
[pklg,lclg] = findpeaks(autocor, ...
    'MinPeakDistance',ceil(short)*fs,'MinPeakheight',0.3);
long = mean(diff(lclg))/fs
long = 6.9896
hold on
pks = plot(lags(lcsh)/fs,pksh,'or', ...
    lags(lclg)/fs,pklg+0.05,'vk');
hold off
legend(pks,[repmat('Period: ',[2 1]) num2str([short;long],0)])
axis([-21 21 -0.4 1.1])

De forma muy aproximada, la autocorrelación oscila tanto diaria como semanalmente. Esto es de esperar, ya que la temperatura en el edificio sube cuando las personas están trabajando y baja por las noches y los fines de semana.

Consulte también

|

Temas relacionados