Skip to content

Add PAPR-reduction phase rotator as a pre-compressor TX chain stage #2887

Description

@ten9876

Summary

Add a dedicated phase rotator stage to the PooDoo TX chain, slotted between EQ and COMP (or EQ and DESS), to reduce voice signal peak-to-average power ratio (PAPR) before compression. This is the same technique Thetis uses and is standard in broadcast audio processors (Optimod et al.).

Why

Voice waveforms are inherently asymmetric — glottal pulses produce positive peaks taller than negative peaks (or vice versa). A compressor sees those tall asymmetric peaks and pulls gain down to control them, which also drags average power down. Phase-rotating the signal decorrelates the harmonic phase alignment that creates those constructive peaks, without changing perceived loudness — peaks shrink, the compressor has less peak material to clamp, and average TX power can run 2-3 dB hotter before clipping.

This is a free-lunch loudness/intelligibility win for SSB voice that's well established in broadcast audio processing and was adopted by Thetis for amateur radio TX.

Current state

AetherSDR's TX chain order:

MIC → GATE → EQ → DESS → COMP → TUBE → ENH → TX

There is no PAPR-reduction phase rotator stage.

A phase rotator does exist in `src/core/ClientPudu.cpp` inside the PUDU exciter's Behringer mode (line 317), but it's a different use case:

  • Post-compressor (inside the ENH stage)
  • Low-band only (LPF-filtered signal)
  • Single 2nd-order all-pass
  • Parallel wet/dry mixed back into dry signal for transient emphasis

That existing rotator is not appropriate for PAPR reduction — wrong position in chain, wrong band scope, wrong topology.

Proposed design

New `ClientPhaseRotator` DSP module mirroring the other PooDoo stages:

  • Cascade of 4-6 second-order all-pass filters at staggered frequencies (e.g. 300 / 700 / 1500 / 2500 Hz)
  • Full-band, in-line on the main signal (not parallel/wet-dry)
  • Atomic parameters for cross-thread updates per project DSP convention
  • No allocations in `process()`, no exceptions, no locks

Chain position: between EQ and DESS, so it operates on EQ-shaped audio but before the dynamics processors:

MIC → GATE → EQ → PHROT → DESS → COMP → TUBE → ENH → TX

User-facing controls:

  • Enable / Bypass — single toggle (Thetis exposes it this way)
  • Stages — 0/4/6 (or just on/off — minimal exposed surface)
  • Optional Asymmetry meter showing peak+/peak- ratio before/after, so the user can see the rotator working

Could be exposed as a draggable stage in the CHAIN tile (consistent with existing GATE/EQ/DESS/COMP/TUBE/ENH stages), with a small tuning knob row in the applet panel.

References

  • Thetis source (TX/AudioProcessor implements the phase rotator)
  • Bonny Bouvier, Improving SSB Speech Intelligibility — classic discussion of asymmetric voice peaks
  • Orban Optimod 8000 series technical docs

Acceptance criteria

  • New `ClientPhaseRotator` module follows project DSP conventions (atomics, no locks, no allocations in process)
  • Wired into CHAIN as a draggable stage between EQ and DESS by default
  • Bypass and stage-count controls exposed in the chain editor
  • Measurable reduction in peak-to-average ratio on speech material with no audible artefacts
  • Documented in the PooDoo audio overview

Notes

Filed in response to a user question after the Aether Audio TX chain video. The questioner correctly identified that Thetis offers this and AetherSDR doesn't.

Metadata

Metadata

Assignees

No one assigned

    Labels

    GUIUser interfaceNew FeatureNew feature requestaudioAudio engine and streamingenhancementImprovement to existing featuremaintainer-reviewRequires maintainer review before any action is taken

    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