Examining WHM with Pulse Oximetry

I’ve gone full-scientist now!  I went ahead and purchased a CMS 50D+ pulse oximeter from Amazon, based on the fact that I found a python script online for pulling the data off of it in real-time via a USB cable, in Linux.


CMS 50D+ Pulse Oximeter: $36

I desperately searched for a pulse oximeter that also had temperature monitoring, since it seems like it would be trivial for a manufacturer to include it.  Unfortunately, all I could find was medical equipment costing hundreds of dollars, or questionable devices from AliBaba requiring you to purchase 10-100 units in bulk.



Hooked up during WHM meditation

So instead, I have to stick with two separate measurement devices, and I merged the two scripts into a single tracking program.   I copied the relevant parts of the temper.py script for TEMPer1 probe, into the event loop in the glexox.py UI script for reading the CMS 50D+.  The result generated a CSV file with the following information every five seconds

  • Current time
  • Blood-oxygen saturation (%SpO2) from CMS 50D+
  • Heart rate (bpm) from CMS 50D+
  • Fingertip temperature from TEMPer1 probe
  • The number of key-presses in the last five seconds

The reason for the key-press tracking is so that I could signal to the app when I had started each phase of the breathing cycle, and I didn’t have to move or open my eyes to figure out what keys to press.  This was critical for aligning the measurements with the meditation sequence.   I used the following convention for key presses:

  • 1 key press:  Start of cycle, initiate WHM breathing
  • 2 key presses:  Exhale and retain
  • 3 key presses:  Inhale and retain (ideally 15-45 sec)
  • 4 key presses:  End of cycle, resume normal breathing
  • In general, I wait 5-10 seconds between the end of one cycle and starting the next

Admittedly, this mishmash of tech was crude and error-prone.  The CMS 50D+ would get tripped up if my finger moved around too much in the clamp, and I occasionally hit more keys than I meant to, or straddled a 5-second sampling period.  Luckily, the cycles are very predictable, and it was easy to identify the errors and manually post-process the CSV.   For instance, sometimes %SpO2 and heart rate would drop to zero, but just for a couple samples which could be deleted without consequence.  Occasionally, temperature would report 312.9 deg F, which I treat as a missing data point and interpolate.  Key presses are pretty infrequent and predictable, so I can confidently correct any inconsistencies.

Once the CSV file was manually polished, I create a matplotlib script that reads the CSV file and plots everything for you.  It even calculates the retention times based on the key-press events.   High-tech!

First Trial – Success!


First trial collecting oxygen levels, finger temperature, and pulse, over four rounds of WHM

Timings (min:sec):

  • Round 1
    • Breathing time: 1:28
    • Exhale Retention time: 1:44
    • Inhale Retention time: 0:39
  • Round 2
    • Breathing time: 3:05
    • Exhale Retention time: 2:07
    • Inhale Retention time: 0:35*
  • Round 3
    • Breathing time: 2:00*
    • Exhale Retention time: 2:09
    • Inhale Retention time: 0:44
  • Round 4
    • Breathing time: 2:19
    • Exhale Retention time: 2:11
    • Inhale Retention time: 1:18
*This chart reflects an error in the data which I’ve approximately corrected in the timings table: it appears that I hit key press for the start of round three breathing like 1:30 late, so the chart shows a super long inhale retention and super short Rd3 breathing time.  Based on the other measurements, I would guess that Rd2-inhale was 0:35 and Rd3-breathing about 2:00, both of which are more typical (In the chart, move the Rd3 solid green line to the left about 1m30s)


There’s a lot to digest here, so I’ll explain just a few key observations and perhaps that will provide enough context to interpret the rest of the chart.

As seen in the other previous charts, fingertip temperature was decreasing the whole time.  This chart stops after the four rounds, and doesn’t show the subsequent rise when I switch to adrenaline focus.  This time, temperature is the least interesting part of data.

Percent of blood-oxygen saturation (%SpO2) should be 95-99% for a healthy person, and should only decrease when exercising or holding your breath.  What’s interesting in this chart is the fact that the oximeter measures my %SpO2 dropping rapidly about 1:45 into exhale retention, and it continues dropping for 20-30 seconds even after I inhale. It seems that it has lag with respect to my breathing patterns.  My hypothesis is that the chemistry is happening faster than that at the lungs and heart, but it takes time for that blood to reach (and be measured) at the fingertip.

Finally, the pulse rates seem to spike 90-105 bpm during the heavy breathing, and then drops steadily towards 70 bpm over the course of exhale retention.  The time this takes is probably related to the depth of focus and relaxation, as it occurs faster in each cycle.  In all cases, there is a quick spike of 5-10 bpm when I inhale, and then returns to around 70.  Perhaps this spike is the heart kicking into high gear for a few seconds to help more oxygen from the lungs get absorbed.

Up Next…

So far I haven’t even talked about the subjective components of the experience!   I will reserve my next WHM post to talk a bit about the human element of the training while I collect more data.  Also, I have to write a post about my new 3D printer!



Here is another chart from a couple days later, and this time I figured out how to draw the text labels directly in matplotlib:


The only thing different compared to my other sessions is that I finished the session without exhale retention, only inhale retention after heavy breathing.  I quite comfortably made it to 3:35 holding my breath!  Sometimes I finish with this as I personally enjoy the inhale retention phase, and don’t feel like I get enough of it during the regular WHM rounds.

Also, the pulse oximeter seems to have stopped reading for exactly the 2 minutes of breathing in round 3.  I’ve measured a lot of sessions by now, and this is freezing seems to occur frequently but only for precisely the heavy breathing periods, never during any other phase.

One other notable difference (not shown in the chart) is that I wholly failed to raise my fingertip temperature even after 20 minutes of focus afterwards.  For some reason this has become increasingly harder, despite the fact that my cold showers are still getting easier.






4 thoughts on “Examining WHM with Pulse Oximetry

  1. Loving your blog, I was thinking on measuring Oxygen saturation now that I’m using the WHM, it was great to see that somebody had done it.

    I do not have your programming skills, but will definitely use Oximeter to track results


  2. nice to see some statistical data on this, i’ve wached Wim’s Oximeter video and other blogs, but you’ve given some good visual readings on this blog.


    • If you’re walking around all day with SpO2 below 95% that’s a major problem, and <90% is a medical emergency. But that's for "resting" SpO2, which would indicate that you have serious medical problems and your brain regularly isn't getting enough oxygen. In this case, the SpO2 drops only for few moments at the end of holding your breath. As long as your SpO2 recovers to above the 95% threshold between breaths, there is (probably!) no problem. I say "probably," because I know divers who do competitive breath holding have experienced problems, but they tend to push the limits way more than WHMers.

      But yeah, this is actually why people pass out if they push too hard — their brain gets too deprived of oxygen and goes into a backup mode where it uses its remaining energy keeping you alive, not keeping you conscious.

      Ref: https://www.who.int/patientsafety/safesurgery/pulse_oximetry/who_ps_pulse_oxymetry_training_manual_en.pdf


Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s