Skip to content

Muse S Athena: EEG scale factor appears to be the 12-bit constant (1650/4095) applied to 14-bit samples; midpoint not subtracted #854

Description

@meanmod3

Summary

MUSE_ATHENA_EEG_SCALE_FACTOR appears to be the 12-bit-era Muse LSB applied to 14-bit Muse S Athena samples, making BrainFlow's Athena EEG output ~4.55× too large in µV. Additionally, the Athena path does not subtract the 14-bit midpoint, so the output carries a large DC pedestal.

BrainFlow originally shipped the value that matches Interaxon's published spec, and it was changed later without discussion.

The constant

Current (src/board_controller/muse/inc/muse_athena_constants.h):

#define MUSE_ATHENA_EEG_SCALE_FACTOR 0.40293040293040294

At introduction in #779 (commit 7b2e41d3) it was:

#define MUSE_ANTHENA_EEG_SCALE_FACTOR (1450.0 / 16383.0)   // = 0.0885064

It was replaced with the bare literal in commit aa4c3226 ("generic muse improvements", #828). That commit also touched the accelerometer and gyro constants, but those were precision refinements to the same values:

constant before after ratio
accelerometer 0.0000610352 0.00006103515625 ×0.9999993
gyro -0.0074768 -0.007476806640625 ×1.0000009
EEG 1450.0/16383.0 0.40293040293040294 ×4.5526

The EEG change is a different value, not a refinement, and I couldn't find any discussion of it (the PR body is empty and there are no review comments).

Note 0.40293040293040294 == 1650/4095 exactly — a 12-bit denominator. The Athena samples are extracted as 14-bit (extract_lsb_bits(data, bit_start, 14) in muse_athena.cpp), which has been unchanged since #779.

Why 1450/16383 looks correct

Interaxon's published Muse S Athena specification states:

Sample Resolution: 14 bits / sample
Aux Channel Connection: Input range: 725uV AC signal (1.45mVp-p) with 1.45V DC offset; Aux channels are amplified like all other EEG channels

1450 µV p-p ÷ 2^14 = 1450/16383 — i.e. the original constant is exactly the published input range divided by the published bit depth.

For contrast, the Muse 2 spec sheet (v1.0) states "12 bits / sample" with a "1.5mV p-p" input range, giving an LSB of ~0.37–0.41 µV. 0.40293 sits in that Gen-2 range — it looks like a correct previous-generation constant carried onto Athena.

Empirical check against hardware

I recorded 90 s of eyes-closed EEG from a Muse S Athena (fw 3.1.19, Athena_RevE) and used the ADC clipping level as a calibration reference. Channels that rail hit exactly ±8192 counts:

constant implied clipping level
1450/16383 ±725 µV = 1.45 mVpp — matches the published input range
0.40293… ±3300 µV = 6.60 mVpp — no Interaxon document states this

Plausibility of the resulting signal (band-limited 1–40 Hz RMS, same recording, verified 10.0 Hz alpha peak at TP9/TP10):

channel counts 1450/16383 0.40293…
TP9 227 20.1 µV 91.5 µV
AF8 235 20.8 µV 94.8 µV
TP10 290 25.7 µV 116.9 µV
AF7 (poor contact, 15–38% railed) 1043 92.3 µV 420.3 µV

Under 1450/16383 the three well-contacted channels land in the normal range for a referential temporal derivation and the known-bad channel is the outlier. Under 0.40293 every channel — including ones carrying a clean alpha rhythm — reads well above physiological amplitudes.

Second issue: missing midpoint subtraction

muse_athena.cpp (~lines 785, 793) scales the raw unsigned value directly:

package[...] = (double)raw * MUSE_ATHENA_EEG_SCALE_FACTOR;

Since raw is an unsigned 14-bit value, the output sits on a DC pedestal of roughly half full-scale rather than being zero-centred. BrainFlow's own legacy Muse path does subtract its midpoint ((val - 0x800) * 125.0/256.0), and muse-lsl / OpenMuse / BlueMuse all subtract 1 << 13 before scaling for Athena.

Suggested fix

#define MUSE_ATHENA_EEG_SCALE_FACTOR (1450.0 / 16383.0)
#define MUSE_ATHENA_EEG_MIDPOINT     8192.0   // 1 << 13
package[...] = ((double)raw - MUSE_ATHENA_EEG_MIDPOINT) * MUSE_ATHENA_EEG_SCALE_FACTOR;

Caveat / open question

Interaxon's Athena sheet gives 1.45 mVpp, while an older Muse developer doc gives the EEG range as 1682.815 µV — a ~16% spread (LSB 0.0885 vs 0.1027). That ambiguity doesn't affect the 4.55× question but does mean the absolute figure carries ~±16% until someone injects a known-amplitude signal and reads the counts (100 µV p-p should give ~1130 counts p-p under 1450/16383). I don't have a calibration source to do that yet; happy to run it if I get access to one.

Related discussions elsewhere: muse-lsl PR #228 flags the same 4.55× disagreement as unresolved, OpenMuse issue #2 asks for the scalings to be checked, and BlueMuse PR #83 identifies 0.40293040293040294 as 1650/4095, the legacy 12-bit scale.

Environment: BrainFlow 993cb6ca, macOS 26.5 arm64, Muse S Athena fw 3.1.19.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions