Chirps for the lowest rate, spread symbols for robust packets, and a single trained carrier for coherent PSK and QAM. The sections below specify packet bytes, channel coding and symbol layouts.
PACTOR-4 support is partial and experimental. Recorded decodes and live protocol observations establish parts of this implementation. They do not establish complete on-air PACTOR-4 mail delivery. The successful PACTOR-3 exchanges are a separate result.
Illustrative waveform rendered offline by the actual packet encoder from PACTOR-4 waveform diagram, status 0, at 48000 samples/s. Upper panel: Hann-windowed Welch spectrum, 4096 samples, 50% overlap. Lower panel: minimum and maximum samples in each display column. Dashed bands show training impulse times; shaping delays and overlaps those intervals. This is not a recording, a measured radio passband or evidence of peer acceptance. No audio plays.Rendered waveform — scale, counts and processing
Values describe this generated packet, not RF performance
Quantity
Value
Audio samples
38055
Duration, seconds
0.792813
Peak normalized amplitude
1.000000
RMS normalized amplitude
0.330370
Relative −26 dB bin range, Hz
281.25 – 2718.75
PSD display limits
0 – 3500 Hz; −60 – 0 dB relative
Waveform display columns
640
PSD frequency spacing, Hz
11.71875
Renderer input
PACTOR-4 waveform diagram; status 0
Training starts after the 140-chip measured header, then repeats every 208 symbols. The complete training offsets appear in the frame diagram below. Full waveform samples are neither downloaded nor played.
One protocol, several physical layers
Chirp, robust, normal
PACTOR-4 extends the PACTOR ARQ family, but its normal waveform is different from PACTOR-3’s parallel carriers. A normal P4 packet carries symbols on one carrier at 1800 symbols/s. Robust packets spread a slower differential symbol across 8 or 16 chips at that same chip rate. Chirp mode uses two sweeping carriers with a different symbol clock.
Chirp / SL1
Chirp modulation
Initial tones at 550 and 1530 Hz, sweeping upward at 294 Hz/s. Each carrier uses a 15 ms differential BPSK symbol: 66⅔ symbols/s, with a half-symbol stagger.
Its coding reuses the PACTOR-2 K=9, rate-1/2 path. The 25-byte net field contains 22 data bytes, status and CRC.
Robust / SF16 or SF8
Spreading factors
SF16 gives 112.5 information symbols/s; SF8 gives 225. Spreading is a complex sequence multiplication, not a bank of independent carriers.
Robust short packets and short control words are distinct from data-bearing robust packets. A spreading-factor lock alone does not identify their role or establish a CRC.
Normal / PSK and QAM
Normal-mode modulation
Known 32-symbol sequences alternate with unknown data blocks. They give the equalizer a reference for channel distortion and phase.
Normal bodies use BPSK, QPSK, 8-PSK, 16-QAM or 32-QAM. The packet family, cycle and coding rate determine what those symbols carry.
The robust short renderer’s explicit geometry is 20 header symbols + 1 phase reference + 64 block symbols, all spread by 16: 1360 chips, or 755.556 ms before shaping. Its measured 64-symbol block is a masked Hadamard code carrying a six-bit value, rather than an ordinary user-data field. The value’s relative coding is established; assigning it a protocol meaning is a separate task.
A 27-symbol SF16 control word has 432 chips, 240 ms before shaping. The measured word bank contains distinct response and break-in patterns; these should not be silently replaced by a generic Chu-sequence template. Nominal geometry and a recovered word are different kinds of evidence.
Exact ideal coordinates
Constellation geometry
These are the label-ordered coordinates used by the normal-LONG diagnostic implementation. They are generated from the code, not taken from a received recording. Each signed integer axis is divided by 4096. The 16- and 32-point QAM geometries are specific constructions, not generic square grids.
Ideal constellation, with I horizontally and Q vertically. Labels are the implementation’s integer symbol labels; the dashed unit circle provides a scale. No received scatter, noise model or successful high-level dispatch is implied.Constellation — labels and exact signed axes
Integer axes / 4096; the exact emitted coordinate table
Label
Signed I
Signed Q
I / 4096
Q / 4096
0
3547
2048
0.865967
0.500000
1
2048
3547
0.500000
0.865967
2
4096
0
1.000000
0.000000
3
1060
1060
0.258789
0.258789
4
-2048
3547
-0.500000
0.865967
5
0
4096
0.000000
1.000000
6
-3547
2048
-0.865967
0.500000
7
-1060
1060
-0.258789
0.258789
8
2048
-3547
0.500000
-0.865967
9
0
-4096
0.000000
-1.000000
10
3547
-2048
0.865967
-0.500000
11
1060
-1060
0.258789
-0.258789
12
-3547
-2048
-0.865967
-0.500000
13
-2048
-3547
-0.500000
-0.865967
14
-4096
0
-1.000000
0.000000
15
-1060
-1060
-0.258789
-0.258789
The PSK labels use a Gray phase walk. The 32-QAM construction combines an inner grid with fixed outer points; its three-decimal pre-rounding reproduces the implemented integer table. That is an inferred compatibility rule, not a claim about the original manufacturer’s quantizer.
Normal-LONG — exact level dimensions and capacity
Standalone SL6–10 normal-LONG dimensions. The body always has 4968 symbols; effective rate is 5/6. These rows do not establish live receiver or transmitter coverage at every level.
Level
Label bits
Points
Systematic bits
Net bytes
Data-field bytes
SL6
1
2
4140
517
514
SL7
2
4
8280
1034
1031
SL8
3
8
12420
1552
1549
SL9
4
16
16560
2069
2066
SL10
5
32
20700
2587
2584
Net bytes include one status byte and two CRC bytes. Data-field capacity still includes any source-coding or application overhead. Short packets at SL5 and SL6 share the 43-byte BPSK variant; the measured 206-byte normal-LONG BPSK path is a different rate-1/3 variant. Body modulation alone cannot distinguish all packet variants.
A channel estimate between blocks
Training and frame layout
The implemented normal layout uses 32 symbols of training before each data block and an additional terminal training. A short body has six 176-symbol blocks; a long body has twenty-four 207-symbol blocks. This figure starts at the first training symbol. It excludes the packet header and shaping tails.
Code-derived symbol layout. Dashed T blocks are 32-symbol trainings; solid D blocks carry data. The LONG view wraps onto two rows, each with proportional block widths. The table gives the complete symbol offsets, without relying on color.Training layout — all start indices and lengths
Zero-based symbol indices from first training, at 1800 symbols/s
Block
First symbol
Length
Start, ms
Training 1
0
32
0.000
Data 1
32
176
17.778
Training 2
208
32
115.556
Data 2
240
176
133.333
Training 3
416
32
231.111
Data 3
448
176
248.889
Training 4
624
32
346.667
Data 4
656
176
364.444
Training 5
832
32
462.222
Data 5
864
176
480.000
Training 6
1040
32
577.778
Data 6
1072
176
595.556
Terminal training
1248
32
693.333
The training sequence is C[9…16], C[1…16], C[1…8] from a 16-symbol CAZAC sequence, giving 32 symbols. Successive trainings alternate the base sequence and its conjugate. The receiver uses these known values to estimate and equalize the channel; a good training fit alone is not a packet acceptance test.
The published normal-mode pulse is retained as an exact 129-tap array. P4’s recovery helpers use 28800-Hz complex baseband, 16 samples per chip. Their matched-filter delay is 128 samples. At the audio interface, waveform renderers resample to the requested audio rate.
The renderers use measured 140-chip headers. Their nominal pulse-inclusive emission spans are 792.778 ms for SHORT and 3.286111 seconds for LONG; resampling produces the exact audio sample counts shown above. Those durations fit within short and long ARQ cycles of 1.25 and 3.75 seconds; the cycle also includes gaps and the response slot. The page does not equate emission duration with payload throughput.
The normal headers in these renderers were measured chip by chip. Their semantic interpretation remains incomplete. Reproducing a header does not prove that a peer will accept what a newly rendered packet claims.
Bits before symbols
Turbo coding
The turbo code retains the systematic input bits and adds parity from two eight-state recursive systematic convolutional components. C1 sees the bits in their original order. C2 sees the same bits in its own input permutation. After parity selection and packing, a separate symbol permutation controls placement in the waveform.
Net fieldData + status + little-endian CRC; whiten the complete byte field.
C1 and C2Two components from explicit initial states. Only C2 gathers the permuted input.
Pack and mapKeep systematic bits; select parity, assign labels, then permute symbols.
Shape the signalInsert training and headers; spread where required; apply the exact pulse.
state = (s1, s2, s3), newest delay first
u = input XOR s2 XOR s3
parity = u XOR s1 XOR s3
next state = (u, s1, s2)
C1 input[j] = systematic[j]
C2 input[j] = systematic[pi2[j]]
The zero-state transfer is (1 + D + D³) / (1 + D² + D³). Calling the encoder with an octal polynomial pair would leave important conventions unspecified: register ordering, feedback, parity order, state initialization and termination all matter.
Illustrative 20-position window into the exact component-selection rules. An empty box means omitted parity, not an erased systematic bit. Packet-specific tails and partial groups are outside this window.
At rate 1/2, the implementation keeps C1[0::2] and C2[1::2]. At rate 5/6 it keeps C1[0::10] and C2[4::10]. These are indexed from the start of each component stream. Packet paths define how the tail and padding fit around that selection.
Normal-short BPSK expands a 43-byte net field into 352 systematic bits: 344 field bits, five zero bits and three inputs terminating the first component. Both components start from zero, but C2 is not independently terminated. Full rate-1/3 packing yields 1056 coded bits, one per BPSK body symbol. This is not VARA’s 12-bit dual-tail convention.
An exact table without a literal array
Symbol and component permutations
C2’s input permutation changes which systematic bit enters the second encoder at time j. The symbol permutation acts later, after coding and mapping. Inverting either order changes the operation. A size such as 1056 can appear in both systems without meaning that the two tables are interchangeable.
First 64 entries of the exact direct gather. Open circles show the arithmetic base walk; filled dots show the corrected table. Vertical position is the source bit index. This is a code-derived permutation diagram, not a probability distribution or a measured error pattern.
Position j and source index; complete resources are linked in the derivation note
C2 input j
Arithmetic base
Exact pi2[j]
0
0
341
1
18
18
2
36
36
3
54
54
4
72
72
5
90
90
6
108
108
7
126
126
8
144
144
9
162
162
10
180
180
11
198
198
12
216
216
13
234
234
14
252
252
15
270
270
16
288
288
17
306
306
18
324
324
19
342
342
20
1
1
21
19
19
22
37
37
23
55
55
24
73
73
25
91
91
26
109
109
27
127
127
28
145
145
29
163
163
30
181
181
31
199
199
32
217
217
33
235
235
34
253
253
35
271
271
36
289
289
37
307
307
38
325
325
39
343
343
40
2
2
41
20
20
42
38
38
43
56
56
44
74
74
45
92
92
46
110
110
47
128
128
48
146
146
49
164
164
50
182
182
51
200
200
52
218
218
53
236
236
54
254
254
55
272
272
56
290
290
57
308
308
58
326
326
59
344
344
60
3
3
61
21
21
62
39
39
63
57
57
Runtime reconstruction starts with w = isqrt(N), concatenates range(r, N, w) for r = 0…w−1, then applies ordered index swaps from the compact resource. The constructor checks resource hashes, index bounds, the bijection and the canonical unsigned-16-bit little-endian permutation hash before use.
All thirteen supported tables, including 1160, are exactly reconstructible. The 1160 resource has 22 corrections. These corrections describe the final table relative to the arithmetic walk; they are not a recovered random generator-state doping recipe or the original generator’s accepted-swap trace.
Twelve original CML construction recipes are separately reproducible. They require seeds, prior constructor calls, continuous random state, the neighborhood rule and the accepted-swap budget. The original 1160 seed/history is still unresolved. Some large runtime tables need nearly N swaps: “compact” describes their representation, not a promise that every table differs from the base at only a few positions.
The normal-LONG symbol order is a 24-by-207 product of the published walks: row walk (24, 5) and column walk (207, 23). Normal-SHORT uses a 24-by-44 product with column walk (44, 22). Those 4968- and 1056-symbol tables are generated arithmetically and remain distinct from the C2 input tables.
C2 table construction
PRNG state and call history
Twelve of the thirteen runtime C2 sizes have recovered CML recipes. A recipe specifies the seed, ordered constructor calls, spread parameter and accepted-swap budget. The 1160-entry table is exact at runtime; its original seed and call history remain unresolved.
Initialize once
ran2 combines two modular recurrences and a 32-entry shuffle array. Initialize the state, then discard the first complete draw.
Draw two positions
For each proposal, draw i then j using floor(N × u). Rejections and equal positions consume both draws.
Test the old array
Both incoming values must pass the half-open neighborhood test before either position changes.
Keep the state
Stop at the accepted-swap budget. A later call resets the column walk, but continues the same PRNG stream.
The two recurrence moduli are 2147483563 and 2147483399, with multipliers 40014 and 40692. The shuffle result is scaled in double precision and clamped to 1 − 1.2e−7. Integer modulo is not an equivalent position selector.
The first seed-99 call is discarded, but cannot be skipped. The recovered recipes use 20N accepted swaps; upstream CML defaults to 10N. These are offline table constructors, separate from the per-packet whitener and from the stored swaps used by the runtime.
The net packet is source-coded data, one status byte and two little-endian CRC-16/X-25 bytes. Whitening covers that complete byte field and resets for every packet. The implementation XORs the register’s low byte, then advances eight right-shift Galois steps using seed 0x00B770CD and feedback 0x48000000. Channel-code tails are outside that byte transform.
The two protocol bits form one enumeration, not two independent PACTOR-3 flags. The implementation names normal, CLOSE, CHANGEOVER and speed-up values; the speed-up meaning lacks a recorded instance. Header type, packet status, receive timing and the session state must agree before a field can authorize an acknowledgement.
A CRC-valid field still contains source-coded bytes. It is not automatically a Winlink message. Extended status does not authorize removing an unknown prefix. One bounded recorded extension is handled explicitly; other unrecognized extensions remain refused. The raw frame is preserved independently of any host transformation.
The turn machine separates proposals from actual emissions: queued bytes advance on a keyed result, and settlement requires accepted associated response evidence. Waveform detection, CRC acceptance, ARQ acknowledgement, host delivery and completed mail transfer are separate outcomes.
What has been established
Implementation coverage
The project has live PACTOR-4 signaling observations, retained foreign waveform decodes and packet-specific round trips. Normal-short and normal-long BPSK paths have CRC-valid recorded examples. Chirp framing is checked against four retained Dragon fields. Higher-order normal-short paths have recorded checks; the normal-LONG SL6–10 module shown above is a standalone diagnostic path.
Those results do not establish complete live PACTOR-4 mail delivery or full interoperability across every packet family. The current offline replay reaches a CMS prompt and sends a B2F login/proposal. The implementation evidence describes that narrower result separately from demonstrated PACTOR-3 mail exchanges.
Measured normal-header semantics remain incomplete. Robust-word names and timings are backed by particular observations; their presence is not a complete specification of every control transition. Source framing and fill include documented assumptions. Live receiver dispatch, acknowledgement eligibility, deadline budgets and every higher-rate transmit path require their own evidence.
The geometry on this page remains ideal and code-derived. The constants do not establish interoperability at every speed level.
Reproduce the implementation
Protocol and source references
The detailed notes identify literal arrays, generators, resources, bit order, framing and remaining assumptions. Built source links stay local to this release.
The linked protocol notes cite SCS’s technical description, including its published modulation, training, pulse and coding sections. Derived implementation conventions and measured interpretations are identified separately.