Also known as: H-DQPSK, Harmonized DQPSK, P25 Phase 2 waveform, HCPM
H-DQPSK (Harmonized Differential QPSK) is the physical-layer waveform of P25 Phase 2.1 Where Phase 1 puts one 9600 bit/s C4FM channel on a 12.5 kHz carrier (FDMA), Phase 2 packs two independent voice paths onto the same 12.5 kHz carrier by running a faster 6000 symbol/second (12000 bit/s) π/8-shifted DQPSK waveform and time-dividing it into two slots — TDMA.2 Each symbol carries a dibit (2 bits), and the information rides in the phase change from one symbol to the next, so the receiver is a differential decoder rather than a coherent one.
Modulation and rate
The Phase 2 downlink (base → subscriber) is a π/8-shifted DQPSK constellation: the four QPSK points sit on a ring, and successive symbols step by odd multiples of π/4 around a fixed π/8 offset. That offset keeps the trajectory off the origin, bounding the envelope so a linear power amplifier stays efficient — the same reasoning behind π/4-DQPSK in TETRA and IS-136, of which this is the π/8 cousin. The uplink is defined as a compatible H-CPM (Harmonized Continuous Phase Modulation) constant-envelope waveform so a battery subscriber can run its PA in saturation; “harmonized” refers to reconciling the two vendor proposals that merged into the standard. A GopherTrunk receiver treats the demodulated downlink as a differential dibit stream and does not model the CPM uplink except as a diagnostic sync target.
At 6000 sym/s with 2 bits per symbol, one carrier delivers 12000 bit/s of coded channel, which the TDMA structure splits into two ~6000 bit/s logical slots — enough for one AMBE+2 vocoder stream plus signalling each. Contrast Phase 1: 4800 sym/s C4FM (4-FSK family) at 9600 bit/s, one voice path per carrier. The net effect is a doubling of channel capacity on the same spectrum, which is the whole point of Phase 2.
Demodulating it
GopherTrunk demodulates H-DQPSK with a single reusable primitive. NewPiOver4DQPSK builds a
root-raised-cosine matched filter (roll-off α = 0.20 for Phase 2) feeding a differential slicer;
the constructor takes a rotation argument, and passing math.Pi/8 selects the Phase 2 offset
(passing math.Pi/4 gives the TETRA/IS-136 variant from the same code). At each symbol the decoder
computes arg(s · conj(last)) − rotation, wraps to [−π, π], and picks the nearest of the four
quadrants to emit a dibit. A soft-decision path (DecodeBoth) additionally exports the raw complex
differential s · conj(last), whose real and imaginary parts are the two on-air bits’ reliabilities
— the log-likelihood input the MAC trellis’s soft Viterbi uses to recover ~1.5–2 dB the hard slicer
throws away.
Because the modulation is differential, the receiver never has to resolve an absolute carrier
phase, which is what makes the four-fold QPSK phase ambiguity harmless: a whole-constellation rotation
cancels in the s · conj(last) product. It does, however, mean the dibit labels the slicer assigns
can differ from the standard’s by a quadrant transpose, which is why the Phase 2 front end applies a
fixed dibit remap before anything downstream reads the bits (see the
Phase 2 sync word).
Relevance to SDR
H-DQPSK is the entry point of GopherTrunk’s Phase 2 decoder: internal/dsp/demod/dqpsk.go and
piover4_dqpsk.go turn IQ into the 6000 sym/s dibit stream that the sync detector, ISCH decode,
and MAC FEC all consume. Getting the rotation (π/8, not π/4) and the RRC roll-off right is what lets
a real two-slot signal lock at all; everything from the superframe grid to the vocoder sits on top of
this waveform. The spec is TIA-102.BBAC.
Sources
-
Project 25 — Wikipedia, on P25 Phase 2 and its two-slot TDMA physical layer. ↩
-
Phase-shift keying — Wikipedia, on differential and π/4-shifted QPSK constellations. ↩