JG25 · The development story
A signal for voice radios.
A packet built for JSQ.
JG25 grew from two questions: how much useful data could travel through an ordinary FM microphone and speaker path, and how little packet overhead did JSQ actually need?
One part of the work shaped the tones around the radio. The other shaped the packet around the services. Error protection connected the two: a short, fast packet still had to arrive intact.
Part one · The tone story
Make the signal work through the radio we already have.
The constraint came first: use ordinary FM voice audio, including microphone pre-emphasis and receiver de-emphasis. A flat high-speed data port could not be a requirement.
Traditional 1,200-bit/s packet offered a starting point. Its two tones carry one bit per symbol. Four tones could carry two, giving 1,600 raw bit/s at only 800 symbols per second. That opened room to improve speed while adjusting how long the receiver had to recognize each symbol.
The first simulations showed the tradeoff immediately. Faster symbols produced more mistakes. With one fixed tone plan, the raw bit error rate rose from 0.030% at 800 symbols/s to 1.293% at 1,200 symbols/s. Those results narrowed the search, but the signal still had to survive the radio’s filters.
See the early speed comparison
Longer symbols made fewer raw bit errors
Lower is better · Raw bit errors (%)
Early simulation · 30,000 symbols per point · −2 dB sample-domain SNR · perfect timing and independent tone-energy decisions.
The audio path changed which tones worked.
Voice-radio audio is not flat. Its filters and emphasis change the relative strength of the tones, and the usable passband limits where they can sit. A four-tone plan that beat Bell 202 in one simulation lost that advantage when the modeled audio path narrowed.
So the search varied tone placement, spacing, and symbol rate together. Packing the tones too closely made them harder for the detector to separate. Moving them farther apart eventually pushed more energy toward the radio’s audio limits. The useful result was a family of seven tone plans, covering 1,200–2,400 raw bit/s.
Compare the early waveforms through two audio passbands
Scroll the table sideways to see every column. Keyboard: focus the table, then use the arrow keys.
| Early waveform | Typical-path bit errors | Narrow-path bit errors |
|---|---|---|
| Bell 202 | 0.307% | 0.394% |
| 4-FSK 1600 | 0.228% | 2.753% |
| 4-FSK 1920 | 0.666% | 3.676% |
| 4-FSK 2000 | 0.789% | 4.026% |
| 4-FSK 2400 | 2.620% | 5.975% |
Early simulation · −2 dB sample-domain SNR · 18,000 symbols × 3 runs per point · original 550/1,250/1,950/2,650-Hz four-tone plan, before later tone optimization. These are bit errors, not whole-packet losses.
See the spacing tests and selected tone plans
At 1,200 symbols/s, one sweep produced 10.110% bit errors with 350-Hz spacing, 1.337% at 700 Hz, and 1.548% at 750 Hz. Short ramps between tones also increased errors in a later channel simulation. These results apply to the tested receiver and settings.
Scroll the table sideways to see every column. Keyboard: focus the table, then use the arrow keys.
| Mode | Symbols/s (baud) | Tone centers (Hz) | Adjacent spacing (Hz) |
|---|---|---|---|
| JG1200 | 600 | 500 / 1100 / 1700 / 2300 | 600 |
| JG1400 | 700 | 725 / 1275 / 1825 / 2375 | 550 |
| JG1600 | 800 | 775 / 1325 / 1875 / 2425 | 550 |
| JG1800 | 900 | 475 / 1125 / 1775 / 2425 | 650 |
| JG2000 | 1000 | 525 / 1175 / 1825 / 2475 | 650 |
| JG2200 | 1100 | 475 / 1125 / 1775 / 2425 | 650 |
| JG2400 | 1200 | 500 / 1200 / 1900 / 2600 | 700 |
Tone span is not occupied bandwidth. Later rendered-audio measurements placed 99% of the power in roughly 2.47–2.53 kHz for the three slowest modes, and up to 3.17 kHz for JG2400. These are audio bandwidths, not an FM transmitter’s occupied RF bandwidth.
Real recordings revealed a receiver problem, too.
Recordings from an FT-8800-to-FT-817 path showed that higher tones were progressively weaker. Receive filtering could restore their levels, but simply making the tones equally loud was not enough. The filter’s timing behavior could also smear one symbol into the next.
That changed the direction of the work. Before replacing the tones, the same recorded packets were replayed through revised filters. Keeping the level correction almost identical but changing from a linear-phase to a minimum-phase filter raised successful decodes from one of 36 frames to 34 of 36. Much of the missing information was still in the recording.
A filter change recovered 34 of 36 recorded frames
More decoded frames is better
Saved-radio replay · the same 36 frames through each filter. The +6 comparisons keep tone-level correction nearly identical; +7.5 changes it too, so its final two recoveries cannot be attributed only to phase.
A phase-aware detector then used continuity across symbols, recovering all 18 previously failed JG2400 bodies while retaining the 21 successful controls. Improving the receiver made the existing transmitted signal more useful.
See the receiver replay results
The recorded path showed roughly −4.3 to −4.4 dB of receive tilt per octave. Initial receive conditioning recovered 8/8 JG2000-F1, 8/8 JG2000-F2, and 12/12 JG2400-F1 frames that had failed without it.
| Recorded population | Earlier energy detector | Phase-aware detector |
|---|---|---|
| Previously failed JG2400 bodies (18 bodies) | 0 / 18 | 18 / 18 |
| Prior successful JG2400 controls (21 bodies) | 21 / 21 | 21 / 21 |
Continuous packet detection, audio capture, and transmitter-keying fixes addressed separate faults. These are different replay populations; their counts cannot be pooled into an on-air reception rate.
With the receiver repaired, the tones got another test.
Some higher tone plans had helped the earlier receiver. After the repairs, the selected JG1800 and JG2400 plans needed less signal than either candidate on all three modeled radio paths. JG2200 was close. The receiver changes had removed much of the reason to alter those transmitted tones.
JG2000 remained an exception. A 700 / 1,250 / 1,800 / 2,350-Hz candidate needed 1.7–2.4 dB less signal in simulation. The receiver fixes were retained, while the tone change was deferred pending radio testing. Keeping the existing format preserved compatibility; it did not make the candidate’s advantage disappear.
See all 90%-delivery thresholds for the retune comparison
These are SNR thresholds for 90% delivery of long F0 frames through fitted channel models; lower is better. They are simulations, not calibrated measurements at a radio’s RF input.
The WYN model was fitted to a recorded packet’s opening at the remote station. The median and per-frame models were fitted to FT-8800-to-FT-817 recordings: one uses a median radio response, the other individual frame responses.
Scroll the table sideways to see every column. Keyboard: focus the table, then use the arrow keys.
| Mode | Fitted channel | Selected tones (dB) | Candidate A (dB) | Candidate B (dB) |
|---|---|---|---|---|
| JG1800 | WYN fit | 9.6 | 11.1 | 11.8 |
| JG1800 | Median fit | 9.5 | 10.7 | 10.4 |
| JG1800 | Per-frame fits | 9.6 | 9.9 | 10.0 |
| JG2000 | WYN fit | 11.9 | 13.7 | 10.0 |
| JG2000 | Median fit | 11.4 | 13.3 | 9.7 |
| JG2000 | Per-frame fits | 11.9 | 12.9 | 9.5 |
| JG2200 | WYN fit | 10.0 | 10.7 | 10.4 |
| JG2200 | Median fit | 9.8 | 9.9 | 9.9 |
| JG2200 | Per-frame fits | 9.9 | 9.8 | 10.0 |
| JG2400 | WYN fit | 13.8 | 14.4 | 15.7 |
| JG2400 | Median fit | 11.8 | 13.6 | 13.9 |
| JG2400 | Per-frame fits | 12.7 | 13.9 | 13.8 |
See the exact candidate tone plans
Scroll the table sideways to see every column. Keyboard: focus the table, then use the arrow keys.
| Symbols/s | Candidate | Tone centers (Hz) |
|---|---|---|
| 900 | A | 900 / 1350 / 1800 / 2250 |
| 900 | B | 925 / 1400 / 1875 / 2350 |
| 1000 | A | 1000 / 1500 / 2000 / 2500 |
| 1000 | B | 700 / 1250 / 1800 / 2350 |
| 1100 | A | 650 / 1250 / 1850 / 2450 |
| 1100 | B | 700 / 1300 / 1900 / 2500 |
| 1200 | A | 750 / 1325 / 1950 / 2600 |
| 1200 | B | 700 / 1350 / 2000 / 2650 |
The tone work established how to carry bits through voice-radio audio. The packet work addressed what those bits needed to contain.
Part two · The packet and FEC story
Build the packet around what JSQ needs to do.
AX.25 already gave OpenJSQ a way to carry its services. AX1200 puts a JSQ envelope inside an AX.25 packet, preserving compatibility with existing packet equipment and digipeaters.
The native JG25 format offered a chance to examine that arrangement field by field. The aim was to strip the format down to the information the services actually needed: who sent the packet, where it was going, what operation it represented, and the identifiers or fragment information needed to handle it.
Those fields could live in one native envelope. Type-specific fields carry what each operation needs, with room for extensions. Addressing, integrity checks, and service information stayed; the separate AX.25 wrapper and general-purpose OFQ2 header did not have to travel with them.
Packet format comparison
From AX.25 to a native JG25 frame.
Optional digipeaters
Control · PID
Sequence · Length
Optional fields
Station actions
AX.25 link fields wrap a separate OFQ2 service envelope. Existing AX.25 digipeaters can carry it.
CRC-16 + header FEC
Fields needed by this service
Optional extensions
Station actions
One native envelope carries the addressing and service information. The modem supplies acquisition and error protection.
Schematic field groups in transmission order; widths do not represent bytes or airtime. The bearers encode shared services differently. JG25 header FEC is always present; F0 omits body FEC and F1–F3 add it. JG25 requires a compatible decoder.
A lean body still needed a dependable introduction.
A receiver must find the packet and learn how to decode it before the service data can matter. JG25 begins with a known preamble and sync pattern, followed by a short radio header carrying the speed, FEC setting, and body length.
Early tests could find the beginning but lose the header. Slowing and protecting this small part of the packet improved reception while leaving the body fast. At −6 dB in the isolated-header simulation, the selected 350-symbol/s header decoded 96.7% of the time, compared with 33.8% at 600 symbols/s.
See the header experiments and acquisition timings
A slower four-tone header beat longer alternatives
Higher is better · Headers decoded (%)
Early simulation · isolated headers at −6 dB sample-domain SNR · same encoded information. This measures header success, not complete packets.
Scroll the table sideways to see every column. Keyboard: focus the table, then use the arrow keys.
| Header | Airtime (ms) | Decoded at −6 dB | Decoded at −4 dB |
|---|---|---|---|
| 4-FSK 600 | 63.3 | 33.8% | 90.7% |
| 4-FSK 425 | 89.4 | 83.6% | 99.8% |
| 4-FSK 400 | 95.0 | 89.8% | 100.0% |
| 4-FSK 375 | 101.3 | 95.6% | 100.0% |
| 4-FSK 350 — selected | 108.6 | 96.7% | 100.0% |
| 2-FSK 600 | 126.7 | 54.2% | 99.6% |
| 4-FSK 600, repeat ×2 | 126.7 | 90.4% | 100.0% |
The opening uses 48 preamble symbols in NORMAL or 96 in ROBUST, plus 20 sync symbols, at 600 symbols/s. With the 38-symbol header at 350 symbols/s, that takes about 222 or 302 ms before the body, excluding keying delays.
In one separate burst-interference simulation at −6 dB, complete acquisition rose from 19.6% with NORMAL to 57.1% with ROBUST. Finding the whole opening is a different test from decoding an isolated header. No false starts were seen in 320 simulated recordings without packets; that finite run does not establish a zero false-alarm rate.
The header carries 16 information bits, CRC-16, and error-correcting redundancy with encoder termination: 76 coded bits in 38 four-tone symbols. Either acquisition profile can be received independently of the station’s transmit setting.
Choose where extra bits are worth the airtime.
Making the packet lean did not mean removing protection. A damaged header can make the whole packet unreadable, so the header always has FEC. The body offers a choice: F0 for lower overhead, or F1–F3 to add error-correcting redundancy.
Interleaving spreads neighboring coded bits apart, helping the decoder cope with brief bursts of damage. The receiver also keeps confidence information about its decisions. CRC-32C then checks the decoded body for corruption. FEC attempts repair; the CRC checks the result, and JSQ file services can request another copy of blocks that still fail.
The experiments put a limit on a simple assumption: more coding did not always mean better reception. F3 needed the least signal at every speed in the later simulations, but F1 and F2 did not consistently improve on F0. Their extra airtime has to earn its place on the actual path.
See the FEC and interleaving comparisons
Spreading errors cut losses in this direct-waveform test
Lower is better · Frames lost (%)
Early direct waveform/filter/decoder simulation · JG1800-F2 · −5 dB in that test’s SNR convention. This is frame error rate, not raw bit errors.
Scroll the table sideways to see every column. Keyboard: focus the table, then use the arrow keys.
| Profile | Nominal coding | Result in the later reference simulations |
|---|---|---|
| F0 | No body FEC; keeps an error-detection check (CRC-32C) | Highest payload rate on clean paths. |
| F1 | About 3 data bits for every 4 coded bits | Above JG1200, little improvement over F0; some speeds needed more signal. |
| F2 | About 2 data bits for every 3 coded bits | Some gains, with extra airtime; not consistently better at every speed. |
| F3 | About 1 data bit for every 2 coded bits | Lowest signal threshold at every JG speed in the later reference sweep. |
F1–F3 share a convolutional code. F1 and F2 omit selected coded bits to reduce overhead. The header interleaver uses 8 rows; coded bodies use 32. Direct tests of 64-, 128-, 256-, and 512-byte bodies favored 256 bytes as a practical compromise; the early estimate favoring 512 bytes did not hold up in direct tests.
The two stories come together
More useful data, with choices for the path.
The result combined a four-tone signal fitted to voice-radio audio with a native packet carrying the information JSQ services need. A protected header and selectable body FEC let the receiver read each frame at the speed and protection it announces.
In the reference calculation, JG2400/F0 carried about 1,881 bit/s of useful payload over a complete waveform, compared with 926 bit/s for AX1200. That result reflects the waveform and packet format together; it does not isolate the savings from removing the AX.25 wrapper.
JG2400/F0 carries about twice AX1200’s waveform payload rate
Higher is better · Payload bit/s
Calculated over complete reference waveforms · 256-byte payloads · no retries or turnaround overhead. These are not measured whole-file transfer speeds.
Speed had a cost. On three fitted voice-radio models, JG2400/F0 needed about 3.4–3.9 dB more signal than AX1200 at 90% delivery. F3 reduced much of that gap while using more airtime. A lower mode number did not always need less signal with this receiver, so profile choice still depends on the path.
Compare payload rate and signal requirements at all seven speeds
Scroll the table sideways to see every column. Keyboard: focus the table, then use the arrow keys.
| Mode | F0 payload bit/s | F0 threshold (dB) | F3 payload bit/s | F3 threshold (dB) |
|---|---|---|---|---|
| JG1200 | 1,047.4 | 6.33 | 553.7 | -1.31 |
| JG1400 | 1,199.3 | 2.00 | 639.6 | 0.50 |
| JG1600 | 1,345.7 | 4.91 | 723.8 | 2.43 |
| JG1800 | 1,486.8 | 3.43 | 806.4 | 2.20 |
| JG2000 | 1,622.9 | 5.88 | 887.4 | 3.67 |
| JG2200 | 1,754.4 | 4.50 | 966.8 | 3.89 |
| JG2400 | 1,881.3 | 6.75 | 1,044.8 | 5.60 |
Production-code simulation · 256-byte payloads · thresholds are medians across seven channel models at 90% delivery. Lower threshold is better. The median of seven thresholds is not a delivery guarantee on an individual channel. The complete F0/F1/F2/F3 matrices are in the PDF.
Compare JG25 and AX1200 on the three fitted radio channels
These are the WYN preamble model and the median and per-frame FT-8800-to-FT-817 models described in the retune comparison.
Scroll the table sideways to see every column. Keyboard: focus the table, then use the arrow keys.
| Fitted channel | AX1200 (dB) | JG2400/F0 (dB) | JG2400/F3 (dB) |
|---|---|---|---|
| WYN preamble fit | 8.94 | 12.80 | 10.90 |
| Median radio fit | 8.43 | 12.14 | 9.00 |
| Per-frame radio fits | 8.40 | 11.77 | 9.00 |
These rates include the packet opening, header, checks, and coding, but exclude turnarounds, acknowledgements, keying delays, retries, and application overhead. The thresholds come from software simulations, not calibrated RF sensitivity measurements. Most fitted models draw on one radio pair. This history covers FM development; it does not establish HF performance.
Each frame retains its own opening and protected header. Operators select the transmit speed and FEC, while JSQ services handle their transactions above the modem. The separation leaves room to improve the radio link without rebuilding the services that use it.
Tests, methods, and sources
Follow the evidence further.
The report records the simulations, radio recordings, and receiver changes behind this story, using application snapshot 1cd39dea4441. Later builds may produce different results. The detailed tables above retain the reported values.
How to read the tests
A computer model tests a controlled idea. A model fitted to a real radio is still a simulation.
A saved radio recording is decoded again. This isolates receiver changes without transmitting a new packet.
Radios transmit and receive new packets. Results depend on the radios, settings, and path tested.
A waveform is the sound sent over the radio; the receiver software turns it back into data. Both affect whether a packet arrives intact.
Read the results within each test. Bit error rate counts wrong bits; packet delivery counts complete, checked packets. Signal-to-noise ratio (SNR) describes signal strength relative to noise. Early sample-based SNR and later audio-band SNR use different definitions and cannot be compared directly.
Development timeline · August–October 2026
Scroll the table sideways to see every column. Keyboard: focus the table, then use the arrow keys.
| When | Question or change | Evidence |
|---|---|---|
| 15–16 Aug | Compare four-tone speeds and tone placement | Early simulation |
| 18–20 Aug | Investigate unequal tone levels and timing in radio audio | Radio recordings and replay |
| 26 Aug | Integrate the modem and its seven-speed format | Implementation checks |
| 31 Aug | Improve receive filtering without changing the transmitted signal | Recorded-audio replay and follow-up bench tests |
| 3–4 Sep | Improve packet detection and phase tracking; choose the F0 default | Recorded-audio replay; default selection |
| 8–10 Sep | Keep the transmitter keyed for the complete packet | Virtual audio cable and on-air feedback |
| 22–25 Sep | Compare receiver repairs with changes to the tones | Recorded-audio replay and radio-channel simulation |
| 26 Sep–22 Oct | Compare all speeds and error-protection settings | Repeatable simulations using the modem code |
See the complete FM design summary
Scroll the table sideways to see every column. Keyboard: focus the table, then use the arrow keys.
| Part | Selected design | Purpose |
|---|---|---|
| Sound | Continuous-phase four-tone FSK; Gray mapping 00 / 01 / 11 / 10 | Two coded bits per symbol while preserving the carrier’s continuous cycle. |
| Speed family | 600–1,200 symbols/s; 1,200–2,400 raw coded bit/s | Provide several rate and robustness choices. |
| Opening | 48 or 96 preamble symbols, plus 20 sync symbols | Find the packet and estimate how the radio has changed it. |
| Header | 350 symbols/s on 950 / 1,350 / 1,750 / 2,150-Hz tones | Read the instructions reliably before decoding the faster body. |
| Checks and coding | Header CRC-16, body CRC-32C, and optional F1–F3 FEC | Detect corrupted packets and offer error repair when useful. |
| Interleaving | 8-row header; 32-row coded body | Spread concentrated damage before error correction. |
| Receiver | Conditioning, timing search, phase-aware detection, and channel compensation | Use more of the information that survived the radio. |
| Speed-first default | JG2400/F0 | Favor fast delivery on strong paths; retain other profiles for other conditions. |
A short glossary
- Baud / symbol rate
- The number of timed symbol choices sent each second. Four-tone JG25 carries two coded bits in each symbol.
- FSK
- Frequency-shift keying: choosing among tones to represent data.
- Preamble and sync
- Known patterns that help the receiver locate and align a packet.
- FEC
- Forward error correction: extra structured bits that can repair some errors.
- CRC
- A cyclic redundancy check that detects accidental corruption after decoding.
- Equalization / conditioning
- Receiver processing that compensates for predictable changes introduced by the channel.
- Phase
- Where a signal is within its repeating cycle. Preserving it can help separate fast continuous-phase symbols.
- SNR
- Signal-to-noise ratio. Compare dB numbers only when tests use the same measurement convention.
- Goodput
- Useful data actually delivered per second, after all overhead, retries, and delays.
The reference simulations used the modem’s transmit and receive code, matched packets and noise seeds, and seven FM channel models. Their noise is measured in the 300–3,000-Hz audio band, with a documented exception for the double-de-emphasis model. They omit the measured transmit third harmonic; thresholds were interpolated from finite packet counts.
The full illustrated report
Read the methods, graphs, and comparison tables. The PDF is public; some links to underlying application files require repository access.
Read the report · PDFReturn to the overviewSource notes and methods · PDF p. 44 · JG25 specification · Back to JG25