Also known as: DMR sync words, DMR sync patterns, BS-Voice sync
The DMR sync patterns are the nine fixed 48-bit words that open the sync field of every DMR burst, telling the decoder both where a burst begins and what role it plays.1 Before a receiver can read a slot type or a payload it must lock onto one of these words in the demodulated dibit stream — exactly the job of frame synchronization.2 The nine words are defined in ETSI TS 102 361-1 §9.1.1 and split by source (Base Station, Mobile Station, Direct Mode) and traffic type (voice, data, reverse channel).
The nine sync words
Each word is 48 bits, expressed as 24 dibits MSB-first. GopherTrunk stores them in
internal/radio/dmr/sync.go as the package-level AllSyncs slice, in the stable order below.
| Name | Hex (low 48 bits) | Role |
|---|---|---|
| BS-Voice | 0x755FD7DF75F7 |
Base station outbound, voice |
| BS-Data | 0xDFF57D75DF5D |
Base station outbound, data / control |
| MS-Voice | 0x7F7D5DD57DFD |
Mobile station, voice |
| MS-Data | 0xD5D7F77FD757 |
Mobile station, data |
| MS-RC | 0x77D55F7DFD77 |
Mobile station, reverse channel |
| DM-Voice-TS1 | 0x5D577F7757FF |
Direct mode voice, slot 1 |
| DM-Voice-TS2 | 0x7DFFD5F55D5F |
Direct mode voice, slot 2 |
| DM-Data-TS1 | 0xF7FDD5DDFD55 |
Direct mode data, slot 1 |
| DM-Data-TS2 | 0xD7557F5FF7F5 |
Direct mode data, slot 2 |
A SyncDetector slides a 24-dibit window across the stream and, at each position, counts dibit
mismatches against every pattern; a hit is declared where the best match falls within the
configured tolerance (default 4 of 24). The words are chosen for sharp autocorrelation, so a
genuine alignment stands clear of noise even a few dB into the channel.
The polarity-flip closure
The most consequential property of the set is that it is closed under a whole-alphabet
polarity flip. A conjugated-I/Q or spectrum-inverted front end negates the FM-discriminator
output, mapping +3 ↔ −3 and +1 ↔ −1 — in dibit space, adding 2 mod 4 to every dibit, which
is exactly XOR-ing the 48-bit word with 0xAAAAAAAAAAAA. Apply that to BS-Voice
(0x755FD7DF75F7) and the result is 0xDFF57D75DF5D — BS-Data, bit-for-bit. Every voice word
maps to its data twin and back, the flip being its own inverse (2 + 2 ≡ 0 mod 4).
The practical consequence, recorded as GopherTrunk issue #264 (the RTL-SDR Blog V4 / R828D
path), is that a sync match alone cannot resolve polarity: an inverted data burst fires the
detector as a clean voice sync and vice versa. GopherTrunk therefore treats sync detection as
polarity-agnostic and resolves the ambiguity downstream — the Tier II / III Process adapters
hand each burst to the decoder at both candidate polarities (CandidatePolarities = {0, 2},
RotateBurstDibits), and the slot-type Hamming(20,8), BPTC(196,96), and
CSBK CRC together act as the arbiter, dropping the wrong polarity with no state change.
Relevance to SDR
The sync patterns are the front door of GopherTrunk’s DMR decoder. internal/radio/dmr/sync.go
holds the canonical dibit forms, the AllSyncs ordering callers index against, and the
SyncDetector that reports each hit’s stream position and matched pattern. Voice decoding uses
only the four voice syncs to anchor burst A of a superframe,
then locates bursts B–F by TDMA cadence; control decoding slices a burst on
every BS-Data / MS-Data hit. Getting both the 24-dibit patterns and the polarity closure right
is what lets everything downstream decode a real, possibly inverted, off-air DMR signal.
Sources
-
Digital mobile radio — Wikipedia, on the DMR standard whose bursts these sync words frame. ↩
-
Frame synchronization — Wikipedia, on locating frame boundaries with a fixed sync sequence. ↩