exponenta event banner

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

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

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

Рассмотрим набор данных о температуре, собранных термометром внутри офисного здания. Устройство считывает каждые полчаса в течение четырех месяцев. Загрузите данные и постройте их график. Вычитайте среднее значение, чтобы сконцентрироваться на колебаниях температуры. Преобразуйте температуру в градусы Цельсия. Измерьте время в днях. Таким образом, частота выборки составляет 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 искать пики, разделенные более коротким периодом и с минимальной высотой 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.

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

См. также

|

Связанные темы