Baudot / ITA2 code. Each character is 5 bits, giving 32 codes — not enough for letters + digits + punctuation, so two shift states (LTRS and FIGS) are used. A control code 11111 switches to LTRS and 11011 switches to FIGS. The transmitter inserts shift codes when it needs to change modes.
Asynchronous framing. Each character is framed by 1 start bit (space, 0) and 1, 1.5, or 2 stop bits (mark, 1). The line idles at mark. Inside the frame, the 5 data bits are sent least‑significant‑bit first. That's why this page shows the table code in MSB notation (e.g. A = 00011) but the on-air bits read in reverse (1 1 0 0 0) — same character, two orderings. The bit-position labels b0..b4 are the on-air order.
FSK tones. Two audio tones, one for mark (1) and one for space (0). Amateur convention is 2125 Hz mark and 2295 Hz space (170 Hz shift) — the mark tone is lower than the space tone in audio. On RF, with LSB modulation (the HF norm), this inverts: mark corresponds to the higher RF frequency. So both statements you'll see in the wild — "mark is lower" and "mark is higher" — can be true; they just refer to different sides of the radio.
Baud rate. 45.45 baud is the classic amateur rate (~60 wpm). One symbol = one bit. At 1 baud, each bit lasts a full second so you can hear the FSK pattern element by element.
Try this. Set baud to 1, type a short message, and listen. The line idles on the lower mark tone, drops to the higher space tone for the start bit, then sends five data bits LSB-first, then returns to mark. Watch the clock pip alternate on every bit boundary — that's the symbol clock.
Each 5-bit code maps to one character in LTRS shift and a different character in FIGS shift. Codes shown MSB-first (the table convention); on-air bits are sent LSB-first.
8-FSK at 6.25 baud. Each FT8 transmission sends 79 symbols over 12.64 s (~6.25 symbols/sec). Each symbol selects one of 8 tones spaced 6.25 Hz apart, so the whole signal occupies just 50 Hz of audio bandwidth. Three symbols per data tone → 174 bits in 58 data symbols (the rest are sync).
15-second cycle. Stations transmit synchronized to absolute UTC seconds 00 / 15 / 30 / 45. The transmission lasts 12.64 s, then 2.36 s of silence before the next slot. The dashed line on the cycle bar marks the end of the transmission window.
Costas sync. Three copies of the [3,1,4,0,6,5,2] Costas array are embedded at symbol positions 0–6, 36–42, and 72–78. The decoder uses these to lock onto each signal in time and frequency. They're shown in orange on the symbol timeline.
Multiple concurrent stations. A typical FT8 passband is ~2.5 kHz wide and holds 50+ simultaneous QSOs, each occupying its own 50 Hz slot. Add stations above, each with its own audio offset, and the waterfall will show them stacked in frequency. Crank up the level on one and listen — you'll hear it as a distinct "warbling" tone among the others.
Messages are structured, not text. When WSJT-X sends CQ N7COM CN87, it isn't encoding character text — it's packing a typed message (type 1 = standard QSO) with fields: marker CQ (28 bits), callsign N7COM (28 bits), grid CN87 (15 bits), plus a few flag bits, totaling 77 bits. Callsigns get a dedicated 28-bit field with their own lookup; they're not encoded as ASCII. Compound calls like W1AW/P trigger a different message type (i3=4) with a 58-bit full encoding plus a 12-bit hash so subsequent references stay compact. The Type dropdown in the composer above is the same set of templates WSJT-X uses internally.
Note on realism. This tool generates real Costas sync arrays at the correct positions and uses real FT8 timing and tone spacing, but the data symbols are pseudo-random (derived from a hash of the synthesized on-air text). A real WSJT-X decoder won't decode them — the educational value is in the structure and sound of FT8, not in interoperability.
FT8 is 8-FSK at 6.25 baud. Each symbol picks one of 8 tones spaced 6.25 Hz apart from a station's base frequency. Each data symbol encodes 3 bits.
Costas sync array — the pattern [3, 1, 4, 0, 6, 5, 2] is embedded at symbol positions 0–6, 36–42, and 72–78. The decoder uses the three copies to lock onto each signal in time and frequency simultaneously.
Frame layout (79 symbols total):
Total payload after FEC: 174 bits encoding a 77-bit message (callsign + locator / report / 73 etc.) plus 14-bit CRC, expanded through a (174, 91) LDPC code.
Every FT8 message starts with a 3-bit type code (i3), and when i3=0 a further 3-bit subtype (n3). The type determines the layout of the remaining bits — a callsign in a standard QSO is one 28-bit field, but in a nonstandard-call message it's a full 58-bit encoding plus a 12-bit hash. Fields: c28 = 28-bit standard callsign or marker (CQ / DE / QRZ), r1 = /R rover flag, R1 = roger-acknowledge bit, g15 = 15-bit grid or report, h12 = 12-bit hashed callsign, c58 = 58-bit full callsign, n3 = subtype.
~95% of QSOs use type 1 (standard QSO container) for the entire CQ → grid → report → R-report → RR73 → 73 sequence. Free text (type 0.0) is rare. The composer above lets you pick any of these templates — the on-air text and bit budget under each row update live.
00 · BIT 0 = PHASE REVERSAL · BIT 1 = SAME PHASE · TIME →Phase Shift Keying at 31.25 baud. PSK31 (invented by Peter Martinez G3PLX in 1998) encodes data by flipping the phase of an audio carrier — not by changing frequency like RTTY/FT8. A 1 bit keeps the phase the same; a 0 bit reverses it (180°). The symbol rate of 31.25 baud gives the mode its name and produces a very narrow signal — about 31 Hz wide — letting many QSOs fit in a fraction of an SSB channel.
Varicode. Characters are encoded using Huffman-like variable-length codes optimized for English: space is just 1 (1 bit), e is 11, t is 101. Rare characters get longer codes (10+ bits). No varicode contains two consecutive zeros — so a 00 sequence is the unambiguous inter-character separator. The bitstream view above shows your message decomposed into varicode with separators highlighted.
Raised-cosine pulse shaping. When phase reverses for a 0 bit, the carrier amplitude is shaped as a raised cosine that passes through zero at the symbol boundary — this keeps the spectrum clean (no splatter) and gives PSK31 its tight bandwidth. On the constellation, you'll see the trajectory swoop through the origin during a reversal.
Reading the constellation. The plot is an I/Q (in-phase / quadrature) diagram. Any sine wave at the carrier frequency can be drawn as a 2D vector: horizontal axis = in-phase (aligned with the carrier), vertical axis = 90° offset. The vector's angle is the carrier's instantaneous phase; its length is the amplitude. BPSK31 has only 2 valid phases — 0° (right) and 180° (left) — marked by the faint white reference dots. The orange dot is the current phase; the trailing line is the recent path. A 1 bit keeps the dot still; a 0 bit swoops it through the origin to the opposite side — that swoop is what keeps the spectrum narrow.
Idle pattern. Between transmissions PSK31 sends all-zeros — continuous phase reversals at 31.25 Hz, which sound like a steady whistle modulated at a sub-audible rate. Decoders use this to lock onto the signal before the operator starts typing.
BPSK vs QPSK. BPSK31 (the default) has 2 phase states (0° / 180°). QPSK31 has 4 states (0° / 90° / 180° / 270°) and uses a 5-bit Viterbi convolutional code — same baud rate, slightly more robust under multipath but harder to tune.
Try this. Set baud to something low like 5 to clearly hear each phase flip, type a single character like e (varicode 11), and watch the constellation: 1 bits keep the dot in place, 0 bits (separators or the second bit of varicode 00) swoop the trajectory through the origin to the opposite phase.
Each printable character maps to a unique sequence of 0s and 1s. No code contains 00 internally — that pattern is reserved as the inter-character separator. Most common letters get the shortest codes.