이 페이지의 최신 내용은 아직 번역되지 않았습니다. 최신 내용은 영문으로 볼 수 있습니다.

자기상관을 사용하여 주기성 찾기

측정값이 불확실하고 잡음이 있는 경우 진동 동작이 예상되는 경우에도 신호에서 이러한 동작을 포착하기가 어려워집니다.

주기 신호의 자기상관 시퀀스는 신호 자체와 동일한 주기적 특성을 가집니다. 따라서, 자기상관을 사용하면 주기가 존재하는지를 확인하고 이러한 주기의 길이를 확인하는 데 도움이 될 수 있습니다.

사무실 건물 내부에 있는 온도계로 수집된 온도 데이터 세트가 있다고 가정해 보겠습니다. 이 기기는 4개월 동안 30분 간격으로 측정을 수행합니다. 데이터를 불러오고 플로팅합니다. 평균값을 빼서 온도 변동 부분에 집중합니다. 온도를 섭씨로 변환합니다. 시간은 일 단위로 측정되었습니다. 따라서 샘플 레이트는 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

온도가 진동하는 것처럼 보이기는 하지만, 주기 길이를 쉽게 파악할 수는 없습니다.

영차 지연에서 단위 값을 가지도록 온도의 자기상관을 계산합니다. 양의 지연과 음의 지연을 3주로 제한합니다. 신호의 주기성이 양쪽으로 표시됩니다.

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

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

피크 위치를 찾고 피크 위치 사이의 평균 시간 차분을 확인하여 짧은 주기와 긴 주기를 확인합니다.

긴 주기를 구하려면 짧은 주기보다 길고 최소 길이가 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])

아주 적절한 근삿값인 경우, 자기상관이 일별은 물론, 주별로도 진동합니다. 건물 내 온도는 사람들이 근무할 때 더 높고, 야간과 주말에는 더 낮으므로 이는 예상된 결과입니다.

참고 항목

|

관련 항목