hfmodem / besra

ARDOP

ARDOP adapts its modulation and carrier count to the channel. Each carrier carries a protected byte block; acknowledgements tell the sender when to advance.

The ARDOP mode in hfmodem uses besra for framing, modulation and session control.

HF data modes4FSK · 4PSK · 8PSK · 16QAMCode-derived geometry + recorded evidence
Measured power spectrum of a received ARDOP greeting frameWelch power estimate, in decibels relative to the strongest bin, across zero to three kilohertz of audio.

Channel occupancy

Modulation and carrier count

In 4FSK, each symbol selects one of four tones. In PSK, each carrier encodes a change in phase. ARDOP’s 16QAM combines two amplitudes with eight differential phase steps, forming a two-ring constellation.

Selected data mode’s tone or carrier positions

The plot shows audio frequencies. The selector groups frames by their named bandwidth; a wider session can also use narrower frames.

Inspect every HF data mode
Even/odd twins share geometry; each mode appears once. Duration is measured from a default full-payload render.
ModeCarriersBaudPayload BRS B/carrierRender s

Link entry

The caller sends a connection request naming both stations and a bandwidth. The answering station returns ConAck; the caller responds with ConAck and the answering station completes entry with ACK.

Frame structure

Protected blocks per carrier

The payload is split across the carriers. Each block begins with a byte count, reserves a fixed space for data, and ends with a frame-bound CRC and Reed–Solomon parity. Unused data space is zero-filled. Change the mode above to see the block change.

Error correction and CRC

Reed–Solomon protects the count, data and CRC together. The receiver can correct damaged bytes before checking the CRC. Successful blocks can be retained across repeated copies, while the undecoded parts get another chance.

This is the data-frame layout. Connect requests, station IDs and pings instead carry packed identification fields and RS parity without the data CRC.

Leader, header and trailer

  1. Find the leader.

  2. Read the frame type.

    Ten 4FSK header symbols identify the format and session: the type, parity, type XOR session ID, and parity again.

  3. Decode the body.

    FSK sends a tone sequence. PSK/QAM starts each carrier with a phase reference, then sends its protected block.

  4. Leave room for the reply.

    A trailer closes the waveform. The sender releases the channel so the receiver can answer.

Link control

Stop-and-wait ARQ

ARDOP uses stop-and-wait ARQ. The sender keeps a block pending until it is acknowledged. Even and odd frame types distinguish new data from repeated copies; a repeated frame can be acknowledged without delivering its payload twice.

ACK and NAK control types carry a quality grade used for rate selection. Besra and ardopcf have different repeat timing; the schematic shows a successful exchange.

Schematic exchange. BREAK changes the sending turn; DISC and END close the link.

Rate selection and host interface

ACK and NAK quality grades guide selection among data frames within the negotiated bandwidth. Besra provides command and data TCP connections for host applications.

Recorded audio

A KE8LVA greeting frame

Received gateway frame: KE8LVA, 7103.5 kHz channel centre; recording 2026-08-05. The spectrum uses the decoded frame’s audio span and excludes local transmit leakage.

Decoded payload

Control bytes are printed as escapes, including line endings. This is the decoded frame payload, not a completed greeting or a mail transfer.

Observed results

The receiver decodes the gateway frame and verifies its protected payload.

ARDOP sessions fetched mail through WW2MI and W6IDS and sent message 2KX2HWM919HR through WW2MI with destination delivery confirmed. See implementation evidence for conditions.

Sources

Reproduce the figures

The mode table, carrier positions and render lengths are generated by docs/viz/build.py from besra’s frame catalogue, receiver frequency mapping and transmitter. The spectrum and payload come from the shipped offair_ke8lva_greeting.wav fixture, decoded by besra itself.

Source modules: besra/frame/frame.py, besra/phy/modulator.py, besra/phy/demodulator.py, besra/dsp/detect.py. The ARQ explanation follows besra/arq/session.py. The generated block is checked against these inputs by the figure gate.

python docs/viz/build.py --check

The page renders offline, with no library downloads, fonts or external assets. Figures are recalculated when the Python generator runs, not when this HTML is opened.