Docs · Using SondeFox
Decoder support
Every decoder in SondeFox runs inside libsonde, a portable C++17 core with no radio, USB, or UI dependencies — the exact same code powers the Android app, the host-side sonde_replay CLI, and the desktop SDR++ plugin. This page explains the decode pipeline and gives an honest status for each sonde type.
How decoding works
From antenna to telemetry, one frame of a radiosonde signal passes through this chain:
- IQ capture
The Airspy streams 12-bit samples over USB OTG; the capture bridge synthesizes complex IQ and pushes blocks into a lock-free ring for the DSP thread.
- Channelize & demodulate
A DC blocker, frequency translator, and decimator isolate the sonde's channel (about ±5 kHz for RS41), then a narrow-FM/GFSK demodulator recovers the baseband waveform.
- Bit sync
Symbol-timing recovery locks onto the bit clock (4800 baud for RS41), and matched-filter header correlation identifies the sonde type and finds frame boundaries.
- Frame decode
The frame is de-whitened and split into its sub-packets — for RS41, TLV packets carrying serial, GPS, and PTU data inside a 320-byte frame.
- Error correction
Forward error correction repairs channel damage — two interleaved Reed-Solomon RS(255,231) codewords for RS41, Hamming(8,4) for DFM — and per-packet CRC-16 checks gate what counts as a valid frame.
- Telemetry
The parser converts raw fields into position, velocity, altitude, and UTC time (ECEF → WGS84 for RS41), plus temperature and humidity once enough calibration data has accumulated. Results feed the map, the chase pointer, and (opt-in) SondeHub.
Because the core is hardware-agnostic, every decoder can be exercised offline: sonde_replay plays recorded .cf32 IQ or .wav files through the identical pipeline, which is how new decoders are developed and regression-tested before they ever touch a live signal.
Status matrix
| Sonde type | Status | Notes |
|---|---|---|
| RS41 (Vaisala) | Beta | Full decode: serial, GPS position/velocity, and PTU with real calibration math. Reed-Solomon RS(255,231) error correction; PTU unlocks after the 51-subframe calibration accumulator fills. Validated end-to-end against synthetic IQ; live over-the-air reception from a real Airspy is what the beta is proving in the field. |
| DFM06 / DFM09 / DFM17 (Graw) | In validation | Detection, framing, and GPS extraction wired through the pipeline with Hamming(8,4) error correction. Caveat: DFM serials are unreliable until they stabilize across several frames. |
| M10 / M20 (Meteomodem) | In validation | Shared decoder with checkM10 checksum verification. M10 runs at ≈9616 baud vs the M20's 9600; the two are disambiguated by the frame's type byte. |
| iMet-4 / iMet-54 (Intermet) | Roadmap | Registry entry and detection surface exist; decoder not yet implemented. |
| LMS6 (Lockheed Martin) | Roadmap | Planned; not yet implemented. |
| Meisei | Roadmap | Planned; not yet implemented. |
| MRZ | Roadmap | Planned; not yet implemented. |
| MTS01 | Roadmap | Planned; not yet implemented. |
These decoders are implemented and unit-tested against synthetic signals — the framing, error correction, and GPS extraction all pass on generated test data. What they haven't had yet is a real flight: over-the-air captures with genuine fading, Doppler, and frequency drift. That is exactly where beta testers help most — if DFM or M10/M20 sondes fly near you, your field reports (and IQ recordings) move a decoder from "in validation" to validated.
SondeFox is in beta, and we keep the tiers strict: only RS41 is marketed as working, roadmap types are never listed as supported, and "in validation" means exactly that — a decoder's status doesn't advance until it has proved itself against real signals in the field. If a listed status ever looks stale, tell us at [email protected].