My wife was recently reviewing some [pulse oxymeter][pox] notes while working a round of anesthesia. It took us a while to trace the logic through all the symbol changes and notation shifts, and my wife's math-discomfort and my bio-discomfort made us more cautious than it turns out we needed to be. There are a number of nice [review articles][art] out there that I turned up while looking for explicit derivations, but by the time I'd found them, my working notes had gotten fairly well polished themselves. So here's my contribution to the pulse-ox noise ;). Highlights include: * Short and sweet (with pictures) * [Symbols table](#nomenclature) * Baby steps during math manipulation Oxygen content ============== The circulatory system distributes oxygen ([O₂](#O2)) throughout the body. The amount of O₂ at any given point is measured by the O₂ content ([O₂]), usually given in $\frac{\text{mL O₂ at BTP}}{\text{dL blood}}$ ([BTP](#BTP) is my acronym for body temperature and pressure). Most transported O₂ is bound to [hemoglobin][] ([Hb](#Hb)), but there is also free O₂ disolved directly in the plasma and cytoplasm of suspended cells. \[ [\text{O₂}] = a\text{[Hb]}\text{S}_\text{O₂} + b\text{P}_\text{O₂} \;, \] where [$\text{S}_\text{O₂}$](#S-O2) is the Hb's O₂ saturation and [$\text{P}_\text{O₂}$](#P-O2) is the O₂ partial pressure. Don't worry about the coefficients $a$ and $b$ yet, we'll get back to them in a second. The amound of dissolved O₂ is given by its [partial pressure][partial] ($\text{P}_\text{O₂}$). Partial pressures are generally given in mm of mercury ([Hg](#Hg)) at standard temperature and pressure ([STP](#STP)). Because the partial pressure changes as blood flows through the body, an additional specifier $i$ may be added ([$\text{P}i_\text{O₂}$](#Pi-O2)) to clarify the measurement location.
$i$Full symbolLocation descriptor
a$\text{Pa}_\text{O₂}$ arterial
p$\text{Pp}_\text{O₂}$ peripheral or pulsatile
t$\text{Pt}_\text{O₂}$ tissue
v$\text{Pv}_\text{O₂}$ venous
O₂ is carried in the blood primarily through binding to hemoglobin monomers (Hb), with each monomer potentially binding a single O₂. Oxygen saturation ($\text{S}_\text{O₂}$) is the fraction of hemoglobin monomers (Hb) that have bound an oxygen molecule (O₂). \[ \text{S}_\text{O₂} = \frac{\text{[HbO₂]}}{\text{[Hb]}} \;. \] The ratio of concentrations, $\text{S}_\text{O₂}$, is unitless. It is often expressed as a percentage. [Hb] is often given in g/dL. As with partial pressures, an additional specifier $i$ may be added ([$\text{S}i_\text{O₂}$](#Si-O2)) to clarify the measurement location ($\text{Sa}_\text{O₂}$, $\text{Sp}_\text{O₂}$, …). Now we can take a second look at our [O₂ content formula](#eq:O2-symbolic). The coefficient $a$ must convert g/dL to $\frac{\text{mL O₂ at BTP}}{\text{dL blood}}$. Using the molecular weight of Hb and the [volume of a mole of gas at STP][mole-volume]: \[ \begin{aligned} \text{[Hb]} &= \chi \frac{\text{g Hb}}{\text{dL blood}} \cdot\frac{1\text{ mol Hb}}{17\text{ kg Hb}} \cdot\frac{1\text{ mol O₂}}{1\text{ mol Hb}} \cdot\frac{\sim1\text{ mol ideal gas}}{1\text{ mol O₂}} \cdot\frac{22.4\text{ L ideal gas at STP}}{1\text{ mol ideal gas}} \cdot\frac{\sim1\text{ L ideal gas at BTP}}{1\text{ L ideal gas at STP}} \\ &\approx \chi \frac{\text{g Hb}}{\text{dL blood}} \cdot 1.32 \frac{\text{mL O₂ at BTP}}{\text{g Hb}} = 1.32\chi \frac{\text{mL O₂ at BTP}}{\text{dL blood}} \;, \end{aligned} \] where $\chi$ is a pure number (we're just working out the unit conversion here, not converting a particular Hg concentration). Therefore, $a=1.32 \frac{\text{mL O₂ at BTP}}{\text{g Hb}}$. The powers that be seem to have used a slightly different density, since the more commonly used value is 5% higher at $1.39$. Possibly someone actually measured the density of O₂ at BTP, because BTP is not STP, and O₂ is not an ideal gas. The coefficient $b$ must convert mm Hg at STP to $\frac{\text{mL O₂ at BTP}}{\text{dL blood}}$. Empirical experiments (?) give a value of $b=0.003\frac{\text{mL O₂ at BTP}}{\text{dL blood ⋅ mm Hg at STP}}$. Now we can write out the familiar form \[ \text{[O₂]} = 1.39 \frac{\text{mL O₂ at BTP}}{\text{g Hb}} [Hb] \text{S}_\text{O₂} + 0.003\frac{\text{mL O₂ at BTP}} {\text{dL blood } \cdot \text{ mm Hg at STP}} \text{P}_\text{O₂} \;. \] Reasonable levels are
[Hb]$14\frac{\text{g Hb}}{\text{dL blood}}$
$\text{S}_\text{O₂}$98%
$\text{P}_\text{O₂}$100 mm Hg at STP
$1.39 \frac{\text{mL O₂}}{\text{g Hb}}\text{[Hb]}\text{S}_\text{O₂}$ $19.1\frac{\text{mL O₂ at BTP}}{\text{dL blood}}$
$0.003\frac{\text{mL O₂ at BTP}} {\text{dL blood } \cdot \text{ mm Hg at STP}}\text{P}_\text{O₂}$ $0.300\frac{\text{mL O₂ at BTP}}{\text{dL blood}}$
Because the dissolved O₂ has such a tiny contribution (1.5% of the total in my example), it is often measured at STP rather than BTP. Sometimes it is dropped from the calculation entirely. We focus on the more imporant $\text{[Hb]}\text{S}_\text{O₂}$ in the next section. Oxygen saturation ================= The [preceding](#eq:S-O2) [discussion](#eq:O2) used $\text{[Hb]}\text{S}_\text{O₂}$ to represent the concentration of HbO₂ complexes. This was useful while we were getting our bearings, but now we will replace that term with a more detailed model. Let us sort the Hb monomers into species: * [Hb](#Hb): all hemoglobin monomers * [HbO₂](#HHb): monomers complexed with O₂ * [HHb](#HHb): reduced Hb (not complexed with O₂) * [dysHb](#dysHb): dys-hemoglobin (cannot complex with O₂) * [MHb](#MHb): methemoglobin * [HbCO](#HbCO): carboxyhemoglobin These species are related as follows \[ \begin{aligned} \text{[Hb]} &= \text{[HbO₂]} + \text{[HHb]} + \text{[dysHb]} \\ \text{[dysHb]} &= \text{[MHb]} + \text{[HbCO]} + \text{other broken forms} \end{aligned} \] Because modern two-color pulse-oximeters don't measure $\text{S}_\text{O₂}$ exactly, the related quantity that they *do* measure has been given a name of its own: the *functional* saturation ([$\text{Sf}_\text{O₂}$](#Sf-O2)). \[ \text{Sf}_\text{O₂} = \frac{\text{[HbO₂]}}{\text{[HbO₂]} + \text{[HHb]}} \;. \] Rephrasing our [earlier saturation](#eq:S-O2), we see \[ \text{S}_\text{O₂} = \frac{\text{[HbO₂]}}{\text{[Hb]}} = \frac{\text{[HbO₂]}}{\text{[HbO₂]} + \text{[HHb]} + \text{[dysHb]}} \;. \] To avoid confusion with $\text{Sf}_\text{O₂}$, our original $\text{S}_\text{O₂}$ is sometimes referred to as the *fractional* saturation. The Beer-Labmert law ==================== So far we've been labeling and defining attributes of the blood. The point of this excercise is to understand how a pulse oximeter measures them. People have known for a while that different hemoglobin complexes (HbO₂, HHb, MHb, HbCO, …) have differnt absorbtion spectra, and they have been using this difference since the 1930's to make pulse-oximeters based on two-color transmittance measurements (see [Tremper 1989][T89]). [[!img absorbtion.png size="600x418" alt="Absorbance spectra for assorted hemoglobin species" caption="Absorbance spectra for assorted hemoglobin species (Tremper 1989)"]] By passing different wavelengths of light through perfused tissue, we can measure the relative quantities of the different Hb species. The basis for this analysis comes from the [Beer-Lambert law][BL]. \[ I = I_0 e^{-c \epsilon L} \;, \] where [$I_0$](#I0) is the incident intensity (entering the tissue), [$I$](#I0lambda) is the tranmitted intensity (leaving the tissue), [$c$](#c) is the tissue density (concentration), [$\epsilon$](#eilambda) is the extinction coefficient (molar absorbtivity), and [$L$](#L) is the tissue thickness. Rephrasing the math as English, this means that the intensity drops off exponentially as you pass through the tissue, and more tissue (higher $c$ or $L$) or more opaque tissue (higher $\epsilon$) mean you'll get less light out the far side. This is a very simple law, and the price of the simplicity is that it brushes all sorts of things under the rug. Still, it will help give us a basic idea of what is going on in a pulse-oximeter. Rather than treat the the tissue as a single substance, lets use the Beer-Labmert law on a mixture of substances with concentrations $c_1$, $c_2$, … and extinction coefficients $\epsilon_1$, $\epsilon_2$, …. \[ I = I_0 e^{-(c_1 \epsilon_1 + c_2 \epsilon_2 + \ldots) L} \;. \] We also notice that the intensities and extinction coefficients may all depend on the wavelength of light $\lambda$, so we should really write \[ I_\lambda = I_{0\lambda} e^{-(c_1 \epsilon_{1\lambda} + c_2 \epsilon_{2\lambda} + \ldots) L} \;. \] Once isolated, a simple spectroscopy experiment can measure the extinction coefficient [$\epsilon_{i\lambda}$](#eilambda) of a given species across a range of $\lambda$, and this has been done for all of our common Hb flavors. We need to play with the last equation to find a way to extract the unknown concentrations, which we can then use to [calculate the $\text{Sf}_\text{O₂}$](#eq:Sfunc-O2) and [$\text{S}_\text{O₂}$](#eq:Sfrac-O2) which we can use in turn to calculate [$\text{[O₂]}$](#eq:O2). Note that by increasing the number of [LEDs](#LED) (adding new $\lambda$) we increase the number of constraints on the unknown $c_i$. A traditional pulse-oximeter uses two LEDs, at 660 nm and 940 nm, to measure $\text{Sf}_\text{O₂}$ (related to [HbO₂] and [HHb]). More recent designs called [pulse CO-oximeters][CO-ox] use more wavelengths to allow measurement of quanties related to additional species (approaching the end goal of measuring $\text{S}_\text{O₂}$). Let us deal with the fact that there is a lot of stuff absorbing light that is not arterial blood (e.g. venous blood, other tissue, bone, etc). The good thing about this stuff is that it's just sitting there or moving through in a smooth fasion. Arterial blood is the only thing that's pulsing. Here's another figure from [Tremper][T89]: [[!img ac-dc.png size="600x204" alt="AC and DC transmission components" caption="AC and DC transmission components (Tremper)"]] During a pulse, the pressure in the finger increases and non-arterial tissue is compressed, changing $L$ and $c_i$ from their trough values to peak values $L'$ and $c_i'$. Since the finger is big, the fractional change in width $\mathrm{d} L/L=(L'-L)/L$ is very small. Assuming the change in concentration is even smaller (since most liquids are fairly incompressible), we have \[ \begin{aligned} \frac{\mathrm{d} I_\lambda}{\mathrm{d} L} &= \frac{\mathrm{d}}{\mathrm{d}L} \left(I_{0\lambda} e^{-(c_1 \epsilon_{1\lambda} + c_2 \epsilon_{2\lambda} + \ldots) L}\right) = \frac{\mathrm{d}}{\mathrm{d} L} \left( I_{0\lambda} e^{-X L} \right) = -X I_{0\lambda} e^{-X L} = -XI_\lambda \\ \frac{\mathrm{d} I_\lambda}{I_\lambda} &= -X \mathrm{d} L \;, \end{aligned} \] where $X=c_1 \epsilon_{1\lambda} + c_2 \epsilon_{2\labmda} + \ldots$ is just a placeholder to reduce clutter. $\mathrm{d} I_\lambda$ is the AC amplitude (height of wiggle top of the detected light intensity due to pulsatile arterial blood), while $I_\lambda$ is the DC ampltude (height of the static base of the detected light intensity due to everything else). This is actually a fairly sneaky step, because if we can also use it to drop the DC compents. Because we've assumed fixed concentrations (incompressible fluids), and there is no more DC material coming in during a pulse (by definition), the effective $L$ for the DC components does not change. Separating the DC and AC components and running through the derivative again, we have \[ \begin{aligned} \frac{\mathrm{d} I_\lambda}{\mathrm{d} L} &= \frac{\mathrm{d}}{\mathrm{d} L} \left( I_{0\lambda} e^{-(c_{\text{DC}1}\epsilon_{\text{DC}1\lambda} +c_{\text{DC}2}\epsilon_{\text{DC}2\lambda} + \ldots) L_\text{DC} -(c_{\text{AC}1}\epsilon_{\text{AC}1\lambda} +c_{\text{AC}2}\epsilon_{\text{AC}2\lambda} + \ldots) L_\text{AC}} \right) \\ &= I_{0\lambda} e^{-(c_{\text{DC}1}\epsilon_{\text{DC}1\lambda} +c_{\text{DC}2}\epsilon_{\text{DC}2\lambda} + \ldots) L_\text{DC}} \frac{\mathrm{d}}{\mathrm{d} L} \left( e^{-(c_{\text{AC}1}\epsilon_{\text{AC}1\lambda} +c_{\text{AC}2}\epsilon_{\text{AC}2\lambda} + \ldots) L_\text{AC}} \right) \\ &= I_{0\lambda} Y \frac{\mathrm{d}}{\mathrm{d} L} \left( e^{-Z L_\text{AC}} \right) = -Z I_{0\lambda} Y e^{-Z L_\text{AC}} = -Z I_\lambda \\ \frac{\mathrm{d} I_\lambda}{I_\lambda} &= -Z \mathrm{d} L \;, \end{aligned} \] where $Y=e^{-(c_{\text{DC}1}\epsilon_{\text{DC}1\lambda} +c_{\text{DC}2}\epsilon_{\text{DC}2\lambda} + \ldots) L_\text{DC}}$ and $Z=c_{\text{AC}1}\epsilon_{\text{AC}1\lambda} +c_{\text{AC}2}\epsilon_{\text{AC}2\lambda} + \ldots)$ are just placeholders to reduce clutter. Note that the [last equation](#eq:dI-I) looks just like the [previous one](#eq:dI-I-naive) with the translation $X\rightarrow Z$. This means that if we stick to using the AC-DC intensity ratio ($\frac{\mathrm{d} \Il}{\Il}$) we can forget about the DC contribution completely. If the changing-$L$-but-static-$L_\text{DC}$ thing bothers you, you can imagine insteadthat $L_\text{DC}$ grows with $L$, but $c_{\text{DC}i}$ shrinks proportially (to conserve mass). With this proportionate stretching, there is still no change in absorbtion for that component so $\frac{\mathrm{d}}{\mathrm{d}L}\exp(-c_{\text{DC}i}\epsilon_{\text{DC}i\lambda}L)=0$ and we can still pull the DC terms out of the integral as we [just did](#eq:dI-I). Taking a ratio of these amplitudes at two different wavelengths, we get optical density ratio ([R](#R)) \[ R = \frac{\frac{\text{AC}_{660}}{\text{DC}_{660}}} {\frac{\text{AC}_{940}}{\text{DC}_{940}}} = \frac{\frac{\mathrm{d} I_{660}}{I_{660}}} {\frac{\mathrm{d} I_{940}}{I_{940}}} = \frac{-Z_{660} \mathrm{d} L}{-Z_{940} \mathrm{d} L} = \frac{Z_{660}}{Z_{940}} \;, \] because $\mathrm{d} L$ (the amount of finger expansion during a pulse) obviously doesn't depend on the color light you are using. Plugging back in for $Z$, \[ R = \frac{c_{\text{AC}1}\epsilon_{\text{AC}1,660} + c_{\text{AC}2}\epsilon_{\text{AC}2,660} + \ldots} {c_{\text{AC}1}\epsilon_{\text{AC}1,940} + c_{\text{AC}2}\epsilon_{\text{AC}2,940} + \ldots} \] Assuming, for now, that there are only two species of Hb—HbO₂ and HHb—we can solve for $c_{\text{AC}1}/c_{\text{AC}2}$. \[ \begin{aligned} R &= \frac{c_{\text{AC}1}\epsilon_{\text{AC}1,660} + c_{\text{AC}2}\epsilon_{\text{AC}2,660}} {c_{\text{AC}1}\epsilon_{\text{AC}1,940} + c_{\text{AC}2}\epsilon_{\text{AC}2,940}} \\ R(c_{\text{AC}1}\epsilon_{\text{AC}1,940} + c_{\text{AC}2}\epsilon_{\text{AC}2,940}) &= c_{\text{AC}1}\epsilon_{\text{AC}1,660} + c_{\text{AC}2}\epsilon_{\text{AC}2,660} \\ c_{\text{AC}1} (R\epsilon_{\text{AC}1,940} - \epsilon_{\text{AC}1,660}) &= c_{\text{AC}2} (\epsilon_{\text{AC}2,660} - R\epsilon_{\text{AC}2,940}) \\ \frac{c_{\text{AC}1}}{c_{\text{AC}2}} &= \frac{\epsilon_{\text{AC}2,660} - R\epsilon_{\text{AC}2,940}} {R\epsilon_{\text{AC}1,940} - \epsilon_{\text{AC}1,660}} \;. \end{aligned} \] So now we know [HbO₂]/[HHb] in terms of the measured quantity $R$ and the empirical values $\epsilon$. Plugging in to our [equation for $\text{Sf}_\text{O₂}$](#eq:Sfunc-O2) to find the functional saturation: \[ \begin{aligned} \text{Sf}_\text{O₂} &= \frac{\text{[HbO₂]}}{\text{[HbO₂]} + \text{[HHb]}} = \frac{1}{1 + \frac{\text{[HHb]}}{\text{[HbO₂]}}} = \frac{1}{1 + \frac{c_{\text{AC}2}}{c_{\text{AC}1}}} = \frac{1} {1 + \frac{R\epsilon_{\text{AC}1,940} - \epsilon_{\text{AC}1,660}} {\epsilon_{\text{AC}2,660} - R\epsilon_{\text{AC}2,940}}} \;. \end{aligned} \] As a check, we can rephrase this as \[ \begin{aligned} \text{Sf}_\text{O₂} &= \frac{1} {1 + \frac{R\epsilon_{\text{AC}1,940} - \epsilon_{\text{AC}1,660}} {\epsilon_{\text{AC}2,660} - R\epsilon_{\text{AC}2,940}}} = \frac{\epsilon_{\text{AC}2,660} - R\epsilon_{\text{AC}2,940}} {\epsilon_{\text{AC}2,660} - R\epsilon_{\text{AC}2,940} + R\epsilon_{\text{AC}1,940} - \epsilon_{\text{AC}1,660}} \\ &= \frac{\epsilon_{\text{AC}2,660} - R\epsilon_{\text{AC}2,940}} {\epsilon_{\text{AC}2,660} - \epsilon_{\text{AC}1,660} + (\epsilon_{\text{AC}1,940} - \epsilon_{\text{AC}2,940})R} = \frac{-\epsilon_{\text{AC}2,660} + \epsilon_{\text{AC}2,940}R} {\epsilon_{\text{AC}1,660} - \epsilon_{\text{AC}2,660} + (\epsilon_{\text{AC}2,940} - \epsilon_{\text{AC}1,940})R} \;, \end{aligned} \] which matches [Mendelson 1989][M89], Eq. 8 with the translations: * $\text{Sf}_\text{O₂}\rightarrow Sp\text{O₂}$, * $R\rightarrow R/IR$, * $\epsilon_{\text{AC}2,660}\rightarrow\epsilon_R(\text{Hb})$, * $\epsilon_{\text{AC}2,940}\rightarrow\epsilon_IR(\text{Hb})$, * $\epsilon_{\text{AC}1,660}\rightarrow\epsilon_R(\text{HbO₂})$, and * $\epsilon_{\text{AC}1,940}\rightarrow\epsilon_IR(\text{HbO₂})$. And that is the first-order explaination of how a pulse-oximeter measures the functional saturation! Reading extinction coefficients off the [absorbtion figure](#fig:absorbtion), I get \[ \begin{aligned} \epsilon_{\text{HbO₂},660} &= \epsilon_{\text{AC}1,660} = 0.10 \\ \epsilon_{\text{HHb},660} &= \epsilon_{\text{AC}2,660} = 0.83 \\ \epsilon_{\text{HbO₂},940} &= \epsilon_{\text{AC}1,940} = 0.29 \\ \epsilon_{\text{HHb},940} &= \epsilon_{\text{AC}2,940} = 0.17 \end{aligned} \] which are comfortingly close to those given by [Mendelson][M89] in Table 1. The corresponding $\text{Sf}_\text{O₂}(R)$ plot (from [Tremper][T89]) is: [[!img SPO2vR.png size="400x330" alt="Experimental SpO₂ vs. R" caption="Experimental SpO₂ vs. R (Tremper)"]] [[!img SfO2vR-theory.png size="300x300" alt="Theoretical SfO₂ vs. R" caption="Theoretical SfO₂ vs. R."]] The theoretical plot was calculated using [[SfO2vR-theory.py]] and [our $\text{Sf}_\text{O₂}$ equation](#eq:Sfunc-O2-R). This is why it’s a good idea to use an empirical calibration curve! The concave theoretical curve is supported by [Mendelson's figure 4][M89]. Nomenclature ============
O₂
Molecular oxygen
[$x$]
Concentration of $x$ in the blood
BTP
Body temperature and pressure
STP
Standard temperature and pressure
$\text{P}_\text{O₂}$
O₂ partial pressure
$\text{P}i_\text{O₂}$
O₂ partial pressure at location $i$
$\text{S}_\text{O₂}$
Fractional O₂ saturation
$\text{S}i_\text{O₂}$
O₂ fractional saturation at location $i$
$\text{Sf}_\text{O₂}$
Functional O₂ saturation
Hg
Mercury
Hb
Hemoglobin monomer
HbO₂
Hemoglobin monomers complexed with O₂
HHb
Reduced hemoglobin (not complexed with O₂)
dysHb
Dys-hemoglobin (cannot complex with O₂)
MHb
Methemoglobin
HbCO
Carboxyhemoglobin
$I_{0\lambda}$
Intensity of incident light at wavelength $\lambda$
$I_\lambda$
Intensity of transmitted light at wavelength $\lambda$
$c_i$
Concentration of light-absorbing species $i$
$c_{\text{DC}i}$
Concentration of the $i$th DC species at wavelength $\lambda$
$c_{\text{AC}i}$
Concentration of the $i$th AC species at wavelength $\lambda$
$\epsilon_{i\lambda}$
Extinction coefficient of species $i$ at wavelength $\lambda$
$\epsilon_{\text{DC}i\lambda}$
Extinction coefficient of the $i$th DC species wavelength $\lambda$
$\epsilon_{\text{DC}i\lambda}$
Extinction coefficient of the $i$th DC species wavelength $\lambda$
$L$
Length of tissue through which light must pass
$L_\text{DC}$
Diastolic finger width
$R$
Optical density ratio
LED
Light emitting diode
[pox]: http://en.wikipedia.org/wiki/Pulse_oximeter [art]: http://journals.lww.com/anesthesiology/Citation/1989/01000/Pulse_Oximetry.19.aspx [hemoglobin]: http://en.wikipedia.org/wiki/Hemoglobin [partial]: http://en.wikipedia.org/wiki/Partial_pressure [mole-volume]: http://hyperphysics.phy-astr.gsu.edu/hbase/kinetic/idegas.html [T89]: http://journals.lww.com/anesthesiology/Citation/1989/01000/Pulse_Oximetry.19.aspx [BL]: http://en.wikipedia.org/wiki/Beer\%E2\%80\%93Lambert_law [CO-ox]: http://en.wikipedia.org/wiki/Co-oximeter [M89]: http://ieeexplore.ieee.org/xpl/freeabs_all.jsp?arnumber=30810 [[!tag tags/theory]]