PhysioNet Cardiovascular Signal Toolbox 1.0.0
(2,373 bytes)
PPGSQI
ToDo:
Run call.m to test the algorithm.
Note: Make sure you can access the MIMIC database when run the example (http://physionet.org/physiobank/database/mimicdb/)
It will read the 039/039 waveform data and 039.wpleth or 039.ple annotation
and create the PPGSQI annotation named 039.wplesqi
Make sure you have 'The WFDB Toolbox for Matlab' installed
see: http://www.physionet.org/physiotools/matlab/wfdb-swig-matlab/
Algorithm description:
* Build Template:
o Select 30s PPG data, do cross-correlation (xcorr) and let the length of the template (L) equals to the length between the two main peaks in the cross correlation sequence
o Average the 30s beats, each beat beginning at the fiducial mark and ending at the length of the template (length L), get Template1 (T1).
o With T1, calculate the correlation coefficients (corrcoef) with each beat (length L) in the 30s window, C, drop any with C<0.8, average, get Template2 (T2). If more than half were dropped, un-believe T2.
o If T2 valid, using T2; else but T1 valid, using T1; else, template invalid.
* Get the PPG SQI based on the template matching and clipping detection:
o Template matching:
+ Direct matching: select each beat (length L) and calculate C with template, -> SQI1
+ Linear resampling: interpolate each beat (length Li) to length L, calculate C, -> SQI2
+ Dynamic Time Warping:
# Transform template and each beat (length Li) to a sequence of lines using piecewise linear approximation(PLA)
# Acquire distance matrix based on the absolute difference between the slopes of lines
# DTW algorithm to find the minimal distance to wrap the beat (length Li) to template (length L)
# Calculate C, -> SQI3
o Clipping detection: detect the percentage (P) of saturation to maximum and minimum of each beat -> SQI4 = 1-P
o Combine SQI1-SQI4, make decision
* PPG SQI type: E: excellent beat
A: acceptable beat
Q: unacceptable beat
* You can use wabp_pleth to detect PPG beat and crate annotation file 039.wpleth by:
./wabp_pleth -r 039/039 -t 1:0:0
Or: run call_buf.m to test the algorithm without read and write WFDB annotation file.