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.

Simulation

A computer model tests a controlled idea. A model fitted to a real radio is still a simulation.

Radio replay

A saved radio recording is decoded again. This isolates receiver changes without transmitting a new packet.

Over-air test

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.

The recovered development sequence
WhenQuestion or changeEvidence
15–16 AugExplore four tones at lower baud; search audio tone placementChat simulation
18–20 AugReal-radio tilt, receive-emphasis and long-body timingRadio recordings and replay
26 AugImport v0.4 modem and seven-rate wire profileRepository validation
31 AugMinimum-phase emphasis rescues unchanged waveformPinned replay; later closure bench
3–4 SepContinuous synchronization and phase trellis; F0 defaultRecorded RF replay + owner decision
8–10 SepHold PTT across full PHY framesVirtual cable; owner RF feedback
22–25 SepField failure investigation; receiver fix versus re-toningRadio replay + fitted-channel simulation
26 Sep–22 OctMeasure full rate/FEC matrixDeterministic C++ reference simulations

Evidence and test conditions · PDF p. 4

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.

  1. 00Lowest tone
  2. 01Next tone
  3. 11Next tone
  4. 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 (%)

  1. 800 symbols/s · 1,600 raw bit/s0.030%
  2. 960 symbols/s · 1,920 raw bit/s0.162%
  3. 1000 symbols/s · 2,000 raw bit/s0.225%
  4. 1200 symbols/s · 2,400 raw bit/s1.293%

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.

Which alternatives have an inspectable result?
IdeaRecovered statusWhat we can conclude
Two tonesSimulated referenceOne bit per symbol; useful comparator, not the chosen JG family.
Four tonesSimulations, radio recordings, and implementationTwo bits per symbol; speed and tone placement could be adjusted together.
Three tonesDiscussion; no recovered comparative runDid not become the selected format.
Eight or sixteen tonesOwner recollection; no completed numerical comparison recoveredThe 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 comparisonPhase-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 proposalAn idea for a more elaborate modem, not a validated replacement.
Smoothed tone transitionsLater modeled-channel screenThe 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.

Evidence and test conditions · PDF p. 8

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.

Narrow audio filtering could erase the early advantage
Early waveformTypical-path bit errorsNarrow-path bit errors
Bell 2020.307%0.394%
4-FSK 16000.228%2.753%
4-FSK 19200.666%3.676%
4-FSK 20000.789%4.026%
4-FSK 24002.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.

The retained FM family: mode numbers are raw bit rates, not baud
ModeSymbols/s (baud)Tone centers (Hz)Adjacent spacing (Hz)
JG1200600500 / 1100 / 1700 / 2300600
JG1400700725 / 1275 / 1825 / 2375550
JG1600800775 / 1325 / 1875 / 2425550
JG1800900475 / 1125 / 1775 / 2425650
JG20001000525 / 1175 / 1825 / 2475650
JG22001100475 / 1125 / 1775 / 2425650
JG24001200500 / 1200 / 1900 / 2600700

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.

Evidence and test conditions · PDF p. 13

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 (%)

  1. 4-FSK 60033.8%
  2. 4-FSK 35096.7%
  3. 2-FSK 60054.2%
  4. 4-FSK 600 ×290.4%

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.

The full header contest
HeaderAirtime (ms)Decoded at −6 dBDecoded at −4 dB
4-FSK 60063.333.8%90.7%
4-FSK 42589.483.6%99.8%
4-FSK 40095.089.8%100.0%
4-FSK 375101.395.6%100.0%
4-FSK 350 — selected108.696.7%100.0%
2-FSK 600126.754.2%99.6%
4-FSK 600, repeat ×2126.790.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.

Evidence and test conditions · PDF p. 19

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 (%)

  1. No interleaving54.7% failed
  2. 32-row interleaving20.3% failed

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.

The four body-protection choices
ProfileNominal codingWhat the later evidence says
F0No body FEC; keeps an error-detection check (CRC-32C)Highest payload rate on clean paths.
F1About 3 data bits for every 4 coded bitsModest or negative sensitivity gain over F0 above JG1200 in the rounded later median results.
F2About 2 data bits for every 3 coded bitsSome gains, with extra airtime; not consistently better at every speed.
F3About 1 data bit for every 2 coded bitsLowest 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.

Evidence and test conditions · PDF p. 22

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

  1. Linear-phase +61 / 36 decoded
  2. Minimum-phase +634 / 36 decoded
  3. Minimum-phase +7.536 / 36 decoded

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.

A separate JG2400 body replay: keep failures and controls distinct
Recorded populationEarlier energy detectorPhase-aware detector
Previously failed JG2400 bodies (18 bodies)0 / 1818 / 18
Prior successful JG2400 controls (21 bodies)21 / 2121 / 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.

Evidence and test conditions · PDF p. 26

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.

Receiver-fixed 90%-delivery thresholds: lower is better
ModeFitted channelSelected tones (dB)Candidate A (dB)Candidate B (dB)
JG1800WYN fit9.611.111.8
JG1800Median fit9.510.710.4
JG1800Per-frame fits9.69.910.0
JG2000WYN fit11.913.710.0
JG2000Median fit11.413.39.7
JG2000Per-frame fits11.912.99.5
JG2200WYN fit10.010.710.4
JG2200Median fit9.89.99.9
JG2200Per-frame fits9.99.810.0
JG2400WYN fit13.814.415.7
JG2400Median fit11.813.613.9
JG2400Per-frame fits12.713.913.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.

A and B are specific to each symbol rate
Symbols/sCandidateTone centers (Hz)
900A900 / 1350 / 1800 / 2250
900B925 / 1400 / 1875 / 2350
1000A1000 / 1500 / 2000 / 2500
1000B700 / 1250 / 1800 / 2350
1100A650 / 1250 / 1850 / 2450
1100B700 / 1300 / 1900 / 2500
1200A750 / 1325 / 1950 / 2600
1200B700 / 1350 / 2000 / 2650

Evidence and test conditions · PDF p. 31

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

  1. AX1200926 bit/s
  2. JG2400/F01,881.3 bit/s
  3. JG2400/F31,044.8 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.

Protection changes both the rate and the signal needed
ModeF0 payload bit/sF0 threshold (dB)F3 payload bit/sF3 threshold (dB)
JG12001,047.46.33553.7-1.31
JG14001,199.32.00639.60.50
JG16001,345.74.91723.82.43
JG18001,486.83.43806.42.20
JG20001,622.95.88887.43.67
JG22001,754.44.50966.83.89
JG24001,881.36.751,044.85.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.

The fast default paid a sensitivity cost on fitted voice-radio paths
Fitted channelAX1200 (dB)JG2400/F0 (dB)JG2400/F3 (dB)
WYN preamble fit8.9412.8010.90
Median radio fit8.4312.149.00
Per-frame radio fits8.4011.779.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.

Evidence and test conditions · PDF p. 35

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.

The coordinated FM design, in plain language
PartRetained choicePurpose
SoundContinuous-phase four-tone FSK; Gray mapping 00 / 01 / 11 / 10Two coded bits per symbol while preserving the carrier’s continuous cycle.
Speed family600–1,200 symbols/s; 1,200–2,400 raw coded bit/sProvide several rate and robustness choices.
Opening48 or 96 preamble symbols, plus 20 sync symbolsFind the packet and estimate how the radio has changed it.
Header350 symbols/s on 950 / 1,350 / 1,750 / 2,150-Hz tonesRead the instructions reliably before decoding the faster body.
Checks and codingHeader CRC-16, body CRC-32C, and optional F1–F3 FECDetect corrupted packets and offer error repair when useful.
Interleaving8-row header; 32-row coded bodySpread concentrated damage before error correction.
ReceiverConditioning, timing search, phase-aware detection, and channel compensationUse more of the information that survived the radio.
Speed-first defaultJG2400/F0Favor 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.

Evidence and test conditions · PDF p. 40

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
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.