Preflight
Problem
ESSB / round-table SSB operators run a range of TX filter widths (e.g. 2.7k, 3.5k, 4k, asymmetric like 50–3500). To hear each station well you have to re-adjust the RX passband by hand every time the conversation moves to a different station. AetherSDR already receives the full-bandwidth panadapter FFT — it has the data to fit the filter automatically.
Proposal
An optional, per-SSB-slice "Adaptive RX filter" that measures the occupied bandwidth of the tuned signal from the panadapter FFT and continuously fits both passband edges to it — within operator-set bounds, stably (no twitching) and smoothly (glides, no abrupt jumps), and cutting off adjacent splatter so clarity of the wanted signal has priority.
- Config lives on the VFO flag's Mode tab: a checkbox + two bounds — Min low-cut {0/50/100/200, default 0} and Max high-cut {3000/3500/4000/6000, default 4000}. Adaptive never goes outside these.
- Status: the flag's filter readout shows AUTO while a live fit is applied; floor-level edge markers (SmartMTR-extreme style) sit on the panadapter filter edges.
- Fallback: when the signal is weak / not sharp / ambiguous, it applies the operator's currently selected filter preset (normal manual behavior).
- Entirely client-side: drives the existing
filt command. No firmware change, no new threads, no new audio DSP. The filter stays radio-authoritative (never persisted); only the client-side enable + bounds config is persisted.
Cross-platform impact
Linux / macOS / Windows: identical. Pure Qt6/C++ client logic plus a QPainter overlay; no platform-specific code paths.
Alternatives considered
- One-shot "snap to fit" button — simpler, but needs a press per station; doesn't solve a live rotating QSO.
- More fixed presets — the status quo, and the exact pain point this addresses.
Implementation scope
- New
src/core/AdaptiveFilterEngine (GUI-thread measurement/control coordinator).
- Reuses existing
VoiceSignalDetector (width measurement) and SpectrumWidget noise floor.
- Small additions to
SliceModel (client-side state), VfoWidget (Mode-tab controls + AUTO label), SpectrumWidget (edge markers); wiring in MainWindow_Wiring.cpp.
- Touches
CMakeLists.txt for the new files (→ maintainer review).
- Known risks / needs maintainer sign-off: DSP tuning needs on-air iteration; the UX, marker visuals, label, and default bounds are design decisions for the maintainer.
Preflight
Problem
ESSB / round-table SSB operators run a range of TX filter widths (e.g. 2.7k, 3.5k, 4k, asymmetric like 50–3500). To hear each station well you have to re-adjust the RX passband by hand every time the conversation moves to a different station. AetherSDR already receives the full-bandwidth panadapter FFT — it has the data to fit the filter automatically.
Proposal
An optional, per-SSB-slice "Adaptive RX filter" that measures the occupied bandwidth of the tuned signal from the panadapter FFT and continuously fits both passband edges to it — within operator-set bounds, stably (no twitching) and smoothly (glides, no abrupt jumps), and cutting off adjacent splatter so clarity of the wanted signal has priority.
filtcommand. No firmware change, no new threads, no new audio DSP. The filter stays radio-authoritative (never persisted); only the client-side enable + bounds config is persisted.Cross-platform impact
Linux / macOS / Windows: identical. Pure Qt6/C++ client logic plus a QPainter overlay; no platform-specific code paths.
Alternatives considered
Implementation scope
src/core/AdaptiveFilterEngine(GUI-thread measurement/control coordinator).VoiceSignalDetector(width measurement) andSpectrumWidgetnoise floor.SliceModel(client-side state),VfoWidget(Mode-tab controls + AUTO label),SpectrumWidget(edge markers); wiring inMainWindow_Wiring.cpp.CMakeLists.txtfor the new files (→ maintainer review).