Also known as: FICH, frame information channel, YSF FICH
The YSF FICH (Frame Information Channel) is the header block that opens the payload of every Yaesu System Fusion frame.1 Where the frame sync word identifies that a YSF transmission is on-air, the FICH identifies what kind: the call type (group or radio ID), the data mode (voice, data, or the mixed V/D modes), and the frame’s position inside its block and transmission sequence. Because everything downstream depends on reading it correctly, its 32 information bits are wrapped in a CRC-16 and a heavy convolutional FEC chain so it survives a fading, mobile 4-FSK channel.2
How it works
A YSF frame is 480 symbols of 4800-baud 4-level C4FM. The first 20 dibits are the 40-bit frame sync word 0xD471C9634D, the next 100 dibits carry the FICH, and the rest is the DCH voice/data payload. A sliding detector locks onto the FSW, then the decoder reverses the FICH’s FEC chain:
- De-interleave. The 100 on-air bits are permuted by a column-major 10×10 interleaver
(output bit k pulls from input bit
(k%10)*10 + (k/10)), which spreads a burst of channel errors across the codeword so no single trellis section takes them all. - Depuncture. Four channel bits punctured on the wire — positions
{0, 1, 102, 103}, flanking the trellis’s tail-bit boundary — are re-inserted as erasures, restoring the full 104-bit trellis output. - Viterbi decode. A K=5 ½-rate Viterbi decoder over the 104 channel bits recovers the 48 information bits (32 FICH + 16 CRC); its path metric reports how many bit-flips it had to repair.
- Check the CRC. The 16-bit trailer is a CRC-16 CCITT (poly 0x1021, initial value 0x0000) over the four leading info octets. A mismatch drops the frame.
FICH fields
The 32 information bits pack MSB-first across four octets:
| Field | Bits | Meaning |
|---|---|---|
| FT | 2 | Frame Type — Header, Communications, Terminator, Test |
| CT | 2 | Call Type / call-sign mode — Group, Radio ID, reserved |
| BN | 2 | Block Number within the transmission |
| BT | 2 | Block Total |
| FN | 3 | Frame Number within the current block |
| FT (total) | 3 | Frame Total inside the block |
| DT | 2 | Data Type — V/D mode 1, Data FR, V/D mode 2, Voice FR |
| VoIP | 1 | 1 = transmission carries WIRES-X / VoIP |
| DT2 | 2 | Data Type 2 / mode-2 sub-field |
| SQM | 1 | Squelch mode — 0 open, 1 code-squelch active |
| SQ | 7 | Squelch code (split across octets 2 and 3) |
| DEV | 2 | Device / reserved |
The DT field is what tells a decoder how to treat the DCH region — the V/D modes multiplex half-rate voice and data, while the full-rate modes carry only one of the two.
In practice
The field packing matches what the open-source YSF decoders (DSDcc, MMDVMHost, Pi-Star) use, and the four implementations agree byte-for-byte on the puncture schedule. That schedule’s exact origin is the JARL CAI reference; GopherTrunk flags it as best-effort pending real-air capture validation — if a captured YSF transmission fails FICH CRC after Viterbi decode, the puncture positions are the two lines most likely to need adjusting. The whole point of the chain is robustness: interleaving turns a fading burst into isolated section errors, the ½-rate trellis mops those up, and the CRC is the final gate that keeps a mis-decoded header from steering the rest of the frame wrong.
Relevance to SDR
internal/radio/ysf/fich.go holds the field parse and CRC check (ParseFICH,
AssembleFICH); fich_trellis.go implements the K=5 ½-rate encode/decode, the puncture
schedule, and the 10×10 interleave (EncodeFICHOnAir / DecodeFICHOnAir); and sync.go
holds the FSW and its detector. Together they let GopherTrunk recognise a YSF transmission and
read its metadata — enough to surface a ham repeater’s activity in the active-systems view.
Sources
-
System Fusion — Wikipedia, on Yaesu System Fusion (C4FM) and its frame structure. ↩
-
Convolutional code — Wikipedia, on the trellis coding the FICH uses for forward error correction. ↩