Summary
isPhoneModeForQuindar() currently allows Quindar tones for FDV, FDVU, and
FDVL (FreeDV modes). FreeDV now uses RADAE (the same neural speech autoencoder as
RADE mode), meaning a Quindar tone injected into the TX audio stream is fed into a
neural encoder trained on speech — the result on air is codec-artifact noise, not a
recognizable signaling tone. The far end cannot detect it as Quindar. The behaviour
is misleading and technically incorrect.
Background
Surfaced during review of #3224 / PR #3317. The Quindar tone is injected in the TX
audio pipeline after the user DSP chain but before the brickwall limiter
(AudioEngine.cpp around the // Quindar tones (#2262) comment). From there it
goes to the radio as raw PCM.
For SSB/AM/FM, that PCM goes on air as-is — the Quindar sine reaches the far end
intact and relay equipment can detect it. ✓
For FreeDV (FDV/FDVU/FDVL), the radio receives the PCM and runs it through
RADAE internally before transmitting. A 2525 Hz sine is as far from the speech
manifold as you can get — RADAE produces heavily distorted codec output, not a
Quindar beep. The far end decodes noise.
For RADE, this was avoided by accident: RADE sets the slice to DIGU/DIGL, which
isPhoneModeForQuindar() already excludes. FreeDV was explicitly included, likely
when FreeDV still used Codec2 and someone categorised it as "phone-adjacent." Now
that FreeDV uses RADAE, it belongs in the same excluded bucket.
The existing code comment already states the design intent:
// Digital (DIGU/DIGL/RTTY/CW/FT8) intentionally excluded — the
// tone would corrupt the digital waveform.
FreeDV is a digital waveform in the same sense. The exclusion applies.
Proposed fix
One line change in TransmitModel.cpp::isPhoneModeForQuindar():
// before
return m == "USB" || m == "LSB"
|| m == "AM" || m == "FM" || m == "NFM"
|| m == "FDV" || m == "FDVU" || m == "FDVL";
// after
return m == "USB" || m == "LSB"
|| m == "AM" || m == "FM" || m == "NFM";
Impact
- Users who currently have Quindar enabled and operate in a FreeDV mode will no
longer see Quindar tones fire. They are currently getting a broken/inaudible tone
on air — so the change removes a feature that doesn't work, not one that does.
- No change to SSB/AM/FM behaviour.
- No change to RADE behaviour (already excluded).
Acceptance
isPhoneModeForQuindar() returns false for FDV, FDVU, FDVL.
- Quindar intro/outro do not fire when the TX slice is in a FreeDV mode.
- SSB/AM/FM Quindar behaviour is unchanged.
Refs
Summary
isPhoneModeForQuindar()currently allows Quindar tones forFDV,FDVU, andFDVL(FreeDV modes). FreeDV now uses RADAE (the same neural speech autoencoder asRADE mode), meaning a Quindar tone injected into the TX audio stream is fed into a
neural encoder trained on speech — the result on air is codec-artifact noise, not a
recognizable signaling tone. The far end cannot detect it as Quindar. The behaviour
is misleading and technically incorrect.
Background
Surfaced during review of #3224 / PR #3317. The Quindar tone is injected in the TX
audio pipeline after the user DSP chain but before the brickwall limiter
(
AudioEngine.cpparound the// Quindar tones (#2262)comment). From there itgoes to the radio as raw PCM.
For SSB/AM/FM, that PCM goes on air as-is — the Quindar sine reaches the far end
intact and relay equipment can detect it. ✓
For FreeDV (FDV/FDVU/FDVL), the radio receives the PCM and runs it through
RADAE internally before transmitting. A 2525 Hz sine is as far from the speech
manifold as you can get — RADAE produces heavily distorted codec output, not a
Quindar beep. The far end decodes noise.
For RADE, this was avoided by accident: RADE sets the slice to DIGU/DIGL, which
isPhoneModeForQuindar()already excludes. FreeDV was explicitly included, likelywhen FreeDV still used Codec2 and someone categorised it as "phone-adjacent." Now
that FreeDV uses RADAE, it belongs in the same excluded bucket.
The existing code comment already states the design intent:
FreeDV is a digital waveform in the same sense. The exclusion applies.
Proposed fix
One line change in
TransmitModel.cpp::isPhoneModeForQuindar():Impact
longer see Quindar tones fire. They are currently getting a broken/inaudible tone
on air — so the change removes a feature that doesn't work, not one that does.
Acceptance
isPhoneModeForQuindar()returnsfalsefor FDV, FDVU, FDVL.Refs
dispatchMoxOff()refactor that surfaced this analysisTransmitModel.cpp::isPhoneModeForQuindar()— the function to changeAudioEngine.cpp— Quindar injection point (after DSP chain, before limiter)