September 1, 2026 · Bioelectromagnetic propagation · v3
What software can and cannot buy you
Two months of trying to push a phone magnetometer past what its hardware should allow — what the discipline actually bought, how it compares to the other implementations, and the wall that no amount of code moves.
- [C]
- 2 resolved sources
In short
Every phone has a magnetometer in it. The interesting question is not whether you can read a body with one — you cannot — but how far careful software gets you before the hardware stops you, and how you would know which of the two you were up against. This is what was tried, what the other implementations do, and where the line turned out to be.
Two months pushing a phone magnetometer past what its hardware should allow. What the discipline bought, and the wall it does not move.
Short version: software buys a great deal, and none of it is sensitivity.
What software can do
- Verify rather than assume. Every parameter not measured is a parameter being guessed.
- Know its own noise, in the band that matters rather than across the spectrum.
- Refuse to believe itself — surrogate nulls, held-out thresholds, injection tests establishing what the pipeline would have detected.
- Keep everything on one clock, so motion separates from field.
- Report its own gaps instead of interpolating them.
What software cannot do
Manufacture information that never entered the converter. If the quantisation step is larger than the thing you want to see, no averaging, whitening or filtering invents it.
The other implementations
Four, each better than this rig at its own job.
NOAA CrowdMag — smartphone magnetometer readings as a distributed geomagnetic survey. Validates every contribution against a field model, so it knows whether a reading is correct in absolute terms. This rig does not, and has never checked.
phyphox / Physics Toolbox — physics-education tools. Expose raw and calibrated channels side by side, switchable in two taps.
NASA / citizen-science smartphone magnetometry — characterises what a phone magnetometer can do for space-weather monitoring, and is the closest published reference point for this sensor class.
ADVIO — a visual-inertial odometry dataset, not a magnetometry project, but it ships real multi-sensor phone recordings under an open licence. That makes it a cross-device control for testing whether an effect belongs to one handset or to the platform.
How they are used here. CrowdMag is the model for an absolute-accuracy check not yet built. phyphox is why the single-channel decision is a defect rather than a preference. ADVIO is the corpus that lets a finding be checked on hardware not owned.
What was tried
Measure the delivered sample rate, per recording. Not the requested rate. The difference is systematic, and every frequency-domain result is wrong by that factor if assumed. None of the comparators verifies this per record.
Measure the noise floor in-band, not broadband. This produced the most useful correction of the project, in the opposite direction from the one you would fear: a broadband figure overstated noise at the frequency of interest, because real recordings are drift-dominated. Carrying the wrong number declares runnable experiments unrunnable. An instrument that makes you too pessimistic kills experiments silently.
Build the nulls before the result. Four surrogate families, thresholds as a maximum statistic over the whole search rather than per-cell, and a refusal to quote a false-alarm bound above a stated ceiling. The comparators run quality control against a model; none runs a null. Biggest single difference, and entirely software.
Validate by injection. Put a known signal into the real path and measure what fraction the pipeline recovers. Without it, a null result cannot be distinguished from an analysis that would have missed it anyway.
One monotonic timebase across every sensor stream. Magnetometer, accelerometer, gyroscope, attitude. Almost every discriminator separating “the phone moved” from “the field changed” depends on it, and it cannot be retrofitted.
Where it is worse, including one defect
The calibrated channel is not logged. Recording raw as primary is right — calibration is a filter with unpublished behaviour and cannot be undone. But the calibrated channel alongside it is a free diagnostic, phyphox does it, and its absence caused a multi-day misattribution: a large static field offset read as an external accessory when it was internal to the device. Cheapest fix on the list; needs an app build.
No absolute accuracy validation. CrowdMag would have caught the same thing differently.
One operating system, and a private archive. The cross-device control leans on other people’s corpora.
Dropped samples across long recordings, reported rather than hidden — and the “zero dropped gaps” figure in early notes came from a single short run.
The wall
The target for reading cardiac activity magnetically is described in the review literature.
The gap between it and a phone is not a factor of a few. It is orders of magnitude, and it is a property of the sensor.
Every item in “what software can do” is real and worth building. Not one moves the floor. They tell you where the floor is, stop you fooling yourself about what is above it, and make a null result mean something — which is a great deal, and is not sensitivity.
Honest summary. For searching weak periodic structure with real nulls, this is a more careful instrument than the comparators, and the gap is not close. For what the comparators are built for, it is worse, and one of those gaps is a defect rather than a trade-off.
What would change my mind
A demonstration that a stock phone magnetometer resolves a signal at the amplitude the cardiac literature describes, under a protocol with real nulls and an injection test. The null machinery would need to come before the result — the same standard applied here.
Version history 3 revisions
Generated from this site's git history. with Claude means the commit carries a co-author line for an Anthropic model: an LLM took part in that change, not necessarily in every word of it, and git cannot say which. The same history on GitHub →
-
v3 2026-09-12 07:54 posts: inline source cards, and every post cut to the point
status: publishedinline_sources: truetier: C---There is a magnetometer in every phone, sitting there being a compass. The question that got me started was whether disciplined software could push it somewhere it was never meant to go.The short version: **software buys you enormously more than I expected, and none of it is sensitivity.** This is a walk through what was actually tried, what the other implementations in this space do, and where the line sits.Two months pushing a phone magnetometer past what its hardware should allow. What the discipline bought, and the wall it does not move.**Short version: software buys a great deal, and none of it is sensitivity.**##TheWhatmentalitysoftware can doThe instinct when you have inadequate hardware is to look for the clever trick — the processing step that recovers what the sensor missed. That instinct is mostly wrong, and it took a while to internalise why.What software can do, it turns out, is a long list:- **Verify rather than assume.** Every parameteryou didnotmeasuremeasured is a parameteryoubeingare guessing atguessed.- **Know its own noise**, in the band that matters rather than across thewholespectrum.- **Refuse to believe itself** — surrogate nulls, held-out thresholds, injection teststhat establishestablishing what the pipeline would have detected.- **Keep everything on one clock**, sothatmotioncan be separatedseparates from field.- **Report its own gaps** instead ofquietlyinterpolating them.## What software cannot doWhat software cannot do is manufactureManufacture information that never entered the converter. If the quantisation step is larger than the thing you want to see, noamount ofaveraging, whitening or filtering invents it.That is the whole lesson and it took building the thing to learn it properly.## The other implementations, and what each one is forI did not build this in a vacuum, and the most useful hours were spent reading what other people had already done. Four are worth documenting, because each is built for a different purpose and each is better than mine at its own job.Four, each better than this rig at its own job.**NOAA'sCrowdMag**collects— smartphone magnetometer readings as a distributed geomagnetic survey.Its defining property is that **it validatesValidates every contribution against a field model**,—so it knows whether a reading is*correct*, in absolute terms. Mine does not, and has never checked.*correct* in absolute terms. This rig does not, and has never checked.**phyphoxand/ Physics Toolbox**are— physics-education tools.Their defining property is that they **expose theExpose raw andthecalibratedchannelchannels side by side**, switchable in two taps.That distinction matters more than it sounds and I will come back to it.**TheNASANASA/Odenwaldcitizen-scienceworksmartphone magnetometry** — characterises what a phone magnetometer can do for space-weather monitoring{% include cite.html key="odenwald2022" %}, and is the closest published reference point forthe noise performance ofthis sensor classof sensor.{% include source.html key="odenwald2022" %}**ADVIO**is— a visual-inertial odometryresearchdataset—, not a magnetometry projectat all, but it ships real multi-sensor phone recordings under an open licence,.whichThat makes it a cross-device control foranyonetesting whether an effectisbelongsa property ofto one handset orofto the platform.**HowItheyusearethemused here.** CrowdMag is the model for an absolute-accuracy checkI havenot yet built. phyphox isthe reason I knowwhy thedualsingle-channel decision is a defectandrathernotthan a preference. ADVIO is the corpus that lets a finding be checked on hardwareI donotownowned.None of that required permission; all of it required reading.## What wasactuallytried**Measure the delivered sample rate, per recording.** Not the requested rate— the delivered one.It is not the same number, theThe difference is systematic, and every frequency-domain result is wrong by that factor ifyou assume instead of checkassumed. None of theimplementations abovecomparators verifies this per record.**Measure the noise floor in-band, not broadband.** Thisoneproduced the most useful correction of thewholeproject, in the opposite direction from the one you would fear: a broadband figure**overstated** the noise at the frequency of interest by a large factor, because real recordings are drift-dominated. Carrying the wrong number around declares runnable experiments unrunnable. An instrument that makes you *too* pessimistic kills experiments silently, and nothing in the output tells you it happened.**overstated** noise at the frequency of interest, because real recordings are drift-dominated. Carrying the wrong number declares runnable experiments unrunnable. An instrument that makes you too pessimistic kills experiments silently.**Build the nulls before the result.** Four surrogate familiesof surrogate, thresholdstakenas a maximum statistic over theentirewhole search rather than per-cell, and a refusal to quote a false-alarm bound above a stated ceiling. The comparators run quality control against a model; noneof themruns a null.This is theBiggest singlebiggestdifference, andit isentirely software.**Validate by injection.** Put a known signal into the real path and measure what fraction the pipeline recovers. Withoutthis you have no idea whetherit, a null resultmeanscannotabsencebeordistinguishedmeansfromyouran analysis that would have missed it anyway.**One monotonic timebase across every sensor stream.** Magnetometer, accelerometer, gyroscope, attitude— all on one clock. Almost everyusefuldiscriminatorforseparating "the phone moved" from "the field changed" depends onthisit, and itiscannotimpossiblebeto retrofitretrofitted.## Where it is worse, including onerealdefectBeing honest about this is most of the value of having done the comparison.**The calibrated channel is not logged, and that is a genuine defect.** Recordingtherawchannelas primary is right — calibration is a filter with unpublished behaviour,andyoucannotundobeitundone. But the calibrated channel alongside it is a*free diagnostic*, phyphox does it, and its absencedirectlycaused a multi-day misattribution: a large static field offsetwasread as an external accessory when it was internal to the device.A diagnostic channel I chose not to record would have shown that immediately. It is the cheapestCheapest fix onmythe listand it; needs an app build.**No absolute accuracy validation.** CrowdMag would have caught the same thinga different waydifferently.**One operating system, and a private archive.** The cross-device control leans on other people's corporabecause mine is not shareable.**Dropped samples across long recordings**, reported rather than hidden — and the "zero dropped gaps" figurethat circulatedinmy ownearly notes came from a single short runand does not survive contact with hours of recording.## The wallThe target for reading cardiac activity magnetically is described in the review literature.{% include source.html key="roth2024" %}Thetarget for reading cardiac activity magnetically is described in the review literature {% include cite.html key="roth2024" %}, and thegap between it and a phone is not a factor of a few. It is orders of magnitude, and it is a property of the sensor.That is the part worth stating plainly, because it is where the mentality I started with runs out.Every item inthe"what software can do"list aboveis real,andI would defend all of it asworth building. Not oneof those thingsmoves the floor. They tell you where the floor*is*,theystop you fooling yourself about what is above it, andtheymake a null result mean something — which is a great deal, and is notthe same assensitivity.**The honestHonest summary:.**for what it is actually for —For searchingforweak periodic structure with real nulls—, this is a more careful instrument than the comparators, and the gap is not close. For what the comparators are built for, it is worse, and one of those gaps is a defect rather than a trade-off.## What would change my mindIfAsomeone demonstratesdemonstration that a stock phone magnetometer resolves a signal at the amplitude the cardiac literature describes, under a protocol with real nulls and an injection test, then the sensitivity wall I am describing is not where I think it is and this post is wrong.I would want to see theThe null machinery would need to come before the result,which is— the same standardIappliedam holding myself tohere. -
v2 2026-09-03 15:17 site: images on every post, bigger thumbnails, CTA moves into the sidebar
- odenwald2022image: /assets/posts/fluxgate-magnetometer.jpgimage_alt: >-A fluxgate magnetometer under a glass dome in a museum case, its permalloy cores and mounting plates visible.image_credit: Daderotimage_license: CC0image_license_url: https://creativecommons.org/publicdomain/zero/1.0/image_source_url: https://commons.wikimedia.org/wiki/File:Fluxgate_magnetometer,_of_the_type_installed_in_a_lunar_surface_probe_for_the_Apollo_Project_-_National_Museum_of_Nature_and_Science,_Tokyo_-_DSC07833.JPGsummary: >- -
v1 2026-09-01 12:19 posts: the magnetometer walkthrough, and the wave-information survey
v1: the original version, as first committed. Read it on GitHub →