O₂Hb and HHb: what your NIRS sensor tells you
O₂Hb and HHb: what your NIRS sensor tells you
And how not to make it say what it does not say
Cyril Ricci, HNS Performance · November 2026
A NIRS sensor such as the Moxy displays a muscle oxygen saturation, SmO₂, and an amount of haemoglobin, THb. Many software tools derive two more curves from them: oxyhaemoglobin (O₂Hb) and deoxyhaemoglobin (HHb).
They are useful, provided you know where they come from. This article explains what they are, why they can be calculated, how to read them, and the most common reading mistakes.

Two measurements, four numbers
The sensor sends near-infrared light into the muscle at four wavelengths (680, 720, 760 and 800 nm) and measures what comes back at two detectors placed 12.5 and 25 mm from the source (McManus et al. 2018).
From this it derives two quantities, in the small volume of tissue crossed by the light:
SmO₂: the share of haemoglobin carrying oxygen, in %. Muscle myoglobin absorbs light in almost the same way: the sensor cannot tell it apart from haemoglobin, and the signal mixes the two;
THb: the total amount of haemoglobin (and myoglobin) under the sensor, displayed in g/dL on a relative scale specific to the Moxy. It is not the athlete's blood haemoglobin.
The reliability and validity of the 0 to 100 % SmO₂ scale were assessed with an arterial occlusion protocol (Feldmann et al. 2019). O₂Hb (oxygen-loaded haemoglobin) and HHb (haemoglobin that has released its oxygen) are not additional measurements: they are calculated from the first two.
Why the calculation is legitimate
By definition, THb is the sum of the two forms of haemoglobin, and SmO₂ is the share of the oxygen-loaded form:
THb = O₂Hb + HHb SmO₂ = O₂Hb / THb × 100
Two equations, two unknowns. If SmO₂ and THb are known, the other two follow exactly:
O₂Hb = THb × SmO₂ / 100 HHb = THb − O₂Hb
Example: THb 13.36 and SmO₂ 43.8 % give O₂Hb = 13.36 × 0.438 = 5.85 and HHb = 13.36 − 5.85 = 7.51.
Key point.
The calculation creates no information.
The four curves are two measurements written in four ways, and the uncertainties of THb (relative scale, fat) carry over unchanged into O₂Hb and HHb.
When THb does not move, O₂Hb and HHb necessarily move as mirror images: seeing O₂Hb fall while HHb rises therefore "confirms" nothing. It is the same information, seen twice.
So why decompose? Because SmO₂ alone is a percentage.
It can fall because the muscle takes up more oxygen, because delivery falls, or because the composition of the blood under the sensor changes (inflow of arterial blood, pooling venous blood).
Separating THb from the oxygen load helps guide the reading. On its own, it cannot settle whether delivery or use has changed.
First rule: look at THb first
At steady power, THb tells you about the amount of haemoglobin under the sensor. O₂Hb and HHb are read afterwards. What follows describes what you see; the possible causes remain hypotheses.
What you see | Reading |
THb stable, HHb ↑, O₂Hb ↓ | Desaturation with stable THb. Reading: greater extraction relative to delivery (use rising or delivery falling: the sensor cannot separate the two) |
THb stable, HHb ↓, O₂Hb ↑ | Reoxygenation with stable THb (delivery rising or use falling: same limit) |
THb ↑ carried by O₂Hb | Rise in THb carried by the oxygenated component. Hypotheses: blood inflow (vasodilation, capillary recruitment), skin blood flow with heat |
THb ↑ carried by HHb | Rise in THb carried by the deoxygenated component. Hypothesis: venous blood pooling (intramuscular pressure, high torque, low cadence) |
THb ↓ and HHb ↑ | HHb rises despite the fall in THb: desaturation exceeds that fall. Hypotheses for the fall in THb: vasoconstriction, muscle compression, sensor moving |
THb ↓ and HHb ↓ | Fall in THb and in the deoxygenated component; the change in O₂Hb (ΔO₂Hb = ΔTHb − ΔHHb) must be examined separately. Hypotheses: less blood under the sensor (compression), sensor displacement |
How do you decide that THb is "stable"?
There is no published threshold for the Moxy.
Our working convention: first judge the change in THb against its own noise (see the third rule). If it exceeds it, compare it with the change in HHb, when the latter is retained:
|ΔTHb| below 10 % of |ΔHHb|, THb is considered stable; between 10 and 30 %, slightly variable, give the numbers; above that, read both the change in THb and extraction.`
Second rule: read within the bout, not between bouts
During a constant-power bout, the sensor in principle stays in the same place, and skin, temperature and position change less than between two bouts.
The muscle is compared with itself over a few minutes. In practice: mean of the last three minutes minus mean of minutes 3 to 5.
The first two minutes, which carry the on-transient, are excluded. A skin or temperature drift within the bout remains possible, and the sensor cannot tell it apart from a muscle drift.
Comparing the first bout of the session with the last is tempting, but many things happen between the two besides power: time, heat, sweat, fatigue, perhaps a slight displacement of the sensor.
If bouts are performed in increasing order, the effect of power is mixed with all the rest.
And a level that looks flat from one bout to the next does not prove an extraction ceiling: the muscle may recover between two bouts, then start again.
Third rule: retain a change only if it exceeds the noise
The NIRS signal moves on its own from one minute to the next. An HHb rising by 0.07 may mean nothing. Our method, which can be done in a spreadsheet:
1. for each bout, compute the mean of each minute from minute 3 to the end, then the differences between successive minutes;
2. subtract from these differences their mean within the bout (this removes a steady drift), then pool them across all bouts of the session, site by site;
3. minute noise σ = standard deviation of these differences, divided by √2. Pooling bouts gives about forty values instead of 5 to 7: an estimate less dependent on a single bout, without statistical validation at this stage;
4. expected error on a Δ = σ × √(2/3), since two three-minute means are compared, and R = |Δ| / expected error;
5. two thresholds: alert threshold = 2 × expected error (R = 2); HNS selection threshold = 2.5 × expected error (R = 2.5). Example: σ = 0.11 gives 0.18 and 0.23;
6. our convention retains a change above the selection threshold; between the two thresholds it is "borderline"; below the alert threshold it is undetermined, not necessarily absent.
On a quiet site, a change that is not retained is compatible with a stable bout; on a noisy site, it remains undetermined.
Two precautions.
A curved drift within the bout inflates σ, and minutes that resemble each other from one minute to the next reduce it: the threshold is an order of magnitude, not an exact test.
And with 4 sensors and 8 bouts, you make 32 readings: one or two "retained" changes can appear by chance.
An isolated result should therefore be read with caution.
When several bouts are borderline or below the alert threshold, look at the direction. If it is the same in every bout (at least 6), the repetition becomes information: write "same direction in every bout".
But these bouts share the same sensor and the same session: a common drift (sweat, skin, sensor pressure) can produce this constant direction with nothing muscular Say so.
These choices (windows of minutes 3 to 5 and the last three minutes, thresholds of 2 and 2.5, 10 and 30 % for THb, constancy of direction) are HNS working conventions.
They are not taken from a publication and will be tested on several athletes.
A real example
Road cyclist, steady-power bouts of 8 and 10 minutes, four sensors: vastus lateralis, vastus medialis, intercostal and triceps. Anonymised data. Changes in g/dL, relative Moxy scale.
Site and bout | Δ HHb within the bout | Δ THb | Site thresholds: alert / selection | Reading |
Vastus medialis, VT2 zone | +0.60 | −0.02 | 0.18 / 0.23 | Retained, THb stable: desaturation progresses over the bout. Same direction in all 8 bouts |
Vastus lateralis, below VT1 | +0.07 | +0.01 | 0.21 / 0.26 | Not retained under our convention: +0.07, below the alert threshold of 0.21. On this quiet site, compatible with a stable bout |
Vastus lateralis, upper VT2 zone | +0.38 | −0.01 | 0.21 / 0.26 | Retained, THb stable: desaturation progresses |
Triceps, upper VT2 zone | −0.50 | 0.00 | 0.52 / 0.65 | Below the alert threshold, on a noisy site: undetermined. The same order of magnitude weighs less here |
Intercostal, 8 bouts | −0.30 to −1.08 | −0.19 to +0.13 | 0.44 / 0.55 | 3 bouts retained, 2 borderline, 3 below the alert threshold; HHb falling in all 8 bouts |
Three lessons.
The same number does not weigh the same on every site: the triceps and intercostal are two to three times noisier than the vasti.
A change retained on its own site does not need the agreement of another site; it remains an observation on one bout, at that location. The other sites then help to look for why.
Finally, the fall in intercostal HHb in all 8 bouts is a clear trend, but it does not rule out a common drift linked to the skin or the sensor, on a very exposed site.
What the sensor does not tell you during exercise
· A blood flow: THb is an amount, not a flow. Blood moving faster with the same amount is not visible.
· A validated blood volume: Moxy THb has not been validated as a measure of local blood volume; it is used as a relative indicator of its changes, on the same site.
· A comparison of levels between two sites or two athletes: THb is relative and sensitive to fat thickness (Moxy developers forum). Changes are compared, on the same site.
· A measurement independent of fat: compared with another NIRS device (PortaMon), the Moxy gives similar values below about 7 mm of fat, and the difference changes mostly between 7 and 10 mm (McManus et al. 2018). This is not a universal boundary: measure the skinfold and record it.
· A measurement insensitive to pressure: in the same study, Moxy values fall when external pressure exceeds about 20 mmHg. The sensor should be held in place, not crushed.
· The whole muscle: the measurement only covers the superficial layers.
· An SmO₂ as reliable at high intensity as at moderate intensity (Crum et al. 2017).
· "Deoxygenated blood": the sensor sees a mixture of arterial, capillary and venous blood. We speak of empty haemoglobin under the sensor.
· A cause: a desaturation is an observation; a mechanism (fibre recruitment, metaboreflex, vasoconstriction) remains a hypothesis until another measurement supports it.
Explaining it to an athlete
This picture simplifies a signal that also includes muscle myoglobin.
THb is the number of wagons present under the sensor at a given moment. O₂Hb is the wagons full of oxygen;
HHb, the empty wagons.
SmO₂ is the percentage of wagons still full. "If the number of wagons does not change and more and more of them are empty, your muscle is taking up more relative to what arrives."
And one sentence that avoids the most common confusion: "the sensor counts the wagons, not their speed".
In summary
1. O₂Hb and HHb are calculated exactly from SmO₂ and THb, but add no information; they cover haemoglobin and myoglobin mixed together.
2. Look at THb first: stable, read O₂Hb and HHb as mirror images; variable, read its change and extraction.
3. Read within the bout first; comparison between bouts mixes power and time.
4. Our convention retains a change when it exceeds the site's noise; below that, it is undetermined, not necessarily absent.
5. What is measured is an observation; the cause is a hypothesis.
References
· Crum EM, O'Connor WJ, Van Loo L, Valckx M, Stannard SR. 2017. Validity and reliability of the Moxy oxygen monitor during incremental cycling exercise. Eur J Sport Sci 17(8):1037–1043.
· Feldmann A, Schmitz R, Erlacher D. 2019. Near-infrared spectroscopy-derived muscle oxygen saturation on a 0% to 100% scale: reliability and validity of the Moxy Monitor. J Biomed Opt 24(11):115001.
· McManus CJ, Collison J, Cooper CE. 2018. J Biomed Opt 23:015007.
· Moxy developers forum, "Understanding tHb".



Comments