Main Content

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

Figure contains an axes object. The axes object contains an object of type line.

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])

Figure contains an axes object. The axes object contains an object of type line.

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])

Figure contains an axes object. The axes object contains 3 objects of type line. These objects represent Period: 1, Period: 7.

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