Physical Layer

This section describes the M17 standard radio physical layer suitable for use where a transmission bandwidth of 9 KHz is permitted.

4-level Frequency-shift Keying Modulation (4FSK)

The M17 standard uses 4FSK at 4800 symbols/s (9600 bits/s) with a deviation index h=0.33 for transmission in a 9 kHz channel bandwidth. Minimum channel spacing is 12.5 kHz.

Dibit, Symbol, and Frequency-shift

Each of the 4-level frequency-shifts can be represented by dibits (2-bit values) or symbols, as shown in Table 1 below.

In the case of dibits, the most significant bit is sent first. When four dibits are grouped into a byte, the most significant dibit of the byte is sent first. For example, the four dibits contained in the byte 0xB4 (0b 10 11 01 00) would be sent as the symbols (-1, -3, +3, +1).

Table 1 Dibit symbol mapping to 4FSK deviation
Dibit Symbol 4FSK deviation
0 1 +3 +2.4 kHz
0 0 +1 +0.8 kHz
1 0 -1 -0.8 kHz
1 1 -3 -2.4 kHz

4FSK Generation

Figure 1 Dibit to 4FSK Generation
graph LR id1[Dibit Input] --> sym[Dibit to Symbol] --> id2[Upsampler] --> id3[RRC Filter] --> id4[Frequency Modulation] --> id5[4FSK Output] style id1 fill:#ffffffff,stroke:#ffffffff,stroke-width:0px style sym fill:#fff,stroke:#000,stroke-width:2px style id2 fill:#fff,stroke:#000,stroke-width:2px style id3 fill:#fff,stroke:#000,stroke-width:2px style id4 fill:#fff,stroke:#000,stroke-width:2px style id5 fill:#ffffffff,stroke:#ffffffff,stroke-width:0px

Dibits are converted to symbols. The symbol stream is upsampled to a series of impulses which pass through a root-raised-cosine (alpha=0.5) shaping filter before frequency modulation at the transmitter and again after frequency demodulation at the receiver.

Upsampling by a factor of 10 is recommended (48000 samples/s).

The root-raised-cosine filter should span at least 8 symbols (81 taps at the recommended upsample rate).


A complete transmission shall consist of a Preamble, a Synchronization Burst, Payload, and an End of Transmission marker.

Figure 2 Physical Layer Transmission
(192 symbols)
16 bits
(8 symbols)
Multiples of 2 bits
(Multiples of 1 symbol)
(192 symbols)

Transmissions may include more than one synchronization burst followed by a payload.

Figure 3 Physical Layer Transmission with Multiple Synchronization Bursts


Every transmission shall start with a preamble, which shall consist of 40 ms (192 symbols) of alternating outer symbols (+3, -3) or (-3, +3). To ensure a zero crossing prior to a synchronization burst, the last symbol transmitted within the preamble shall be opposite the first symbol transmitted in the synchronization burst.

Synchronization Burst (Sync Burst)

A sync burst of 16 bits (8 symbols) shall be sent immediately after the preamble. The sync burst is constructed using only outer symbols, with codings based on Barker codes. Properly chosen sync burst coding assists in symbol clocking and alignment. Different sync burst codes may also be used by the Data Link Layer to identify the type of payload to follow.


Payload shall be transmitted in multiples of 2 bits (1 symbol).


To avoid transmitting long sequences of constant symbols (e.g. +3, +3, +3, ...), a simple randomizing algorithm is used. At the transmitter, all payload bits shall be XORed with a pseudorandom predefined sequence before being converted to symbols. At the receiver, the randomized payload symbols are converted to bits and are again passed through the same XOR algorithm to obtain the original payload bits.

The pseudorandom sequence is composed of the 46 bytes (368 bits) found in the appendix (Randomizer Sequence).

Before each bit of payload is converted to symbols for transmission, it is XORed with a bit from the pseudorandom sequence. The first payload bit is XORed with most significant bit (bit 7) of sequence byte 0 (0xD6), second payload bit with bit 6 of sequence byte 0, continuing to the eigth payload bit and bit 0 of sequence byte 0. The ninth payload bit is XORed with bit 7 of sequence byte 1 (0xB5), tenth payload bit with bit 6 of sequence byte 1, etc.

When payload bits have XORed through sequence byte 45 (0xC3), the psuedorandom sequence is restarted at sequence byte 0 (0xD6)

On the receive side, symbols are converted to randomized payload bits. Each randomized payload bit is converted back to a payload bit by once again XORing each randomized bit with the corresponding pseudorandom sequence bit.

End of Transmission marker (EoT)

Every transmission ends with a distinct symbol stream, which shall consist of 40 ms (192 symbols) of a repeating 0x55 0x5D (+3, +3, +3, +3, +3, +3, -3, +3) pattern.

Carrier-sense Multiple Access (CSMA)

CSMA may be used to minimize collisions on a shared radio frequency by having the sender ensure the frequency is clear before transmitting. Higher layers (Data Link and Application) may require the use of CSMA, and may specify parameters other than the defaults.

P-persistent access is used with a default probability of p = 0.25 and default slot time of 40 ms.

Physical Layer Flow Summary

Figure 4 Physical Layer Flow
graph TD payload["Payload"] phy_randomizer["randomizer"] phy_sync["prepend SYNC BURST"] phy_chunk_dibit["chunk dibit"] phy_dibit_to_symbol["dibit to symbol"] phy_upsampler["upsampler"] phy_filter["rrc filter"] phy_frequency_modulation["frequency modulation"] phy_rf["4FSK RF"] classDef default fill:#fff,stroke:#000,stroke-width:2px payload --> phy_randomizer Preamble --> phy_chunk_dibit phy_chunk_dibit --> phy_dibit_to_symbol --> phy_upsampler --> phy_filter --> phy_frequency_modulation --> phy_rf phy_randomizer --> phy_sync --> phy_chunk_dibit EoT --> phy_chunk_dibit

Issues to address...

  • Time limits for RF carrier and no symbol generation before the preamble and after the EoT.
  • Nothing to consistently address loss of signal/fades/missing EoT
  • No limit on transmission duration