Skip to content

v0.4.0 — FM that actually works, and one-click updates

Choose a tag to compare

@nigelfenton nigelfenton released this 11 Aug 19:15
· 45 commits to main since this release
40d9b59

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) — one exponential per block instead of one per sample

⚠️ Sample rate matters more than any of this. 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 tcpdump baked in for diagnosis

Known issues

  • Offset tuning leaves a dead band of 0.25 × sample rate at 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