github Stuey3D/VibeSDR exp-37953d6
EXPERIMENTAL 37953d6 — DSP 2-8x faster, VibeServer bookmark/squelch fixes

latest releases: v9.0.1, exp-4917f6f, exp-2bc23c8...
pre-release3 hours ago

⚠️ EXPERIMENTAL — needs an ear test. Supersedes exp-245af06.

The DSP got dramatically cheaper (Local Hardware and VibeServer)

Three real inefficiencies, all found by benchmarking the engine on a Raspberry Pi 3 (tools/pi-bench). Measured on that Pi, one user, 2.4 MSPS, scalar path:

mode before after (Pi, partial)
WFM (stereo+RDS) 286% of a core 108%
NFM 61% 27%
AM 53% 26%
SSB 117% 102% → far lower with the last fix

1. WFM was decimating to 3× its bandwidth. The comment has claimed 1.5x since the day it was written; the code said bwHz*3.0 and git log -L proves it was never anything else — the fix was described and never landed. Worse: at 1.024 MSPS the decimator decimated by one — the whole MPX chain (stereo PLL, 16 RDS decoders, de-emphasis, filters) ran at the full input rate. That's why lowering the sample rate made WFM more expensive, not less.

2. The channel filter decimated 50:1 in a single step, forcing a ~750-tap filter at the full 2.4 MSPS. Now a 5×5×2 cascade: early stages only stop aliases folding into the channel (~9–17 taps), and the narrow filter runs last, at the lowest rate, where taps are cheap.

3. The channel rate never had to be the audio rate. It was floored at 48 kHz — but a 2.8 kHz SSB signal doesn't need a 48 kHz channel. SsbDemod's Weaver filters use a sharp ~80 Hz transition (≈2000 taps, twice, for I and Q), and filter cost scales with rate squared. Running the channel at 12 kHz cuts it ~16×. Audio is still resampled to 48 kHz, so the output is unchanged.

Watch for: WFM stereo on low-end phones (Moto G35, Xcover 4S). The original comment blamed this exact bug for "choppy audio on budget phones" — if stereo now works there, it was CPU starvation all along.

VibeServer fixes

  • Learned RDS bookmarks were never saved. bmLearn() was the one bookmark mutator that never called bmSaveLocked() — a station you genuinely learned lived in memory and died with the process.
  • …and would never have appeared anyway. The web client fetched /bookmarks once, at page load; RDS learning needs ~20s of held PS, so the station you're on is always learned after that. It now polls every 30s, like the native app always has.
  • Squelch no longer reports itself as a fault — was a pulsing red "NO SOUND — IS THE TAB MUTED?" that also hid the S-meter. Now steady amber, meter visible.

Please test

  1. FM stereo + RDS — does it lock, does it sound right? (Especially on the Xcover/G35.)
  2. SSB selectivity — any adjacent-channel bleed? This is the one I'd most expect to have broken.
  3. Sit on an RDS station ~30s → appears in bookmarks, and survives an app restart.
  4. Squelch on, no signal → amber, steady, meter visible.

Don't miss a new VibeSDR release

NewReleases is sending notifications on new releases.