PATHS-UP & Expeditions in Computing RET 2018
Thursday June 14th 2018
Open or Proprietary?
Current question: how can I use open hardware and open software to access the PPG of a person and also analyze and display that data in a useful way?
Someone reverse engineered the firmware for the off-the-shelf pulse oximeter. This means the intellectual property of this company was violated.
What if there was open hardware and code that did (mostly) the same thing?
PulseSensor Amped vs CSM50D+
Hardware and software can be open or closed
Off the shelf - CMS50D+
Open - PulseSensor Amped
On the Analysis of Fingertip
Photoplethysmogram Signals
Photoplethysmography- Introduction
Principle of PPG
How is PPG obtained?
PPG waveform
Anacrotic phase: Rising edge(systole)
Catacrotic phase: Falling edge (diastole)
Dicrotic notch: Usually seen in the catacrotic phase for subjects with healthy arteries.
Parameters measured using PPG signal
1. Systolic Amplitude:
It is an indicator of the pulsatile changes(periodic variations) in blood volume caused by arterial blood flow around the measurement site.
2.) Pulse width: If we consider the pulse width at the half height of the systolic peak, it correlates with the systemic vascular resistance (used in calculations of blood pressure, blood flow, and cardiac function) better than the Systolic amplitude.
3.) Pulse Area: The pulse area is measured as the total area under the PPG curve.
Dividing pulse area into two areas at the dicrotic notch, we get Inflection Point Area Ratio (IPA)the ratio is an indicator of total peripheral resistance. (the resistance of the arteries to blood flow. As the arteries constrict, the resistance increases and as they dilate, resistance decreases.
Peak to Peak Interval is the distance between two consecutive systolic peaks. It represents a completed heart cycle. The Pulse Interval is, on the other hand, the distance between the beginning and the end of the PPG waveform. The Pulse Interval is used when the diastolic peaks are easier to detect than the systolic peaks
The Augmentation Index (AI) and the Reflection Index (RI) are both measures of the contribution made by the wave reflection to the systolic pressure. They are indicators of stiffness of the arterial wall.
Different authors have defined them as some form of ratio between the amplitude of the diastolic pressure and the amplitude of the diastolic pressure.
The shape of the waveform changes with age, due in part to an increase in artery wall stiffness.
Pulse Transit Time (PTT) can also be calculated from the PPG waveforms. Its calculation requires two signals taken simultaneously at different places in the body of the same individual (ear lobe and toe, for example.). To compare the signals, we must find the time for the peaks of the 1st waveform (t11, t12, t13…) and time for the the peaks of the 2nd waveform (t21, t22, t23…) The time delay between the peaks in the two signals is the PPT. The PPT has a correlation to Arterial Stiffness.
Peak-to-peak time differential is the difference between the time stamp for peaks. To calculate it, one must find the peak time stamp and find the difference in time between consecutive peaks. T = [t2-t1, t3-t2, t4-t3].
PPG Waveform Signal Analysis
The PPG Waveform
The pulse waveform is to be filtered and processed for critical points
Critical points
In this example, a simple three point smoothing is applied. Critical points are marked green. The data has been normalized to 0-1, but has not been filtered for artifacts.
Standard Python libraries are used
Determine Critical Point
Peaks and troughs are identified by changes in sign of the slope. It is assumed that the data is well filtered.
Potential interbeat feature, i.e. shoulders, that are not visible as change in slope are identified as runs of nearly zero slope in the data.
Select a waveform
The next step is to select a waveform and identify the relevant critical points.
The points can then be used to calculate values such as IBI and amplitude
Current Python framework
Currently I have two class, PPGWave and PulseWave to load data, filter the wave form, and present a set of methods to the user.
The PGWave class is intended to analyze the entire signal.
The PulseWave class will identify a single wave form and identify common values. These values will be exposed to those who create an instance of the class.
class PulseWave(object):
…
def getPWBegin(self):
return self.PWF[self.PWData][self.getPWBegin]
def getPWSystolicP(self):
return self.PWF[self.PWData][self.PWPWSystolicP]
def getPWDicroticNotch(self):
return self.PWF[self.PWData][self.PWDicroticNotch]
...
def getRiseTime(self):
return self.PWF[self.PWTime][self.PWSystolicP]-self.PWF[self.PWTime][self.PWBegin]
def getPWDuration(self):
return self.PWF[self.PWTime][self.PWEnd]-self.PWF[self.PWTime][self.PWBegin]
def getPWPropTime(self):
return self.PWF[self.PWTime][self.PWDiastolicPeak]-self.PWF[self
Near Term
Coding Corner
Findings