CV-Project-1-BUSSIERE-BEAUD/octave/PPG.m

36 lines
1.4 KiB
Matlab

% First we have to extract the values of red(R), green(G) and blue(B) from the txt file.
fileID = fopen("listRGB.txt"); % Opening the txt file
M = textscan(fileID, "[[%f, %f, %f]]"); % Extracting the values
fclose(fileID); % Closing the file
R = M{1};
G = M{2};
B = M{3};
% Then we normalize the different RGB vectors but substracting the mean value and divide by the standard deviation.
Normal_R = (R - mean(R)) ./ std(R);
Normal_G = (G - mean(G)) ./ std(G);
Normal_B = (B - mean(B)) ./ std(B);
% We now use the fastICA functions in order to obtain 3 channels of 450 samples each.
[icasig, A, W] = fastica([Normal_R'; Normal_G'; Normal_B']);
% Here we compute the magnitude of the fast Fourrier's transform.
PPG_spectrum_R = abs(fft(Normal_R));
PPG_spectrum_G = abs(fft(Normal_G));
PPG_spectrum_B = abs(fft(Normal_B));
% This line of code is for computing the frequency of each samples.
f = [0:450]./450*15;
% Then we find the maximum of each channels and by knowing the index of it, we find the corresponding frequency.
[value_R, idx_R] = max(PPG_spectrum_R);
heart_rate_freq_R = f(idx_R);
[value_G, idx_G] = max(PPG_spectrum_G);
heart_rate_freq_G = f(idx_G);
[value_B, idx_B] = max(PPG_spectrum_B);
heart_rate_freq_B = f(idx_B);
% Finally, we display the BPM by multiplying the frequency by 60 and find the maximum of each channels.
disp(max([heart_rate_freq_R*60,heart_rate_freq_G*60,heart_rate_freq_B*60]))