Измерение частоты сердечных сокращений - PullRequest
0 голосов
/ 02 июня 2019

Как я могу получить частоту сердечных сокращений этого видео сигнала?

Я рассчитал БПФ и нашел пики.

file = 'Chel.mp4';
vidObj = VideoReader(file);
display('%%%%%%%%%%%%%%%%%%%%');
disp(file);
display('Carga Video');
vidFrame = vidObj.FrameRate;
vidW = vidObj.Width;
vidH = vidObj.Height;
k = 1;
data = [];
t = [];
while hasFrame(vidObj)
    frame = readFrame(vidObj);
    t(k) = vidObj.CurrentTime;
    d1 = double(squeeze(frame(:,:,1)));
    d2 = double(squeeze(frame(:,:,2)));
    d3 = double(squeeze(frame(:,:,3)));
    data(:,:,k) = d1.^2+d2.^2+d3.^2;
    k = k+1;
end
NumFrame = k-1;
display('Proceso Completado !!');
display(['Numero de Cuadros =' num2str(NumFrame)]);
display(['Dimensiones por cuadro ' num2str(vidW) 'x' num2str(vidH)]);
display(['Cuadros por segundo =' num2str(vidFrame)]);
Y = reshape(data,vidW*vidH,NumFrame);
ym = mean(Y,1);
PPG = ym-mean(ym);
figure(1)
plot(t,PPG,'LineWidth',2); grid on; xlabel('Tiempo (seg)'); ylabel('PPG');

%%
devPPG = (fft(PPG));
dev2PPG = abs(devPPG.^2);
figure(2)
plot(dev2PPG)
[PKS,LOCS] = findpeaks(dev2PPG);
plot(t,dev2PPG,'b-',t(LOCS),dev2PPG(LOCS),'ro','LineWidth',2); 
grid on;
xlabel('Tiempo (seg)'); 
ylabel('PPG');

График видео:
Graph Video

График пиков fft:
peaks fft

Я пробовал это, но это вычисляет только частоту сердечных сокращений 60, когда частота сердечных сокращенийобразца видео должно быть примерно 80.

meanCycle = (mean(diff(LOCS))*((max(t-1) - min(t-1))

1 Ответ

0 голосов
/ 05 июня 2019

Неправильно выполнять вычисления на выходе FFT, потому что выход FFT представляет частотную область, то есть какие частоты присутствуют в сигнале временной области.Таким образом, поиск пиков и выполнение расчетов на выходе БПФ всегда будут давать неверные результаты.Те же расчеты следует скорее сделать для сигнала временной области, то есть для сигнала PPG.

Давайте посмотрим на ваш сигнал PPG.Я предполагаю, что единица измерения по оси X равна секундам.

Первые 5 секунд имеют 7 пиков, следующие 5 секунд имеют 7 пиков, следующие 5 секунд имеют 6 пиков, а последние 5 секунд имеют 7 пиков.

Итак, всего 27 пиков за 20 секунд = 1,35 ударов в секунду = 81 ударов в минуту, что очень близко к ожидаемым результатам.

Надеюсь, это поможет

...