Also known as: FSW, P25 sync word, frame sync word
The P25 frame sync word (FSW) is the fixed 48-bit pattern 0x5575F5FF77FF that
opens every P25 Phase 1 frame.1 Before a decoder can read a
NID, a voice frame, or a
TSBK, it must know where the frame starts in the incoming symbol
stream — and the FSW is the landmark it searches for, exactly the job of
frame synchronization.2
How it works
A P25 Phase 1 receiver produces a stream of dibits (two bits at a time) from the
C4FM demodulator — the four transmit deviations map to dibit values by
the TIA-102 rule +3→01, +1→00, −1→10, −3→11. The FSW is 24 of those dibits in a fixed
order, so the decoder runs a sliding access-code correlation:
at each new dibit it compares the last 24 dibits against the known pattern and declares a
frame boundary wherever the number of mismatches falls under a threshold (GopherTrunk
defaults to tolerating 4 of 24). The sync word is chosen for a sharp autocorrelation peak,
so a genuine alignment stands out clearly from noise.
Because the FSW pattern is designed to be recognisable even under error, the correlator can lock a frame a few dB into the noise where a strict all-or-nothing match would fail — the same tolerance that lets a scanner hold a marginal P25 signal.
In practice
Two subtleties make real-world FSW search harder than the textbook version:
- Polarity / rotation ambiguity. An FM discriminator can hand the decoder the dibit
alphabet cyclically rotated — most commonly a whole-alphabet polarity flip (
dibit + 2) from a conjugated I/Q input. GopherTrunk’s detector tries cyclic rotations and records which one matched. On a true C4FM stream only rotation 0 (identity) and rotation 2 (polarity flip) are physically possible; the CQPSK / π/4-DQPSK path has a genuine four-fold phase ambiguity and needs all four. Allowing the non-physical rotations 1 and 3 on C4FM actually hurt: the downstream BCH decoder would sometimes miscorrect a misaligned window into a parity-valid pseudo-NID at the wrong rotation (the root of GopherTrunk issue #275). - Status symbols. P25 inserts an interstitial status symbol into the stream at a fixed cadence, so the raw symbol positions do not map one-to-one onto frame bits — the deframer must account for them when it reads the NID and body after the sync.
Relevance to SDR
The FSW is the front door of GopherTrunk’s P25 Phase 1 decoder. internal/radio/p25/phase1
holds the canonical 24-dibit FrameSyncWord, the SymbolToDibit mapping, and a
SyncDetector that slides the pattern over the demodulated dibits and reports each hit’s
position, matched rotation, and correlation margin — the last of which the measurement
harness turns into a sync-health metric (a margin pressed against the threshold means lock
is barely holding). Every P25 Phase 1 frame type — HDU, LDU1/LDU2, TDU, TSDU, PDU — begins
at an FSW hit, so getting this search right, rotations and all, is what lets everything
downstream decode at all.
Sources
-
Project 25 — Wikipedia, on the P25 standard and its Phase 1 frame structure. ↩
-
Frame synchronization — Wikipedia, on using a fixed sync sequence to locate frame boundaries in a bit stream. ↩