Skip to content

fix(rade): align filter passband with FreeDV waveform convention#3301

Merged
jensenpat merged 1 commit into
aethersdr:mainfrom
NF0T:pr/rade-filter-passband-alignment
May 31, 2026
Merged

fix(rade): align filter passband with FreeDV waveform convention#3301
jensenpat merged 1 commit into
aethersdr:mainfrom
NF0T:pr/rade-filter-passband-alignment

Conversation

@NF0T

@NF0T NF0T commented May 30, 2026

Copy link
Copy Markdown
Collaborator

Summary

  • RADE activateRADE() previously set the slice filter to the full 0–3500 Hz range, which does not match the RADE OFDM modem's actual audio passband
  • Changed to 750–2250 Hz (DIGU) / −2250 to −750 Hz (DIGL) — centre 1500 Hz, width 1500 Hz — matching the freedv-waveform Docker reference implementation
  • Tighter passband improves interference immunity by excluding spectral regions the modem never uses (DC offset, carrier leakage, 2250–3500 Hz)

Test plan

  • Enable RADE on a USB band (20m) — confirm filter display shows 750–2250 Hz
  • Enable RADE on an LSB band (40m) — confirm filter display shows −2250 to −750 Hz
  • Disable RADE — confirm previous filter is restored correctly
  • Verify RADE audio encodes/decodes end-to-end with the new passband

Fixes #3300. Principle I.

🤖 Generated with Claude Code

Set RADE slice filter to 750–2250 Hz (centre 1500 Hz, width 1500 Hz)
instead of 0–3500 Hz, matching the freedv-waveform Docker reference
implementation. DIGL mirrors at −2250 to −750 Hz.

Fixes aethersdr#3300. Principle I.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
@NF0T NF0T requested a review from a team as a code owner May 30, 2026 22:42

@jensenpat jensenpat left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Confirmed this is localized to RADE activation. The diff only changes the setFilterWidth values inside MainWindow::activateRADE after RADE chooses DIGU/DIGL, and it does not touch the shared DIGU/DIGL filter handling used by regular digital modes like FT8.

Regular digital USB/LSB still flows through the existing mode/filter controls, including VfoWidget presets/manual edges, spectrum filter changes, EQ cutoff conversion, and SliceModel::setFilterWidth. Those paths keep their existing offsets and presets; only the RADE-specific activation passband changes to the FreeDV waveform convention.

@jensenpat jensenpat merged commit 73117bb into aethersdr:main May 31, 2026
5 checks passed
jensenpat pushed a commit that referenced this pull request Jun 2, 2026
…keyboard nav (#3303)

Companion to #3288 (Phase 2 accessibility audit), per maintainer
guidance from @jensenpat.

Addresses all four issues from the @jensenpat review on the previous
iteration.

## What's in this PR

### Phase 2a — `setAccessibleName` on previously unnamed widgets

All changes are additive, no behavioral risk.

**MeterApplet** (`MeterApplet.cpp`): PA temperature, supply voltage,
main fan speed gauges

**AmpApplet** (`AmpApplet.cpp`): Forward power, SWR, drain current
gauges — rebased onto the new row-label/ballistics layout from #3301

**TunerApplet** (`TunerApplet.cpp`): Forward power, SWR gauges + C1/L/C2
relay bars — rebased onto the same row-label refactor

**SpectrumWidget** (`SpectrumWidget.cpp`): "Panadapter spectrum display"

**TciApplet / DaxApplet**: RX 1–N gain sliders, TX gain slider (named in
loop)

### Phase 2b — Live accessibility announcements

**VFO frequency** (`VfoWidget.cpp` / `VfoWidget.h`):
- `updateFreqLabel()` now routes through
`scheduleFrequencyAnnouncement()` — a 300 ms single-shot debounce timer
that fires once the frequency settles, preventing VoiceOver from being
asked to speak ~20 times/second during active wheel tuning
- LOCKED state announces immediately (user-triggered, infrequent) but
suppresses repeats while the 500 ms lock-feedback gate is active

**S-meter** (`SMeterWidget.cpp`):
- `setFocusPolicy(Qt::TabFocus)` added — widget is keyboard-reachable
- `setLevel()` announces the *displayed* value, not raw dBm: in S-Meter
Peak mode the event value is derived from `m_peakDbm` (what the needle
and text readout show), not `m_levelDbm`; formatted as "S7, -79 dBm" to
match the painted readout exactly

**MeterSlider** (`MeterSlider.h`):
- `setFocusPolicy(Qt::TabFocus)` added — DAX/TCI gain sliders are now
keyboard-reachable
- `keyPressEvent` handler: Left/Down −5%, Right/Up +5% — gain thumb is
adjustable without a mouse

### Phase 2c — VFO tab bar: `QLabel` → `QPushButton`

VFO tab labels were `QLabel` with a click event filter; VoiceOver could
not activate them. Replaced with `QPushButton` throughout
(`VfoWidget.cpp`, `VfoWidget.h`).

### Phase 2d — Keyboard navigation: RelayBar + PhaseKnob

- `RelayBar` gains arrow-key support (Left/Right step through relay
positions)
- `PhaseKnob` excluded from the tab order (it is already accessible via
the paired ESC sliders)

## Test notes

On macOS with VoiceOver:
1. Tab to the S-meter — subsequent signal level changes should be spoken
as "S7, -79 dBm" etc.
2. Tune the VFO wheel quickly — VoiceOver speaks once after tuning
settles (not on every step)
3. Lock the VFO — VoiceOver speaks "LOCKED" once
4. Tab to a DAX/TCI gain slider — Left/Right arrows move the thumb
5. VFO tab bar buttons ("DSP", "USB", "X/RIT", "DAX") are activatable
via VoiceOver

— AI5OS (@w9fyi)
@NF0T NF0T deleted the pr/rade-filter-passband-alignment branch June 3, 2026 01:05
G6PWY-Chris pushed a commit to G6PWY-Chris/AetherSDR that referenced this pull request Jun 22, 2026
…hersdr#3301)

Limit the RADE activation filter to the FreeDV waveform passband: 750-2250 Hz for DIGU and -2250 to -750 Hz for DIGL.

This change is localized to MainWindow::activateRADE and does not alter the regular DIGU/DIGL filter handling used by modes such as FT8.
G6PWY-Chris pushed a commit to G6PWY-Chris/AetherSDR that referenced this pull request Jun 22, 2026
…keyboard nav (aethersdr#3303)

Companion to aethersdr#3288 (Phase 2 accessibility audit), per maintainer
guidance from @jensenpat.

Addresses all four issues from the @jensenpat review on the previous
iteration.

## What's in this PR

### Phase 2a — `setAccessibleName` on previously unnamed widgets

All changes are additive, no behavioral risk.

**MeterApplet** (`MeterApplet.cpp`): PA temperature, supply voltage,
main fan speed gauges

**AmpApplet** (`AmpApplet.cpp`): Forward power, SWR, drain current
gauges — rebased onto the new row-label/ballistics layout from aethersdr#3301

**TunerApplet** (`TunerApplet.cpp`): Forward power, SWR gauges + C1/L/C2
relay bars — rebased onto the same row-label refactor

**SpectrumWidget** (`SpectrumWidget.cpp`): "Panadapter spectrum display"

**TciApplet / DaxApplet**: RX 1–N gain sliders, TX gain slider (named in
loop)

### Phase 2b — Live accessibility announcements

**VFO frequency** (`VfoWidget.cpp` / `VfoWidget.h`):
- `updateFreqLabel()` now routes through
`scheduleFrequencyAnnouncement()` — a 300 ms single-shot debounce timer
that fires once the frequency settles, preventing VoiceOver from being
asked to speak ~20 times/second during active wheel tuning
- LOCKED state announces immediately (user-triggered, infrequent) but
suppresses repeats while the 500 ms lock-feedback gate is active

**S-meter** (`SMeterWidget.cpp`):
- `setFocusPolicy(Qt::TabFocus)` added — widget is keyboard-reachable
- `setLevel()` announces the *displayed* value, not raw dBm: in S-Meter
Peak mode the event value is derived from `m_peakDbm` (what the needle
and text readout show), not `m_levelDbm`; formatted as "S7, -79 dBm" to
match the painted readout exactly

**MeterSlider** (`MeterSlider.h`):
- `setFocusPolicy(Qt::TabFocus)` added — DAX/TCI gain sliders are now
keyboard-reachable
- `keyPressEvent` handler: Left/Down −5%, Right/Up +5% — gain thumb is
adjustable without a mouse

### Phase 2c — VFO tab bar: `QLabel` → `QPushButton`

VFO tab labels were `QLabel` with a click event filter; VoiceOver could
not activate them. Replaced with `QPushButton` throughout
(`VfoWidget.cpp`, `VfoWidget.h`).

### Phase 2d — Keyboard navigation: RelayBar + PhaseKnob

- `RelayBar` gains arrow-key support (Left/Right step through relay
positions)
- `PhaseKnob` excluded from the tab order (it is already accessible via
the paired ESC sliders)

## Test notes

On macOS with VoiceOver:
1. Tab to the S-meter — subsequent signal level changes should be spoken
as "S7, -79 dBm" etc.
2. Tune the VFO wheel quickly — VoiceOver speaks once after tuning
settles (not on every step)
3. Lock the VFO — VoiceOver speaks "LOCKED" once
4. Tab to a DAX/TCI gain slider — Left/Right arrows move the thumb
5. VFO tab bar buttons ("DSP", "USB", "X/RIT", "DAX") are activatable
via VoiceOver

— AI5OS (@w9fyi)
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.

RADE: align filter passband with FreeDV waveform convention (750–2250 Hz)

2 participants