如何获取此信号视频的心率?
我计算了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');
我已经尝试过了,但这仅在视频样本的心率应约为80时才计算出60的心率。
meanCycle = (mean(diff(LOCS))*((max(t-1) - min(t-1))
答案 0 :(得分:0)
对FFT输出进行计算是不正确的,因为FFT输出表示频域,即时域信号中存在哪些频率。因此,找到峰值并在FFT输出上进行计算将始终给出错误的结果。应该对时域信号(即PPG信号)进行相同的计算。
让我们看看您的PPG信号。我假设X轴的单位是秒。
前5秒有7个峰值,接下来5秒有7个峰值,接下来5秒有6个峰值,后5秒有7个峰值。
因此,在20秒内总共有27个峰值= 1.35次/秒=每分钟81次,非常接近预期结果。
希望这会有所帮助