Рассмотрите вес человека, как зарегистрировано (в фунтах) в течение високосного года 2012. Человек не записывал их вес каждый день. Требуется изучить периодичность сигнала, но прежде чем можно будет сделать так, необходимо заботиться о недостающих данных.
Загрузите данные и преобразуйте измерения в килограммы. Пропущенные показания установлены в NaN
. Определите, сколько сути упускает.
load(fullfile(matlabroot,'examples','signal','weight2012.dat')) wgt = weight2012(:,2)/2.20462; daynum = 1:length(wgt); missing = isnan(wgt); fprintf('Missing %d samples of %d\n',sum(missing),max(daynum))
Missing 27 samples of 366
Присвойте значения недостающим точкам с помощью resample
. По умолчанию, resample
делает оценки с помощью линейной интерполяции. Постройте исходные и интерполированные показания. Увеличьте масштаб дней 200 - 250, которые содержат приблизительно половину недостающих точек.
wgt_orig = wgt; wgt = resample(wgt,daynum); plot(daynum,wgt_orig,'.-',daynum,wgt,'o') xlabel('Day') ylabel('Weight (kg)') axis([200 250 73 77]) legend('Original','Interpolated') grid
Определите, является ли сигнал периодическим путем анализа его в частотном диапазоне. Найдите длительность цикла, измерив время в неделях. Вычтите среднее значение, чтобы сконцентрироваться на колебаниях.
Fs = 7;
[p,f] = pwelch(wgt-mean(wgt),[],[],[],Fs);
plot(f,p)
xlabel('Frequency (week^{-1})')
grid
Заметьте, как вес человека колеблется еженедельно. Из недели в неделю существует ли значимый шаблон? Устраните прошлые два дня года, чтобы получить 52 недели. Переупорядочьте измерения согласно дню недели.
wgd = reshape(wgt(1:7*52),[7 52]); plot(wgd') xlabel('Week') ylabel('Weight (kg)') q = legend(datestr(datenum(2012,1,1:7),'dddd')); q.Location = 'NorthWest'; grid
Сгладьте колебания с помощью фильтра, который соответствует полиномам младшего разряда к подмножествам данных. А именно, установите его соответствовать кубическим полиномам к наборам семи дней.
wgs = sgolayfilt(wgd',3,7); plot(wgs) xlabel('Week') ylabel('Weight (kg)') title('Smoothed Weight Fluctuations') q = legend(datestr(datenum(2012,1,1:7),'dddd')); q.Location = 'SouthEast'; grid
Этот человек склонен есть больше, и таким образом весить больше, в течение выходных. Проверьте путем вычисления среднесуточных значений.
for jk = 1:7 fprintf('%3s mean: %5.1f kg\n', ... datestr(datenum(2012,1,jk),'ddd')',mean(wgd(jk,:))) end
Sun mean: 76.2 kg Mon mean: 75.7 kg Tue mean: 75.2 kg Wed mean: 74.9 kg Thu mean: 75.1 kg Fri mean: 75.3 kg Sat mean: 75.8 kg