hfmodemDocumentation

MIL-STD-188-110C appendix D, 3 kHz

hfmodem.bateleur.wbhf sends and receives the 3 kHz waveforms of MIL-STD-188-110C appendix D, the wideband HF family: waveforms 0 to 13, 75 to 16000 bit/s. It was written from MIL-STD-188-110C with Change 1, appendix D. No other implementation was read, and nothing has been tested against another sender.

The appendix covers channels of 3 to 24 kHz. Only 3 kHz is here: the rest need wider channels than an amateur SSB transceiver passes. At 3 kHz it is 2400 symbols a second on 1800 Hz, the same as 188-110's serial tone and STANAG 4539, so it goes through the same rig unmodified.

The waveform

PartWhereParagraphs
Waveforms 0-13: Walsh, BPSK, QPSK, 8-PSK, 16-, 32-, 64- and 256-QAM; their rates, frame lengths and mini-probesWAVEFORMStables D-II, D-XI, D-XII
PSK numbers scrambled by adding the last 3 stages of x^9 + x^4 + 1, QAM by exclusive-or with its last 4-8; the register reset at every framedata_frame, s4539.scramble_valuesD.5.1.3
The 256-QAM constellationQAM256table D-X
Waveform 0: a dibit a 32-chip Walsh symbol, an interleaver block's last from the alternate set, chips scrambled by the (159, 31) trinomial, 2048 values, reset at each blockwalsh_block, TRID.5.1.2.3, D.5.1.4
Preamble: 0-255 level-control blocks; M superframes of 9 fixed, 4 count and 5 waveform-identifier Walsh symbolspreamble, superframeD.5.2.1
Mini-probes: a base sequence extended (24, 32 or 48 symbols); the one after each long interleaver block's second-to-last frame shiftedprobe, shifted_afterD.5.2.2, table D-XXI
K=7 code, full tail-biting, repeated then punctured (1/8 to 9/16)encode_blockD.5.3.2, table D-XLII
Block interleaver, ultra short to long, loaded by increment and read in orderencode_blockD.5.3.3, table D-XLIII
End of message 4B65A5B2, and zero fill to whole blockssymbols, find_eomD.5.4.3

The test suite checks the appendix's worked examples:

Where the text left a choice

Modes

Modes are named by rate and interleaver: US, S, M or L, for example 9600L, 150US or 75S. Waveform 0 has no ultra short interleaver. Each rate belongs to one waveform:

WaveformRateModulationCodeInterleaver, US / S / M / L
075Walsh1/2– / 0.53 / 1.92 / 7.68 s
1, 2150, 300BPSK1/8, 1/40.16 / 0.64 / 2.56 / 10.24 s
3, 4600, 1200BPSK1/3, 2/30.11 / 0.43 / 1.71 / 6.83 s
5-101600-9600BPSK to 64-QAM3/40.12 / 0.48 / 1.92 / 7.68 s
11, 1212000, 1600064-, 256-QAM8/90.16 / 0.64 / 2.56 / 10.24 s
132400QPSK9/160.12 / 0.48 / 1.92 / 7.68 s

The receiver reads the waveform and interleaver from the preamble, so only the sender sets the mode: MODE WBHF <mode> on the host port, or offair render WBHF --mode. The modem always listens for it, as it does for 188-110 and 4539. A STANAG 5066 node set to it changes rate to any of its rates.

The receiver

Acquisition looks for the preamble's 288 fixed symbols. Waveform 0 is to work at -6 dB, where the fixed symbols score about 0.2 against the 0.35 the other serial waveforms use. This one takes 0.13. Noise alone, searched over minutes at three offsets, never went above 0.075. Nor did a 188-110, 4285 or 4539 transmission. A preamble is taken only once twice its fixed section has arrived. The fixed section has sidelobes a Walsh symbol either side, and these clear 0.13. Taken any sooner, the search had once settled on one of them, and the header read was wrong.

The header is read from a symbol-spaced channel fitted to the fixed section. Each count and identifier symbol's four values are scored against what arrived, one symbol at a time, the chosen one then counted as known for the next. The count and identifier taken are the valid codewords those scores favour most. A longer preamble's count says how many superframes are still to come.

Equalization is the 4539 receiver's: the block path equalizer, its gains from the mini-probes, beside the RLS one. It takes the mini-probes' fifth roots of unity (the 48-symbol probe of waveforms 1 and 2) as known points. Waveform 0 is decided a Walsh symbol at a time by the path model alone, as 188-110's 75 bit/s is.

Losing the signal. These waveforms work below 0 dB, where the known symbols' error never drops below the other receivers' "signal gone" line: at -6 dB it is about 4 with the signal there. So reception ends when the error is both past that line and six times what it was in the preamble, sustained over a second or two. With the signal gone the error is past 30.

Streaming (stream.ReceiverWbhf) releases each interleaver block's bytes as soon as it is decoded, less the few that might begin the end of message.

Not here

Measured performance

Table D-LII asks for a coded BER of 1e-5 with the long interleaver and a 20-superframe preamble, on white noise and on the 2 ms / 1 Hz poor channel. Each figure below is from eight transmissions of about 25 s each, through bateleur.sim with a 23 Hz offset, at the SNR the table gives (python -m hfmodem.bateleur.measure wbhf <mode> <channel> <snr>). That is 15 kbit to 3.2 Mbit a point, so the rates are shown to the bits counted, not to 1e-5 with any confidence.

RateWhite noiseatPoor (2 ms, 1 Hz)at
750 errors in 15 kbit-6 dB0 in 15 kbit-1 dB
1500 in 30 kbit-3 dB0 in 30 kbit3 dB
3000 in 60 kbit0 dB0 in 60 kbit5 dB
6000 in 120 kbit3 dB1.4e-3 (one block of one transmission)7 dB
12000 in 240 kbit5 dB0 in 240 kbit10 dB
16000 in 320 kbit6 dB0 in 320 kbit11 dB
24000 in 480 kbit6 dB0 in 480 kbit11 dB
32000 in 640 kbit9 dB0 in 640 kbit14 dB
48000 in 960 kbit13 dB1.4e-5 (13 in 960 kbit)19 dB
64000 in 1.3 Mbit16 dB0 in 1.3 Mbit23 dB
80000 in 1.6 Mbit19 dB0 in 1.6 Mbit27 dB
96000 in 1.9 Mbit21 dB0 in 1.9 Mbit31 dB
120009.0e-5 (216 in 2.4 Mbit)24 dB–
160005.0e-6 (16 in 3.2 Mbit)30 dB–

Three points miss, each by about a decibel:

The other tests in D.6, each four transmissions:

At +75 Hz a transmission was first lost whole, because acquisition took the search from 0 Hz. That search read the offset 150 Hz wrong (a 16-symbol chunk cannot tell the two apart). The same preamble found from +50 Hz now wins on its far higher score.