Field Guide · term

Also known as: dPMR sync word, FS1, FS2, FS3

A dPMR frame sync is one of three fixed 48-bit patterns that mark burst boundaries on a dPMR channel, letting a decoder both locate a burst and learn what kind of burst it is.1 Unlike a protocol with a single universal sync word, dPMR carries three distinct words — FS1, FS2, and FS3 — and which one a correlator matches is itself information: FS1 opens a superframe, FS2 marks a mid-superframe resync point, and FS3 opens a control-channel signalling burst.2 Each is 48 bits, 24 dibits at dPMR’s 4FSK air interface.

FS1 burst burst FS2 burst superframe: FS1 start · FS2 mid-superframe resync (every 4th burst) FS3 CSBK control channel: FS3 opens a signalling burst correlator matches any of FS1/FS2/FS3 → burst position AND burst type
dPMR distributes three sync words across its structure: FS1 opens a superframe, FS2 provides a mid-superframe resync so a receiver that missed FS1 can still lock, and FS3 marks a control-channel CSBK burst. Matching one of the three yields both where the burst starts and what it contains.

The three words

GopherTrunk stores the three patterns as canonical 48-bit hex constants and materialises them MSB-first into 24-dibit arrays for the symbol-domain correlator:

Word Hex (48 bits) Role
FS1 0x57FF5F75F575 start of a voice/data superframe
FS2 0x5F7F77FD7DFD mid-superframe resync (every 4th burst)
FS3 0x7DDFFD5F55D5 start of a control-channel CSBK burst

Having a separate mid-superframe word (FS2) is what makes dPMR robust to a late lock: a receiver that joins a call after FS1 has already passed does not have to wait for the next superframe — it can re-acquire on the next FS2 and slot straight into the burst grid. FS3 is the one the trunking engine watches most closely, because a control channel is a stream of FS3 bursts, each opening a CSBK signalling block.

Detecting a sync

Detection is an access-code correlation: the decoder slides a 24-dibit window over the demodulated stream and, at each position, counts how many dibits differ from a target pattern; a count at or under the configured tolerance declares a match at that position. GopherTrunk’s SyncDetector takes one pattern and a tolerance — a tolerance of zero demands an exact match — and reports the absolute dibit index where each hit ends. A control-channel monitor runs an FS3 detector; a call-follower runs FS1 and FS2 to hold the traffic superframe. The detector’s shape deliberately mirrors the Phase 1, DMR, and NXDN sync detectors so the higher-level state machine treats every protocol the same way.

Relevance to SDR

internal/radio/dpmr/sync.go holds the FS1Hex / FS2Hex / FS3Hex constants, the FS1Dibits / FS2Dibits / FS3Dibits helpers that expand them, and the tolerant SyncDetector. The intended control-channel flow is FS3 sync detect → 80-bit CSBK slice → CSBKFromBits → ingest, so the sync stage is the first link in the dPMR trunking chain: no FS3 lock means no CSBK, and no CSBK means no grants to follow. Because the three words are distinct and each is tied to a burst type, dPMR’s sync layer does double duty — it recovers timing and classifies the burst in a single correlation, which is why the decoder can tell a control burst from a traffic burst before it has decoded a single payload bit.

Sources

  1. dPMR — Wikipedia, on the ETSI dPMR narrowband digital standard and its burst structure. 

  2. Frame synchronization — Wikipedia, on using fixed sync sequences to locate frame boundaries. 

See also