JG25 · The FM design story · In depth
How we found
JG25’s balance.
The route from an early four-tone idea to a working FM packet modem was a series of questions, tests, and corrections. Here is what changed, why it changed, and what the evidence still leaves open.
No radio-engineering background required. Technical terms are explained as they appear; the full tables and methods are available in the illustrated report.
How to read the experiments
Three kinds of evidence, three different jobs.
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 actually transmit and receive. A few successful packets show feasibility, not a universal reliability rate.
A waveform is the pattern of sounds sent over the radio. The demodulator is the receiver software that turns those sounds back into data. Changing one can change which design looks best.
Keep the units separate. A raw bit error is a wrong bit before packet validation. Packet delivery asks whether the whole checked packet arrived. “Signal-to-noise ratio,” or SNR, compares signal strength with noise; more dB means more signal relative to noise. Early sample-based SNR and later audio-band SNR use different definitions, so their numbers cannot be put on one scale.
The sequence · August–October 2026
The design evolved in eight stages.
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 | Explore four tones at lower baud; search audio tone placement | Chat simulation |
| 18–20 Aug | Real-radio tilt, receive-emphasis and long-body timing | Radio recordings and replay |
| 26 Aug | Import v0.4 modem and seven-rate wire profile | Repository validation |
| 31 Aug | Minimum-phase emphasis rescues unchanged waveform | Pinned replay; later closure bench |
| 3–4 Sep | Continuous synchronization and phase trellis; F0 default | Recorded RF replay + owner decision |
| 8–10 Sep | Hold PTT across full PHY frames | Virtual cable; owner RF feedback |
| 22–25 Sep | Field failure investigation; receiver fix versus re-toning | Radio replay + fitted-channel simulation |
| 26 Sep–22 Oct | Measure full rate/FEC matrix | Deterministic C++ reference simulations |
01 · The first tradeoff
Carry more bits without rushing every symbol.
Bell 202, the two-tone reference used here, sends one bit per symbol at 1,200 symbols per second. Four choices can carry two bits per symbol: 00, 01, 11, or 10. At 800 symbols per second, that already gives 1,600 raw bit/s. Continuous phase means the carrier’s cycle stays continuous when the tone changes.
- 00Lowest tone
- 01Next tone
- 11Next tone
- 10Highest tone
Schematic bit mapping; actual tone frequencies depend on the mode.
The earliest fast attempt doubled the raw rate but made substantially more mistakes. Slowing the symbols helped. This comparison holds the four tone centers fixed at 550, 1,250, 1,950, and 2,650 Hz.
Longer symbols made fewer raw bit errors
Lower is better · Raw bit errors (%)
Chat simulation · 30,000 symbols per point · −2 dB sample-domain SNR · perfect timing and independent tone-energy decisions.
White noise is only part of a voice-radio channel. Before selecting a mode, the team had to ask what filtering and distortion would do to it.
Scroll the table sideways to see every column. Keyboard: focus the table, then use the arrow keys.
| Idea | Recovered status | What we can conclude |
|---|---|---|
| Two tones | Simulated reference | One bit per symbol; useful comparator, not the chosen JG family. |
| Four tones | Simulations, radio recordings, and implementation | Two bits per symbol; speed and tone placement could be adjusted together. |
| Three tones | Discussion; no recovered comparative run | Did not become the selected format. |
| Eight or sixteen tones | Owner recollection; no completed numerical comparison recovered | The remembered loss cannot be given a measured margin or recreated from the spacing sweep. |
| Change phase instead of pitch (QPSK / DQPSK) | Discussed; no recovered direct comparison | Phase-modulation alternatives were set aside over receiver/channel complexity; no measured superiority claim here. |
| A more elaborate modem with stronger coding (multi-h CPM + LDPC) | Brainstorm proposal | An idea for a more elaborate modem, not a validated replacement. |
| Smoothed tone transitions | Later modeled-channel screen | The tested short ramps increased errors; that does not rule out every shaping method. |
The engineering explanation is plausible, but separate. More tones carry more bits per symbol. Fitting them into the same audio range forces a trade among spacing, symbol duration, and bandwidth. That helps explain the difficulty; it does not supply the missing higher-tone experiment.
02 · Fit the sound to the radio
Four tones still have to fit through a narrow doorway.
A voice radio does not pass every audio frequency equally. Imagine a doorway that is narrowest at its edges: pushing the outer tones too far out can make them weaker or more distorted. A clean-noise winner could therefore lose once realistic audio filtering was included.
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% |
Chat 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.
The search varied center frequency and spacing for each speed. In one 1,200-symbol/s sweep, 350-Hz spacing produced 10.110% raw bit errors, versus 1.337% at 700 Hz and 1.548% at 750 Hz. Close packing hurt this detector, while ever-wider spacing was not automatically better. Different runs used different setups, so these precise BER values should not be mixed with the earlier chart.
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 |
Four retained vectors trace directly to printed search winners. JG2000’s vector was also printed, but its retention was incompletely explained. The final changes to JG2200 and JG2400 were not recovered. Later comparisons help explain why those plans stayed; they do not reconstruct the missing original decisions.
Tone span is not occupied bandwidth. Modulation spreads energy beyond the outer tone centers. 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. That is audio bandwidth, not an FM transmitter’s occupied radio-frequency bandwidth.
03 · Help the receiver read the introduction
The message cannot arrive if its instructions are lost.
A packet starts with a known preamble and a synchronization pattern. They help the receiver find the beginning, estimate frequency offset, and line up the symbol timing. Then a small header says which speed and error-protection setting the message body uses.
Early tests could find the preamble but lose that header. The answer was to slow and protect the short header, rather than slow every bit of the body. The 350-symbol/s four-tone choice was the best tested airtime-versus-reliability compromise in this contest.
A slower four-tone header beat longer alternatives
Higher is better · Headers decoded (%)
Chat 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 selected opening has 48 preamble symbols in NORMAL or 96 in ROBUST, plus 20 sync symbols, all at 600 symbols/s. ROBUST adds 80 milliseconds. Including the 38-symbol header at 350 symbols/s, the opening takes about 222 or 302 milliseconds before the body, excluding radio keying delays.
Under one simulated burst-interference condition at −6 dB, complete acquisition rose from 19.6% with NORMAL to 57.1% with ROBUST. That is a different test from the 96.7% isolated-header result above: finding the whole opening remained harder than decoding a header whose position was already known.
What is inside the protected header?
The header describes mode, error protection, and body length in 16 information bits, adds a 16-bit cyclic redundancy check, and then adds error-correcting redundancy and encoder termination. The result is 76 coded bits, carried as 38 four-tone symbols. A cyclic redundancy check, or CRC, is the final test for accidental corruption; it does not itself repair errors.
Zero false acquisitions in 320 simulated no-packet recordings was a bounded test, not a zero-false-alarm guarantee. The receiver later learned to recognize either acquisition profile even when the station’s own transmit setting differed.
04 · Spend airtime where it earns delivery
Redundancy helps only if the receiver can use it.
Forward error correction (FEC) adds structured redundancy so the receiver can repair some damaged bits. Interleaving rearranges the coded bits before transmission, spreading a short burst of damage across the decoder’s work. The receiver also keeps confidence information instead of immediately treating every tone decision as certain.
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 | What the later evidence says |
|---|---|---|
| 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 | Modest or negative sensitivity gain over F0 above JG1200 in the rounded later median results. |
| 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. |
The underlying error-correcting code is shared; F1 and F2 omit selected coded bits to reduce overhead. The selected interleavers use 8 rows for the header and 32 for coded bodies. Tests also compared 64-, 128-, 256-, and 512-byte bodies. Direct trials made 256 bytes a useful historical compromise; an early extrapolation favoring 512 bytes was too optimistic.
The later production-code comparisons qualify the early “more coding always helps” intuition. Redundancy takes airtime, and receiver behavior matters. A small run with no failures does not prove a setting can never fail.
05 · August–September 2026 · Repair what the radio changes
First restore the balance. Then preserve the timing.
An FT-8800-to-FT-817 recording path showed roughly −4.3 to −4.4 dB of receive tilt per octave: higher tones were progressively weaker. Software emphasis boosted them back toward balance. Replaying selected recordings recovered 8/8 JG2000-F1, 8/8 JG2000-F2, and 12/12 JG2400-F1 frames that had failed without conditioning.
But two filters can make tones equally loud while delaying their components differently. That delay can smear one symbol into the next. A controlled comparison held the +6 dB/octave magnitude correction nearly identical and changed its phase realization—the timing behavior of the filter.
The same recording can vindicate a waveform
More decoded frames is better
Saved-radio replay · the same 36 frames per branch. The +6 comparisons isolate phase closely; +7.5 also changes magnitude correction, so its final two recoveries cannot be attributed only to phase.
The receiver also stopped treating fast symbols as four independent energy contests. At JG2400’s rate and spacing, the tones are not perfectly separable inside one short symbol window. A phase-aware detector followed the carrier’s continuous cycle across symbols, keeping information that the simpler detector discarded.
Scroll the table sideways to see every column. Keyboard: focus the table, then use the arrow keys.
| 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 |
Its 48 states track carrier phase; they are not 48 transmitted tones. A continuous synchronizer could also find a packet inside a recording opened by noise or a transmit transient. Missing audio, runtime queues, and keying defects were fixed separately.
The selection lesson: a failed decode may reveal a receiver defect rather than a bad transmitted waveform. These replay populations are different tests, and their totals should not be added into one reception rate.
06 · September 2026 · Make the comparison fair
Do the new tones still win after the receiver is fixed?
Field failures reopened the tone question. Lower tones suffered more relative delay on the fitted radio path, so moving them upward sometimes helped the earlier receiver substantially. The team then compared the candidates using the repaired receiver, including channel compensation and phase recovery.
A delivery threshold is the signal-to-noise ratio where the model reaches a target—in this case, 90% packet delivery. Lower is better because less signal is needed. These simulations use fitted radio channels and long F0 frames; they are not calibrated RF-input sensitivity measurements.
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 |
JG1800 and JG2400’s selected plans won all three comparisons against both candidates. JG2200 was close, with no decisive improvement established by these rounded figures. JG2000 was the clear exception: candidate B still needed about 1.7–2.4 dB less signal.
The exception matters
JG2000 candidate B was deferred, not disproved.
Its 700 / 1,250 / 1,800 / 2,350-Hz plan remained better in this comparison. The owner retained the receiver-only fix and deferred a change to the transmitted tones pending radio validation. That is a deployment tradeoff, not evidence that the retained JG2000 vector won.
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 |
07 · September–October 2026 · Measure the resulting family
A faster clean-link default, with a real sensitivity cost.
The later reference sweep used the actual modem transmit and receive code (C++), matched packets and noise seeds, and seven FM channel models. It gives a more useful comparison than ranking raw rates alone. Its waveform payload rate includes acquisition, header, checks, and coding, but excludes retries, keying setup, turnarounds, acknowledgements, and application envelopes.
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.
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.
F3 improved the threshold at every speed, while slowing delivery. The F0 sensitivity ladder was not monotonic: choosing a lower mode number did not always improve the modeled threshold with this receiver. There was no single “best” setting for every path.
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 |
On these three models, JG2400/F0 needed roughly 3.4–3.9 dB more signal than AX1200 at 90% delivery. F3 closed much of that gap. The practical achievement was a wider operating menu and a faster strong-link default, not a universal sensitivity victory.
These reference channels use FM-shaped noise 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; one radio pair underlies most fits. These figures are not sensitivity readings in dBm.
08 · The resulting design
The parts were selected together.
Scroll the table sideways to see every column. Keyboard: focus the table, then use the arrow keys.
| Part | Retained choice | 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. |
Some receiver features and defaults arrived after the original waveform search. The record explains why the system survived repeated challenges, while leaving genuine gaps: the original higher-tone results, the final JG2200/JG2400 tone changes, and over-air validation of the promising JG2000 retune.
Automatic rate ladders, compact multi-frame bursts, and short inter-frame markers were explored in the research campaign. They should not be described as current automatic behavior. The implemented format uses a full opening and header for each frame, with JSQ service reliability above the modem.
Read further · Review dated 23 October 2026
The evidence remains part of the story.
This account adapts the reviewed report from application snapshot 1cd39dea4441. No radio trials or sensitivity sweeps were rerun to write it. The report’s corrections table explains disagreements in the recovered histories, including tone-count wording, rate arithmetic, and swapped comparison labels.
The complete illustrated report
51 pages, 12 original graphs, 17 full comparison tables, and detailed source notes. The PDF is hosted here so the evidence can be read without a repository login. Links inside it identify the original application files; repository access may be required for those underlying files.
Read the full report · PDFReturn to the overview- Review corrections and unresolved evidence · PDF p. 42
- Source notes and methods · PDF p. 44
- Published JG25 specification — a separate published snapshot covering FM and HF.
- Website evidence notes — earlier decoder results and waveform rate versus file throughput.
- JG25 on the modem page — the operator-facing description.
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.