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

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

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

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

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

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

[autocor,lags] = xcorr(tempnorm,3*7*fs,'coeff');

plot(lags/fs,autocor)
xlabel('Lag (days)')
ylabel('Autocorrelation')
axis([-21 21 -0.4 1.1])

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

Чтобы найти длительный период, ограничьте 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])

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

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

|

Похожие темы