Найдите периодичность Используя автокорреляцию

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

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

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

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

Смотрите также

|

Похожие темы

Для просмотра документации необходимо авторизоваться на сайте