Обработайте сигнал с Недостающими выборками

Рассмотрите вес человека, как зарегистрировано (в фунтах) в течение високосного года 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

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

|

Похожие темы