测量心率

时间:2019-06-02 07:39:56

标签: matlab signal-processing video-processing heartrate

如何获取此信号视频的心率?

我计算了fft并找到了峰值。

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

我已经尝试过了,但这仅在视频样本的心率应约为80时才计算出60的心率。

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

1 个答案:

答案 0 :(得分:0)

对FFT输出进行计算是不正确的,因为FFT输出表示频域,即时域信号中存在哪些频率。因此,找到峰值并在FFT输出上进行计算将始终给出错误的结果。应该对时域信号(即PPG信号)进行相同的计算。

让我们看看您的PPG信号。我假设X轴的单位是秒。

前5秒有7个峰值,接下来5秒有7个峰值,接下来5秒有6个峰值,后5秒有7个峰值。

因此,在20秒内总共有27个峰值= 1.35次/秒=每分钟81次,非常接近预期结果。

希望这会有所帮助