Functional specification  ·  waveform, coding, ARQ

VARA

The VARA mode in hfmodem uses kestrel for link entry, coded data and session control. MFSK bursts establish the link before payload transmission.

500 / 2300 / 2750 Hz bandwidths MFSK handshake  →  OFDM payload turbo (13,15) FEC · CRC-16/GENIBUS host TCP 8300 / 8301
Schematic exchange · frequency × time
frequency 0 – 2.4 kHz →
time ↘

Schematic exchange: three MFSK handshake bursts, a wideband link-setup frame carrying the caller’s identity, and data bursts with acknowledgements. The callsigns are K7ABC and W2XYZ.

Channel occupancy

Audio-frequency positions for BW500 subbands and BW2300 rec3 bins. The active bin changes with each emission column.

Carrier occupancy
CONNECTION SETUP

Link entry

Connect-request, connect-response and connected-ack use one MFSK tone per symbol. Their tone patterns come from a Visual Basic 6 Rnd() sequence seeded by the called callsign. The bursts carry no FEC.

The generator, per symbol
Closed form (exact integer)
crc  = CRC16/GENIBUS(callsign)
seed = (crc + SEED_OFF) & 0x7FFF
mult = G(callsign) + ((crc+50) >> 15)
s = start(seed)
repeat (mult + PREADV): s = LCG(s)
for k in 0..N-1:
  s=LCG(s); P = ⌊ s/2²⁴ · 5 ⌋      # 0..4
  s=LCG(s); D = ⌊ s/2²⁴ · 7 ⌋      # 0..6
  bin[k] = (29 + (k even) + 14·P + 2·D) & 0xFF
LCG(s)=(s·0x43FD43FD + 0xC39EC3) & 0xFFFFFF

Callsign addressing

The responder computes the expected tones from MYCALL and correlates them with received audio. The last three callsign characters enter the hash G; the CRC includes the full callsign.

Caller identification

All three MFSK bursts address the called station. A BW2300 rec3 link-setup frame carries the caller’s identity.

THE OFDM DATA PATH

Frame structure and coding

BW500 level 4 uses differential BPSK across two subbands. BW2300 rec3 encodes values as active-bin positions. Higher BW2300 records use denser constellations and longer symbols with a cyclic prefix.

43 payload bytes + marker + 2-byte CRC → 368 bits → XOR whitener → turbo (13,15) rate-½ + 12-bit tail → 748 coded bits → stage-1 raster → differential-BPSK across 394 columns → ⊗ reference grid → 2-subband WOLA at 1350 / 1650 Hz

Differential-BPSK, de-rotated

Each column's cell is de-rotated by a unit-modulus reference, then bit = 1 if Re(vₖ·conj(vₖ₋₁)) < 0. Two subbands alternate the active tone symbol-to-symbol.

The constellation lookup table applies to BW2300 records 9–16. The base level uses one-hot index modulation with a constant cell value of −1j.

Turbo constituent — (13,15) RSC, 8 states

Two identical recursive-systematic encoders operate in parallel, with log-MAP decoding. State s = r₀|r₁<<1|r₂<<2; feedback a=u⊕r₁⊕r₂; parity p=a⊕r₀⊕r₂.

Link-setup frame

The link-setup frame uses the BW2300 rec3 waveform and -byte container. Its one-hot raster selects one bin per emission column across a -bin span. The frame maps information bits to coded bits. The caller’s callsign is packed in six-bit characters at the frame start.

ARQ & THE HOST INTERFACE

ARQ and turn-taking

VARA uses stop-and-wait ARQ. A data burst is answered by an acknowledgement. Applications use separate command and data TCP connections.

Connect → transfer → disconnect
Host TCP interface
8300command channel — ASCII, \r-terminated
8301data channel — raw un-framed bytes
CONNECTstart an ARQ session → PENDING/CONNECTED
BUFFER nraw host bytes still queued; drains per ACKed block
BW500/2300select bandwidth
PTT ON/OFFhost keys the radio each burst
~85ms
TX→RX turnaround
43B
block @ level 4
1
window (stop&wait)
THE NUMBERS

Implementation values

The tables describe the parameters used by kestrel.

MFSK handshake — physical & generator §4.2
QuantityValue
Modulationsingle tone / symbol · sin(2π·carrier·n/2048)
Tone → frequencyf = carrier · 48000 / 2048 (= 23.4375 Hz/bin)
Sample rate48000 Hz
Symbol stride2074 samples
Inter-symbol shapingN=32 raised-cosine WOLA · hop = 2042
LCG (VB6 Rnd)state = (state·0x43FD43FD + 0xC39EC3) & 0xFFFFFF
CR (preamble/N/off/adv)[74,68,70,60,60,77,50,76,78,74] · N=31 · (50, 1)
connect-response[62,67,55,66,59,72,68,55] · N=15 · (289, 511)
connected-ack[62] · N=12 · (289, 31)
G basis (last 3 chars)[-3]=110,220,440,338,134,310 · [-2]=102,204,408,274,6,22 · [-1]=32,64,128,258,36,216
BW500 / L4 OFDM data path §3.6
QuantityValue
Sub-bands2 · centers 1350 / 1650 Hz
Samples / symbol512
Columns / frame · coded cells394 cols · 748 coded
Modulationdifferential-BPSK · bit = Re(vₖ·conj(vₖ₋₁)) < 0
Frame-start column c₀9
Reference read idx (sub1/sub0)471+(462+col)%471 · (460+col)%469
Whiteneradditive PN over 368 input bits (VB6-Rnd regenerable)
FECturbo · two (13,15)-octal RSC · rate-½ (L4) · 12-bit dual tail
RSC stepa=u⊕r₁⊕r₂ · p=a⊕r₀⊕r₂ · s'=a|r₀<<1|r₁<<2
Decoderlog-MAP (max*) BCJR · ~12 iterations
CRCCRC-16/GENIBUS (0x1021, init/xor 0xFFFF, no reflect) over frame[:44]
Frame payload43 bytes + marker + 2B CRC
BW2300 OFDM — base level and the ladder above it §1
QuantityValue
Base levelrecord , host BITRATE (4) · index modulation, 175 bps
Samples / symbol · no cyclic prefix, no window, no overlap-add
Symbol rate · transform Bd · plain length- IFFT per symbol
Emissionone-hot: exactly one lit bin per symbol, −1j-phased, constant magnitude
Bin spanbins of the -point grid · bins at Hz
Bits per column — carried by which bin is lit, Gray-mapped
Columns per over = data + reference
Occupied bandwidth~735 – 2350 Hz
Frame container bytes · turbo input bits → coded
2048-point analysis windowFour 512-sample columns overlap in each analysis frame. This produces apparent occupancy across bins 34–98 at 23.4375 Hz spacing, with a ~23.7 Bd stride and 100 analysis frames per burst. A 512-point FFT recovers each individual emission column.
High-throughput records 9–16span 32 · dw50 1152 with a 128-sample cyclic prefix · LUT column pos per record · CRC → turbo(13,15) → whiten → interleave → Gray → LUT
Constellation LUT64-entry, records 9–16 only · truncated prefix of 6 columns (BPSK/QPSK/8-PSK · 16-QAM 1.1 · 32-QAM cross 1.5 · 64-QAM 1.6)
Caller-ID link-setup frame §4.2A · BW2300 rec3 OFDM
QuantityValue
Waveformthe ordinary BW2300 rec3 wideband OFDM burst — same waveform, coding chain and container as a DATA over. There is no separate narrowband burst
Geometry-sample symbols · one-hot over a -bin span · data emission columns × bits = coded bits
FECturbo · (13,15)-octal RSC · rate-½ · N= coded (2N+12)
Internal turbo interleavernative interleave_stage2 column 3, perm[i] = IL2[3+17·i][:N] — a clean 0..N−1 permutation used directly, with no pruning. Deriving it by dropping entries ≥ N from a larger column yields a different permutation and will not interoperate
Channel interleaverinterleave_stage1 column 3, first entries · GATHER: onair[k] = coded[π[k]]
Frame / callsign-byte frame · CRC-16/GENIBUS(body[0:90]) · caller callsign 6-bit packed at the frame start (A–Z→1–26, 0–9→27–36), SSID in body[5]
ARQ & host API §5 · §7
QuantityValue
StatesDISCONNECTED · LISTENING · CONNECTING · CONNECTED · DISCONNECTING
ARQ schemestop-and-wait · window 1 · 1 DATA over ⇄ 1 ACK over
Connect sequence
Data exchangeOver → peer's two-tone ACK → turn release → peer's over. The caller releases the sending turn with the confirm; the answering station sends the first data burst.
Turn release · SEED_OFF 61, PREADV 391 on the (62, 67) preamble · both stations key it, and the peer answers it by transmitting
Turnaround~85 ms, transmit to receive
Blocks / overgrows 1→2 after consecutive successes
Disconnectone burst, keyed to the called callsign, unanswered · SEED_OFF 60, PREADV 125
Ports8300 cmd · 8301 data

Observed results

Mail reception through K0SI at BW2300 and confirmed outbound delivery through KB8AY (message NL03TXWQ8SGL). Multiple deliveries confirmed by the operator. The KB8AY delivery used a registered third-party client SID.

Implementation evidence records the session conditions.