PACTOR implementation constants
PACTOR is an alpha implementation. PACTOR-3 has successful mail exchanges. A recovered waveform or CRC-clean frame does not, by itself, prove a complete interoperable mail session.
The illustrated guide explains the signal and ARQ exchange. This companion maps the complete implementation inputs to public source: literal codewords, table constructors, compact resources, bit conventions and framing. Links in the built site open local, line-numbered copies from this release. The source links also work in the source distribution. A protocol's wire constants and hfmodem's receiver thresholds or sample-rate choices are identified separately; copying a threshold is not a protocol requirement.
PACTOR-3: packet to audio
The ordinary packet travels through source coding, fixed-length fill, status, CRC, whitening, convolutional coding, puncturing, full-frame interleaving and carrier placement. Link entry adds acquisition. An established packet starts with a phase-reference row and the constant/variable header rows before its coded body. Net field bytes enter the convolutional encoder LSB-first after whitening; the CRC trailer is little-endian. The receiver reverses those steps and checks the CRC before delivery.
The carrier law is 18 tones at 480 + 120*c Hz, 100 Bd, centred at 1500 Hz. SHORT uses 72 body rows; LONG uses 320. A phase-reference row and eight header rows are separate from that body. Speed level selects the active carrier set, DBPSK/DQPSK width, convolutional code, puncture mask and field size. Both the transmit path's tap convention and parity order matter: an octal pair alone is not enough to reproduce a packet.
| Implementation input | Public definition and exact convention |
|---|---|
| Carrier sets, speed levels and capacities | spec.SPEED_LEVELS; all 6 rows, rate, K, short/long payload bytes, active channels and nominal throughput. spec also defines carrier frequencies and cycles. |
| Acquisition, headers and carrier swap | spec.VARIABLE_HEADERS, spec.CONSTANT_HEADERS and p3frame; all 16 variable and constant codewords, middle-nibble transmit transform, header tone ordering, acquisition reference and dibit labels. |
| Status, fill and control words | spec.status_byte; spec.field_fill and spec.CONTROL_SIGNALS cover status bit positions, the 15-byte repeating fill, 6 control words and CS timing. |
| CRC and whitening | crc.crc16 defines X.25 init/reflection/xorout (default), and coding.whiten XORs the reflected CRC table in big-endian words, resetting per packet. Packet CRC bytes are little-endian in placement.build_field. |
| Convolutional trellis and puncturing | fec.ConvCode defines register/tap ordering; coding.CODE_K9 explains reciprocal K=9 polynomials; placement.CONV_GENERATORS pins actual K=7 TX parity order. coding.PUNCTURE_3_4 and coding.PUNCTURE_8_9 supply the complete SL5/6 masks. |
| Field sizing, tail bits and interleaving | placement defines each Path, short/long strides, CRC coverage, flush bits, physical carrier-order walk and differential phase labels. Use placement.link_packet as the implemented packet entry point rather than a generic candidate interleaver. |
| Pulses, phases and CS placement | modem and placement.assemble contain pulse generation, filter law, initial carrier phases, stagger and gain conventions; placement.control_burst covers 20-bit two-tone controls. 48 kHz is this implementation’s audio convention. |
| Source coding and link policy | compress contains the full Huffman/reference tables, escapes and run coding; arq contains P3 ladder, cycle changes, repeat budgets, changeover and disconnect state machine. Receiver acquisition and decoding are in p3rx. |