Highlights
NVIDIA NIM BNR — GPU-Accelerated AI Noise Removal (#288)
A world first for SDR clients. AetherSDR v0.7.6 introduces real-time GPU-accelerated neural noise removal powered by NVIDIA Maxine BNR, running on your local RTX GPU via a self-hosted Docker container.
- Neural denoising trained on massive audio datasets — superior to classical spectral (NR2) and RNNoise (RN2) approaches
- Real-time gRPC streaming — 48kHz mono float32, 10ms processing chunks, ~15ms total added latency
- Intensity control — adjustable denoising strength (0–100%) via slider in DSP panel
- Jitter buffer — 50ms priming for smooth, uninterrupted playback
- Container management — Start/Stop/Status in Radio Setup → Audio, optional autostart on app launch
- Zero-config audio — BNR button in VFO DSP tab and spectrum overlay, 3-way mutual exclusion with NR2/RN2
Requirements: NVIDIA RTX 4000+ GPU (Ada Lovelace or newer), Docker + NVIDIA Container Toolkit, NGC API key (free).
# One-time setup:
docker login nvcr.io # Username: $oauthtoken, Password: <NGC API key>
docker run -d --gpus all --shm-size=8gb \
-p 8001:8001 -p 8000:8000 \
-e NGC_API_KEY=$NGC_API_KEY \
-e STREAMING=true \
--restart unless-stopped \
--name maxine-bnr \
nvcr.io/nim/nvidia/maxine-bnr:latest
# Build AetherSDR with BNR support:
cmake -B build -G Ninja -DCMAKE_BUILD_TYPE=RelWithDebInfo -DENABLE_BNR=ON
cmake --build build -j$(nproc)ESC Diversity Beamforming (#20, #38)
- DIV toggle in VFO audio tab enables dual-SCU diversity reception
- ESC controls — polar display (phase=angle, gain=radius), horizontal phase slider (0–360° in 5° steps), vertical gain slider (0.0–2.0)
- Real-time ESC meter — signal strength bar after ESC processing
- Protocol verified against SmartSDR pcap:
esc=on/off, phase in radians, DiversityChild guard per FlexLib - Requires DIV_ESC license (SmartSDR+) and dual-SCU radio
Band Zoom Buttons
- S (Segment) and B (Band) buttons at bottom-left of waterfall
- Uses radio-native
segment_zoom=1/band_zoom=1commands (SmartSDR protocol)
Bug Fixes
- XVTR band switch crash — QPointer prevents SEGV when panadapter destroyed during band change
- CW decoder not working on first pan — initial applet wasn't wired through setActivePanApplet()
- Band change panadapter not scrolling — use tuneAndRecenter() instead of autopan=0
- VFO widget not shrinking — fixed setFixedWidth constraining height when ESC panel hidden
- Null pointer guards — m_panApplet checked before setCwPanelVisible() calls
Build
# Standard build (no BNR):
cmake -B build -G Ninja -DCMAKE_BUILD_TYPE=RelWithDebInfo
cmake --build build -j$(nproc)
# With BNR (requires grpc++ package):
cmake -B build -G Ninja -DCMAKE_BUILD_TYPE=RelWithDebInfo -DENABLE_BNR=ON
cmake --build build -j$(nproc)73, Jeremy KK7GWY & Claude (AI dev partner)