Find a faint resonance in noise. Refuse when you can't.
Module 1 is a signal-processing simulation. It plants a resonance in synthetic noise, calibrates with a chirp, and recovers it with bandpass filtering, FFT, STFT and matched-FM tracking. A self-check gate refuses to report when the model doesn't fit or the signal-to-noise ratio is too low.
1 Module 1 static demo, seed 42 · /data/neurophonics.json · spectrum 2 Module 1 gate configuration · gate.thresholds
Six steps from noise to a refusal.
The simulation plants the signal it then finds.
The script plants the tone and then recovers it. Recovery validates the filters, not any real-world claim. That honesty is the point: an instrument that can't find a resonance we put there ourselves has no business reporting anything else.
In this run, Module 1 planted a 245 Hz tone and its static FFT found the peak at 246.219 Hz. The matched-FM tracker fitted 213.800 Hz to a resonance planted at 213.8 Hz, with a mean error of 0.013 Hz. The self-check gate refused on two of three segments of a constructed record (MODEL_MISMATCH below fit quality 0.70, CRITICAL_LOW_SNR below −3.0 dB coherent SNR). Against the simulation's own 4.8 Hz pass/fail line, the static FFT, STFT and matched-FM estimators break down below −22.5, −17.5 and −22.5 dB SNR.
-
Step 1 · Raw input
Noise.
Synthetic input: a 1.2 Hz pulse train, a narrowband tone and broadband noise. The tone is planted at 245 Hz, and you can't see it. We know the answer because we put it there. That is how you test an instrument honestly.
PLANTED · KNOWN ANSWER · 245 Hz
-
Step 2 · Bandpass
Narrow the band.
An adaptive Butterworth bandpass, zero-phase, keeps 228.2–264.2 Hz and drops everything else. What was buried is a clean oscillation, about a quarter the height of the noise that hid it.
PASS BAND · 228.2–264.2 Hz
-
Step 3 · Spectrum
Find the peak.
A Hann-windowed FFT, raw against bandpassed. The cleaned trace has one peak, at 246.219 Hz: 1.219 Hz above the planted 245 Hz. The record carries a 1.2 Hz modulation, and a static FFT locks onto its first sideband instead of the carrier. We print the error rather than round it away.
RECOVERED · 246.219 Hz
-
Step 4 · Spectrogram
Track it.
A second record, with a resonance planted at 213.8 Hz that swings ±2 Hz at 1.2 Hz. The STFT waterfall rolls in, time running down. Dashed: what we planted. Solid: the matched-FM fit, centre 213.800 Hz, mean error 0.013 Hz. The plain STFT peak tracker's median error is 0.261 Hz.
MATCHED-FM · 213.800 Hz · MEAN ERROR 0.013 Hz
-
Step 5 · Self-check gate
Refuse.
Every window, the gate asks whether the locked model still explains the signal. Coherent SNR under −3.0 dB: CRITICAL_LOW_SNR. Fit quality under 0.70: MODEL_MISMATCH. The record is constructed from the module's own generators: a matched segment, a wrong modulation rate, then a signal buried in noise. Below this line, Module 1 doesn't guess. It refuses.
REFUSED · MODEL_MISMATCH · CRITICAL_LOW_SNR
-
Step 6 · SNR sweep
Where each method breaks.
100 runs at each of 15 SNR levels, +10 to −25 dB. The dashed line at 4.8 Hz is the simulation's own pass/fail line on mean error, not an accuracy figure. The static FFT holds to −22.5 dB, the STFT tracker to −17.5 dB, the matched-FM tracker to −22.5 dB. Past that, each would be guessing.
BREAKDOWN · −22.5 / −17.5 / −22.5 dB
Every number here came out of the module.
Hz, the static FFT's peak for a tone planted at 245 Hz. Off by 1.219 Hz, and we say so.
neurophonics.json · spectrum.recoveredPeakHzHz mean error of the matched-FM tracker against the planted path.
neurophonics.json · track.matchedFmHz: the simulation's own pass/fail line on mean error. Not an accuracy figure.
neurophonics.json · sweep.errorThresholdHzGate scenarios run. The gate refused on 4 of them.
neurophonics.json · gate.scenariosRecovered peak 212 Hz against a model resonance of 213.8 Hz; median relative error 0.36%, worst 2.85%. The echo is synthesised from the same assumed resonator model, so this checks the system-identification maths only.
| Scenario | Fit quality | Coherent SNR | Gate |
|---|---|---|---|
| Matched model, noise σ 1.0 | 0.915 | 9.65 dB | OK |
| Matched model, noise σ 3.0 | 0.962 | 0.89 dB | OK |
| Matched model, noise σ 30 (signal buried) | 0.535 | −10.55 dB | CRITICAL_LOW_SNR |
| Wrong modulation rate (1.9 Hz instead of 1.2 Hz) | 0.570 | 10.77 dB | MODEL_MISMATCH |
| Wrong modulation rate (2.3 Hz instead of 1.2 Hz) | 0.661 | 11.88 dB | MODEL_MISMATCH |
| Linear frequency drift (non-sinusoidal) | 0.135 | −2.75 dB | MODEL_MISMATCH |
Rules, in order: CRITICAL_LOW_SNR if coherent SNR < −3.0 dB (checked first); MODEL_MISMATCH if fit quality < 0.70; OK otherwise. Fit quality is the achieved model coherence over the coherence achievable at the measured noise level.
- Exported
- 2026-10-18 20:01 UTC
- Sample rate
- 2000 Hz
- Libraries
- numpy 2.5.0 · scipy 1.18.0
- Module source sha256
1efdd76aa1d7c075270eed53f92839a2c0a9d98b62ef5b268358452473af8b7f- This file's sha256
computed in your browser when scripts run- Scenarios
- raw/clean/spectrum reproduce the module's static demo (8 s, seed 42, last case); spectrogram/track reproduce its tracking demo (seed 7, noise σ 1.0); gate, sweep and chirp reproduce their own demos. Each section lists its planted frequency.
A refusal is a result.
Most instruments are built to always produce a number, and that is the dangerous kind. A reading taken from a model that no longer fits, or from a signal the noise has swallowed, looks exactly like a good one on a screen. Module 1 checks itself before it speaks. If the coherent SNR falls under its floor, or the fit stops explaining the signal, it returns a named code instead of a frequency. That code is a result: it marks where the method ends, which is the one thing a guess can never tell you. An instrument that says nothing when it can't be sure is more useful than one that always answers.
Flight Rule plate · Document FR-4 This instrument answers to FR-4: Bend, don't break. Refuse rather than guess. When we don't know, we say so. Unknown never quietly becomes yes, and never quietly becomes no. Read the flight rulesWhat it does. What it never claims.
What it does
- Plants a known resonance in synthetic noise, then recovers it.
- Calibrates with a 50–500 Hz chirp before it looks.
- Narrows the band, finds the peak with an FFT, and tracks it with STFT and matched-FM.
- Refuses, with a named code, when the model doesn't fit or the SNR is too low.
- Publishes its own errors, including the 1.219 Hz its static FFT gets wrong.
What it never claims
- It is not a medical device.
- It does not measure or estimate anything about a person.
- It has no medical or regulatory status.
- It never runs on recordings: every signal is synthetic.
- Finding a tone it planted proves the filters, not any real-world claim.
- The 4.8 Hz line is the simulation's own pass/fail line, not its accuracy.
Briefing: common questions
What is NeuroPhonics Module 1?
A signal-processing simulation. It plants a resonance in synthetic noise, calibrates with a chirp, and recovers the resonance with bandpass filtering, FFT, STFT and matched-FM tracking.
Does NeuroPhonics use real data or measure anything about a person?
No. Module 1 runs on synthetic signals only. It does not measure or estimate anything about a person.
Is NeuroPhonics a medical device?
No. It is not a medical device, it makes no medical claim, and it has no medical or regulatory status. It is a simulation for research only.
Why does Module 1 refuse to report?
A self-check gate refuses to report when the model doesn’t fit or the signal-to-noise ratio is too low. An instrument that says nothing when it can’t be sure is more useful than one that always answers. That is our fourth flight rule: bend, don’t break.
Why plant a known answer in the noise?
We know the answer because we put it there. That is how you test an instrument honestly: if it can’t recover a resonance we planted ourselves, it has no business reporting anything else.
Can I use NeuroPhonics?
It is research only, and it stays a simulation. Follow the research on LinkedIn.
Follow the research.
Module 1 is a simulation, and it stays one. Updates on the research, including the runs where it refuses, go out on LinkedIn.