Chirplet Sync Decoder: Distilled Research
Objective
Find the right receiver architecture for Mimir’s continuous acoustic timing
beacon. The immediate question was whether the current BuildChirpletEnergyTrace
and per-symbol matched scoring path is canonical, or whether a standard chirp
decoder trick is missing.
Current Mechanism
The live code currently behaves like a dense sliding matched-filter bank:
for every audio window:
for every time hop:
for every chirplet symbol:
compute normalized dot product against that symbol kernel
keep peaks
classify symbols around peaks
search code-valid triplets
fit source clockThis is legal chirplet analysis, but it is not the machine we want. The expensive chirplet projection is being used as broad discovery. That spends CPU before the timeline/codebook constraints get a vote.
Main Finding
For a controlled synchronization beacon, the better trick is usually dechirp then FFT, not brute-force symbol scoring.
Chirp communication systems, especially LoRa-family decoders, exploit the fact that multiplying a received chirp by the conjugate/reference chirp turns a frequency-shifted chirp into a near-stationary tone. One FFT then reveals the symbol as a peak bin. That changes classification from:
32 full chirplet dot products per event candidateto:
one dechirp multiply + one FFT per event candidateIf symbols use a shared duration, window, and chirp rate, and encode identity as frequency offset or bin, the receiver can classify the whole codebook at once.
What The Sources Say
- Chirplet-transform and matching-pursuit literature supports projection onto chirplet atoms, but that path is general signal analysis. It is expressive and expensive.
- Fast chirplet-transform work exists because naive chirplet dictionaries are costly.
- Practical chirp communication systems avoid exhaustive chirp-shape scoring by designing the waveform so the receiver can dechirp and FFT.
- ChirpMu explicitly contrasts simpler FFT-band chirp symbol decoding with heavier chirp-parameter methods such as STFT/Hough-style approaches.
Design Correction
The codebook should be redesigned to be receiver-cheap.
Current shape:
symbol identity = arbitrary chirp shape:
start band
glide shape
duration
following gap
receiver = score every symbol kernelBetter shape:
symbol identity = FFT-decodable chirp bin:
common chirp duration
common chirp rate
common window
symbol encoded as frequency offset/bin
receiver = dechirp + FFT peakRhythm/gap can still carry timeline evidence, but it should not be the only reason symbol identity survives bad microphones. The acoustic symbol should be cheap and robust by construction.
Intended Decoder Machine
flowchart TD A["audio stream"] --> B["rolling normalized PCM"] B --> C["cheap event/onset proposal"] C --> D["event window"] D --> E["dechirp by reference chirp"] E --> F["FFT / Goertzel bin bank"] F --> G["symbol candidates"] G --> H["gap and de Bruijn triplet decoder"] H --> I["canonical timeline anchors"] I --> J["source clock fit"]
For Mimir’s realtime path, the FFT stage can probably be replaced by a fixed Goertzel/sliding DFT bank over the 32 symbol bins if the symbol spacing is fixed and small. That keeps the same invariant: one common dechirp, many cheap bins.
What To Cut
BuildChirpletEnergyTrace should not remain the primary acquisition path. It
uses the most expensive operation as the first broad scan.
The next coherent implementation cut is:
- Add a new FFT-decodable chirp-bin codebook beside the current codebook.
- Render a deterministic de Bruijn timeline with common chirp slope/window and per-symbol frequency bin.
- Add a synthetic self-test where dechirp+FFT decodes every emitted symbol and recovers the same triplet anchors the current matcher recovers.
- Only then swap live runtime decoding over.
Non-Goals
- Do not keep optimizing dense sliding dot products and call that the final transform. SIMD helped, but the structure is still wrong.
- Do not add outlier filters to hide weak symbol identity.
- Do not preserve the arbitrary-shape codebook just because it exists. The transmitter is ours. Make it serve the receiver.
Open Questions
- Best event proposal: amplitude/onset novelty, broadband high-frequency energy, one reference dechirp energy trace, or a small slope bank.
- FFT size/bin spacing at 44.1 kHz and 48 kHz so all mics can decode without resampling artifacts creating bin ambiguity.
- Whether to keep one chirp slope or use a tiny slope bank for robustness.
- How musical the emitted pattern can remain when symbol identity is constrained to FFT bins.
- Whether Goertzel bins beat full FFT for the expected symbol count and event cadence.
