Skip to content

[RFC] Adaptive RX filter for SSB (ESSB auto-fit) #3878

Description

@dsocha

Preflight

  • I have read GOVERNANCE.md and confirmed this change requires an RFC (new UX + visual design + new feature area)
  • I have searched existing issues and this RFC has not been proposed before
  • I have not opened a PR for this change yet

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.

Metadata

Metadata

Assignees

No one assigned

    Labels

    GUIUser interfaceNew FeatureNew feature requestspectrumPanadapter and waterfall

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions