Skip to content

Feature/issue 277 nb waterfall blanking#506

Closed
boydsoftprez wants to merge 4 commits into
aethersdr:mainfrom
boydsoftprez:feature/issue-277-nb-waterfall-blanking
Closed

Feature/issue 277 nb waterfall blanking#506
boydsoftprez wants to merge 4 commits into
aethersdr:mainfrom
boydsoftprez:feature/issue-277-nb-waterfall-blanking

Conversation

@boydsoftprez

Copy link
Copy Markdown
Collaborator

NB Waterfall Blanking

Closes #277

Overview

Client-side impulse suppression in the waterfall when NB or NB2 is active. Pure post-processing on VITA-49 tile data — no effect on radio DSP, audio path, or protocol.


Background

When NB is enabled, noise blanking suppresses impulse noise in the audio path — but the waterfall still shows bright horizontal streaks from the same impulses because the radio sends raw tile data unaffected by the DSP chain.


Implementation

The blanker runs inside SpectrumWidget::updateWaterfallRow() between the tile decode step and the ring-buffer write. It maintains a 32-slot rolling ring buffer of per-row mean intensity values. When a new row's mean exceeds baseline × threshold, it is classified as an impulse and replaced before being written to the waterfall image.

Mode Behaviour
Fill (default) Row replaced with intensityToRgb(baseline) — the current noise-floor colour
Interpolate Row replaced with the last non-blanked scanline

The ring buffer resets whenever NB is disabled, the blanker is toggled off, or the threshold changes — so the baseline re-warms cleanly on next enable rather than carrying stale data forward.

The Auto with WNB option links the blanker to the hardware WNB toggle in lockstep, so users who always run WNB don't need to manage the blanker separately.


New UI controls (Display sub-panel)

  • NB Wf — enable/disable toggle
  • Mode — Fill / Interpolate combo
  • Threshold — slider 1.05–2.00 (lower = more aggressive, default 1.15)
  • Auto with WNB — automatically follows the WNB button state

All four values persist to AppSettings per-pan:
WaterfallBlankingEnabled_N, WaterfallBlankingMode_N, WaterfallBlankingThreshold_N, WaterfallBlankingAutoWithWNB_N


Files changed

File Change
src/gui/SpectrumWidget.cpp / .h Blanker logic, setWfBlanker* setters, setNbActive, loadSettings round-trip
src/gui/SpectrumOverlayMenu.cpp / .h Four blanker controls in Display sub-panel, syncDisplaySettings updated
src/gui/MainWindow.cpp Wire wfBlankerEnabledChanged, wfBlankerModeChanged, wfBlankerThresholdChanged, wfBlankerAutoWithWnbChanged signals
src/core/LogManager.cpp / .h Add lcPerf / aether.perf category for render timing
scripts/cpu-monitor.sh Per-thread CPU monitor helper script
scripts/render-profile.sh Render timing profiler (reads lcPerf log output)
.github/workflows/windows-installer.yml Sanitise tag name slashes in ZIP filename

Screenshot

image

Test

  • Enable NB on a noisy band — waterfall impulse streaks suppressed
  • Switch Fill ↔ Interpolate — visual difference confirmed
  • Threshold 1.05 (aggressive) vs 1.80 (conservative) — blanking rate scales correctly
  • Auto with WNB — blanker follows WNB toggle without manual intervention
  • Disable NB — ring buffer clears, normal waterfall resumes immediately
  • All four blanker settings persist across restart

boydsoftprez and others added 4 commits March 31, 2026 16:42
Client-side per-row impulse suppression for the waterfall display.
When NB or NB2 is active for a slice and the blanker is enabled,
incoming waterfall tile rows are inspected before rendering:

- Compute per-row mean intensity from raw (pre-colourmap) VITA-49 bins
- Maintain a 32-row rolling baseline via ring buffer
- Rows exceeding baseline × threshold are replaced with noise-floor
  colour (Fill mode) or the last good row (Interpolate mode)
- WF● indicator in spectrum area lights cyan when blanking fires
- All settings persist via AppSettings (WaterfallBlanking*)
- Auto-enable with WNB option (WaterfallBlankingAutoWithWNB)
- Controls in Display sub-panel of SpectrumOverlayMenu

No protocol changes — pure client-side post-processing on tile data.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
@boydsoftprez boydsoftprez deleted the feature/issue-277-nb-waterfall-blanking branch April 3, 2026 15:54
M7HNF-Ian added a commit to M7HNF-Ian/AetherSDR that referenced this pull request Apr 19, 2026
MNR uses a decision-directed MMSE-Wiener filter with minimum-statistics
noise floor tracking, accelerated by Apple Accelerate (vDSP / AMX).
512-point FFT at 24 kHz, 50% overlap-add, per-bin gain with temporal
smoothing to suppress musical noise. Hardware-accelerated on Apple Silicon.
Right-click the MNR button to open strength controls in DSP Settings.

Quick-wins:
- aethersdr#1503: Diversity button missing on Slice A at startup
- aethersdr#1581: TNF/FDX indicators invisible in dark theme
- aethersdr#1583: Date/Time status bar labels too dim
- aethersdr#1576: Record/Playback buttons invisible in dark theme
- aethersdr#506:  Secondary text colour consistency (#506070 → #8aa8c0)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
M7HNF-Ian added a commit to M7HNF-Ian/AetherSDR that referenced this pull request Apr 19, 2026
MNR uses a decision-directed MMSE-Wiener filter with minimum-statistics
noise floor tracking, accelerated by Apple Accelerate (vDSP / AMX).
512-point FFT at 24 kHz, 50% overlap-add, per-bin gain with temporal
smoothing to suppress musical noise. Hardware-accelerated on Apple Silicon.
Right-click the MNR button to open strength controls in DSP Settings.

Quick-wins:
- aethersdr#1503: Diversity button missing on Slice A at startup
- aethersdr#1581: TNF/FDX indicators invisible in dark theme
- aethersdr#1583: Date/Time status bar labels too dim
- aethersdr#1576: Record/Playback buttons invisible in dark theme
- aethersdr#506:  Secondary text colour consistency (#506070 → #8aa8c0)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
ten9876 pushed a commit that referenced this pull request Apr 21, 2026
Five small contrast/visibility fixes, applied from #1672 with the macOS
MNR scope held back for separate review + on-platform testing.

- #1576 — Record / Play buttons unreadable in dark theme.  Record
  \`#804040\` → \`#d04040\`, Play \`#406040\` → \`#70b070\`, disabled state
  \`#303030\` → \`#505050\`.
- #1581 — TNF and FDX status indicators invisible in active state on
  dark theme.  Active color switched from \`rgba(255,255,255,128)\` (dim
  half-white) to \`#00e060\` (bright green), matching the TGXL/PGXL
  OPERATE indicator style.  Inactive \`#404858\` unchanged.
- #1583 — GPS date/time status labels and radio version label too dim.
  \`#607080\` / \`#506070\` → \`#8aa8c0\` to match the other status-bar
  labels.  GPS date label was also at the wrong size (10 px vs the
  surrounding 12 px); now aligned.
- #506 — Secondary-text colour consistency pass.  \`#607080\` / \`#506070\`
  → \`#8aa8c0\` across MqttApplet, EqApplet, DxClusterDialog,
  WhatsNewDialog.
- #1503 — Diversity button missing on Slice A at startup.  Previous
  loop only touched the active pan's active VFO widget; now iterates
  every pan → every slice so every VFO widget gets the diversity-
  allowed flag set when the radio supports it.

Scope creep held for a follow-up commit: the macOS MNR DSP path
(MacNRFilter, AudioEngine integration, DSP-dialog tab, spectrum overlay
MNR toggle, VFO MNR button).  Will land separately after on-platform
testing.

One hunk from #1672 was skipped because its target no longer exists:
the AppletPanel grip-handle label was retired with the old
AppletTitleBar in ba61f48.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Noise Blanker–Gated Waterfall Impulse Suppression

1 participant