Also known as: LDU, LDU1, LDU2, logical link data unit
The P25 Logical Data Units — LDU1 and LDU2 — are the 1728-bit voice frames that carry a P25 Phase 1 transmission.1 Each spans 180 ms of audio as nine IMBE voice codewords, and the two types alternate through a call, differing only in the metadata woven between the voice: LDU1 carries a Link Control word (who is talking to whom), LDU2 carries Encryption Sync (how to decrypt), and both carry two blocks of Low-Speed Data. The recurring LDU1→LDU2→LDU1… sequence keeps that metadata fresh throughout the transmission.
How it works
Stripped of its 24 interleaved status symbols, the 1728-bit LDU leaves a 1680-bit payload whose fields sit in a fixed interleaved order:
| Field | Length | Notes |
|---|---|---|
| Frame Sync (FS) | 48 | Fixed sync pattern opening the LDU |
| Network ID (NID) | 64 | NAC + DUID (0x5 LDU1, 0xA LDU2) + BCH |
| Voice frames u0–u8 | 9 × 144 | IMBE codewords, one per 20 ms of audio |
| LC / ES blocks | 6 × 40 | Link Control (LDU1) or Encryption Sync (LDU2) |
| Low-Speed Data | 2 × 16 | Cyclic-coded out-of-band signalling |
The nine voice subframes are not contiguous — LDU1 reads u0 and u1 back-to-back, then a 40-bit LC/ES block after each of u1 through u6, with the two Low-Speed Data blocks sitting together between u7 and u8. Each 144-bit voice subframe is an on-air IMBE codeword that the vocoder front end deinterleaves, descrambles, and FEC-decodes into an 11-byte recorder-ready frame. The six 40-bit metadata blocks concatenate into the 240-bit LC or ES field, which is 24 inner Hamming(10,6,3) codewords protecting a 72-bit word under an outer RS(24,12,13) (Link Control) or RS(24,16,9) (Encryption Sync) code.
In practice
The exact interleave order is load-bearing and easy to get wrong. An earlier GopherTrunk model placed an LC/ES block between u0 and u1, shifting u1…u7 by one 40-bit block; it round-tripped against the synthetic injector but did not match real on-air P25, so only u0 and u8 decoded and every other subframe was read from the wrong bits. Getting the offsets right — sourced against a reference decoder — is what makes a whole call decode instead of stuttering. Because the metadata repeats every LDU pair, a decoder also stays robust to loss: miss one LDU1’s Link Control and the next one restates the talkgroup and source.
Relevance to SDR
internal/radio/p25/phase1/ldu.go holds the structural constants and the extractors:
ExtractVoiceFrames slices u0…u8 at the sourced offsets and IMBE-decodes each,
ExtractLCESBlocks returns the six metadata blocks for the Link Control
or Encryption Sync parser, and ExtractLSDBlocks pulls the
Low-Speed Data. A compile-time assertion pins the field arithmetic to 1728 bits. The LDU is the
heart of P25 voice — everything a scanner records and every talkgroup it reports flows through
these frames.
Sources
-
Project 25 — Wikipedia, on the P25 standard and its Phase 1 voice frames. ↩