v0.4.0 — FM that actually works, and one-click updates
Aether-gate presents any radio to AetherSDR as a Flex 6000. This release makes the SDR path
genuinely usable — FM actually works now — and adds one-click updating so the appliance can keep
itself current without a terminal.
If you are running 0.3.0, this is the one to take
FM was silently an SSB detector. The soapy adapter had no FM demodulator at all: selecting FM
ran the signal through the SSB path, which sounds wrong and cannot decode anything. 1200-baud AX.25
packet (AFSK inside FM) was impossible. Now there is a real NBFM discriminator.
Updating
New: the setup page offers updates itself. When a newer release exists, a banner appears at
http://<your-gate>:8730 with an Install update button. It downloads the release, swaps it in,
and — if the new version will not start — puts the working one back and tells you so. No SSH, no
commands.
It will not update while the gate is running; press Stop first, then Start afterwards.
Radio / SDR
- Real NBFM demodulation — FM, and therefore FM packet, works
- An S-meter — the adapter previously reported no signal level at all
- SSB sideband selection fixed — USB and LSB were mathematically identical
(real(conj(z)) == real(z)), so both sidebands folded together on every SSB signal since the
adapter was written - The demodulator is no longer parked on the DC spike — offset tuning moves the hardware centre
away from the signal you are listening to - The panadapter shows the right span — it was labelling full-rate data with whatever span
AetherSDR asked for, compressing the display - Audio no longer starves at odd sample rates — floor decimation plus a fractional resampler
(a rounding bug used to click every ~1.3 seconds regardless of band or mode) - Waterfall tiles encode VitaFrequency correctly for AetherSDR ≥ #4412
Performance
The audio path was over its real-time budget on a Pi, dropping IQ blocks and producing chopped
audio. Three measured optimisations, none of which change what comes out:
| measured on a Pi 4 | |
|---|---|
| Panadapter binning | 187× faster — it was consuming 82% of the engine loop |
| Decimating filters | up to 6.1× — only the samples that survive decimation are computed |
| Mixer (NCO) | 4× — one exponential per block instead of one per sample |
samp_rate // 24000 can land on a prime number,
which collapses the staged decimation into one huge filter: 2.000 MS/s is 3.6× more expensive
than 2.040 MS/s for that reason alone. If you have a choice, use 2.040 MS/s.
This is better, not finished — on a Pi 4 at 2 MS/s the audio path still runs at roughly half the
rate it needs, so heavily loaded setups may still hear breakup.
Hardware and deployment
- SDRplay RSP support (RSP1A/RSP1B/RSP2/RSPduo/RSPdx) with a pinned API 3.15.2
- A publishable Pi appliance image — flash it and go
- Assorted deploy fixes, and
tcpdumpbaked in for diagnosis
Known issues
- Offset tuning leaves a dead band of
0.25 × sample rateat the low edge of the panadapter —
that part of the span was never sampled, and it paints as an empty rectangle. See #37. - On a Pi 3, audio breakup at 2 MS/s is expected; a Pi 4 is better but not clear.
Full changelog: v0.3.0...v0.4.0