Поиск периодичности с помощью автокорреляции

Неопределенность измерения и шум иногда затрудняют определение колебательного поведения в сигнале, даже если такое поведение ожидается.

Автокорреляционная последовательность периодического сигнала имеет те же циклические характеристики, что и сам сигнал. Таким образом, автокорреляция может помочь проверить наличие циклов и определить их длительности.

Рассмотрим набор данных о температуре, собранных термометром внутри офисного создания. Устройство проводит чтение каждые полчаса в течение четырех месяцев. Загрузите данные и постройте график. Вычесть среднее значение, чтобы сконцентрироваться на колебаниях температуры. Преобразуйте температуру в степени Цельсия. Измерьте время в днях. Таким образом, скорость дискретизации составляет 2 измерения/час × 24 часов/день = 48 измерения/день.

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. The axes contains an object of type line.

Температура, кажется, колеблются, но длины циклов не могут быть легко считаны.

Вычислите автокорреляцию температуры так, чтобы она была единицей при нулевой задержке. Ограничьте положительные и отрицательные лаги тремя неделями. Обратите внимание на двойную периодичность сигнала.

[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. The axes contains an object of type line.

Определите короткий и длинный периоды, найдя пиковые местоположения и определив средние временные различия между ними.

Чтобы найти длинный период, ограничьте findpeaks искать peaks, разделенные больше короткого периода и с минимальной высотой 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. The axes contains 3 objects of type line. These objects represent Period: 1, Period: 7.

К очень хорошему приближению автокорреляция колеблется как ежедневно, так и еженедельно. Это стоит ожидать, так как температура в создании выше, когда люди на работе и ниже ночью и в выходные.

См. также

|

Похожие темы