Esta página aún no se ha traducido para esta versión. Puede ver la versión más reciente de esta página en inglés.

Buscar periodicidad mediante autocorrelación

La incertidumbre de medición y el ruido a veces hacen que sea difícil detectar el comportamiento oscilatolito en una señal, incluso si se espera tal comportamiento.

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

Considere un conjunto de datos de temperatura recopilados por un termómetro dentro de un edificio de oficinas. El dispositivo tarda una lectura cada media hora durante cuatro meses. Cargue los datos y estiéndalos. Restar la media para concentrarse en las fluctuaciones de temperatura. Convierte la temperatura a grados Centígrados. Mida el tiempo en días. Por lo tanto, la frecuencia de muestreo es de 2 mediciones/hora a 24 horas/día 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 se pueden leer fácilmente.

Calcular la autocorrelación de la temperatura de tal forma que sea unidad en cero desajuste. Restringir los retrasos positivos y negativos a tres semanas. Observe la doble periodicidad 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 períodos cortos y largos buscando las ubicaciones de pico y determinando las diferencias de tiempo promedio entre ellas.

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

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

Para una muy buena aproximación, la autocorrelación oscila tanto diaria como semanalmente. Esto es de esperar, ya que la temperatura en el edificio es más alta cuando las personas están en el trabajo y más baja en las noches y los fines de semana.

Consulte también

|

Temas relacionados