Here is how I collected data. There are 3 videos here showing collecting and visualization live data from the CMS 50D+ and/or the Pulse Sensor Amped.
Here is my result! I produced these plots using Python with numpy and matplotlib. The analysis supports the claim that an inexpensive and open hardware can match the performance of a commercial pulse oximeter. There is a lot of available data too.
The hardest bit so far has been trying to get 2 serial devices to synchronize within 2 milliseconds of one another. I had some success. Using 2 of the researchers pulse oximeters, and at least 7 subjects, I managed to get clean photoplethysmograms (PPG waveforms)! Over the course of the week, I also managed to synchronize 2 Pulse Sensor Amped and get at least 2 clean waveforms with the promise of more and I also synchronized one CMS D50+ pulse ox and one Pulse Sensor Amped pulse sensor and get a few clean waveforms. These data are meant to help my fellow teacher researchers in answering their questions more so than mine, but it is nice to be helpful. Best timing results for all systems (once synchronized by hand) was time resolution of ±3 m/s. This is enough to characterize a single waveform and even to find the pulse transit time.
This video compares the signal between 2 type of PPG. Read on for lots of details! This week, I have been tinkering with 3 different ways to read ones pulse. This technique is called photoplethysmography. Light is emitted into tissue with a capillary bed not far from the skin surface. One can measure how much light passes through the skin or how much light is reflected. Both type of photoplethysmography, transmissive and reflective, have pros and cons. Transmissive signals can provide information about blood oxygen content more accurately than reflective signals. But for digital signal processing (DSP) which is what I am after, they both work very well. The signal or pulse is called the photoplethysmogram or PPG. I want to display the signal in real time. Perhaps even provide some analysis of pulmonary physiological parameters such as heart rate variability or inter-beat interval. A quick search on your favorite store or search engine will show you plenty of inexpensive, reliable home pulse oximeters (finger-in, transmissive photoplethysmographs. But if the user wants access to the actual data without using a propriety software package, they are out of luck unless they find a way to crack the transmission protocol. I happen to have access to pulse-ox where the protocol has been cracked and the signal can be accessed directly. But if I want to share what I am doing with students, I feel like they should have access to the hardware and software information without fear of violating someone copyright. There are several different types of open hardware pulse sensors. Today I am going to compare a “raw” PPG to one provided by one of these open hardware sensors. I decided to use the Adafruit Circuit Playground Express as the platform for the “firmware”. This way, I can use both the on-board light sensor and the nearest LED to that sensor as one type of pulse sensor. I also added the Pulse Sensor Amped to the circuit as well. Then I plotted the PPG from both sensors on to one plot using the serial plotter in the Arduino IDE. The Pulse Sensor Amped circuit has some built-in filtering to ignore the so-called “DC” component of the signal. This low frequency signal is not useful for health purposes. The red signal has the DC component filtered out (and the AC component amplified too) whereas the blue signal which is the unfiltered signal directly from the light sensor built in the board is smaller and shows a secondary trend beyond the higher frequency pulse signal.
Over the years, I have learned lots of different computing topics. I have never implemented any digital signal processing. The computing tasks, algorithmic complexity, and data analysis components are all the kind of thing I have done before. But I don’t know very much about human physiology. This week I have learned about pulse oximeters, photoplethysmography, and human physiology related to the pulse and blood flow. Here is what I can convey: the simple method for measuring the pulse using emitted light produces a signal that is anything but simple. The data is there, but so are artifacts and sources of noise. The sheer number of environmental and physiological variables makes this task daunting, but lots of great work has been done to attempt to divine the meaning of the signal and the reduction of the noise. One of the most interesting and upsetting things is how little is known about what causes the waveform seen using photoplethysmography (PPG) and why some areas of the body exhibit bizarre effects when using the technique. You shine a light onto a body part. Then you measure either the light re-emitted (scattered) off the body part or you measure the light transmitted through the body part. Then you analyze the signal and the noise and look for patterns. Or at least display the waveform (hopefully in real-time) so someone can offer therapeutic advice. A pulse oximeter can be used for this task. So far, I have ignored the capability of this device to read blood oxygen levels. The hardest part has been getting up to speed on the biology material. The next hardest part has been diving into digital signal processing. But I feel like I have mastered these to a large enough degree to effective learn to process signal data and produce a useful GUI. Once that task is mastered, the problem will be learning to use multiple pulse oximeter devices simultaneously. ^__^
Plate 7045 from the SDSS BOSS mission. We’re doing a lab with it today to show Hubble’s Law.