FT8: What’s Actually Happening In Those 15 Seconds

I did an FT8 talk at an NHARC meeting a while back. It wasn’t the usual “here’s how to install WSJT-X” program, mostly because everyone in the room had already done that part. What I wanted to do was open up one 15-second transmission and go through what’s actually inside it.

Slides are a bad medium for that kind of thing. So here’s the long version, including the parts that only ever lived in my speaker notes.


If you read nothing else: eight tones, and about half of what you transmit is error correction.

Why anybody bothered

Joe Taylor (K1JT) and Steve Franke (K9AN) released FT8 in 2017 and it took over HF inside of about a year. That doesn’t happen by accident, and I think it’s because the mode solved four different annoyances at the same time.

It decodes down to -21 dB SNR, which is around 20 dB below what your ear can pull out of the noise. Signals you can’t hear at all still print a callsign on the screen. Because of that, 5 watts into a compromised antenna will work DX, since the processing gain is doing the job an amplifier used to do. One signal is only 50 Hz wide, so dozens of contacts fit inside the space a single SSB conversation would occupy. And the message format is fixed and the clock is rigid, which means the software can run the whole exchange while you’re off refilling your coffee.

None of those four things is unique to FT8. Having all four at once is.

It’s one of a family

FT8 has siblings, and they all run the same playbook: structured messages plus heavy error correction. What changes between them is where they sit on the speed-versus-sensitivity curve, since a longer T/R period buys you more sensitivity.

ModeT/RFloorWhat it’s for
FT815 s-21 dBThe all-rounder. Fast enough to be fun, sensitive enough for real DX.
FT47.5 s-17 dBThe contest sprint. Twice the speed, less margin.
JT6560 s-25 dBThe ancestor. Very slow, very sensitive. EME and deep QRP.
WSPR120 s-31 dBNot a QSO mode. Beacons that map where your signal lands.

There are only three knobs

This is the part that made the rest of the talk click for people, and it’s something everyone in the room already knew without thinking about it. There are three things you can change about a carrier: how tall it is, how fast it wiggles, and where it sits in its cycle. Amplitude, frequency, phase.

CW flicks the amplitude knob on and off, two states, one bit per symbol, and the timing spells out Morse while your ear does the decoding. SSB rides the frequency knob smoothly with your voice. PSK moves where the wave sits in its cycle (FT8 doesn’t use phase, but leaving it out of the list bugs me).

FT8 steps the frequency knob between eight fixed positions instead of gliding. Once you see it as the frequency knob quantized, the rest of this stops being mysterious, because everything below follows from that one decision.

Why FSK survives the noise

Changing only frequency, and never amplitude, buys two things. The first is a constant envelope. Amplitude never moves, so the transmitter can run flat out without distortion, and a deep fade that would gut an AM or SSB signal barely dents a steady tone.

The second one is the one that matters. The receiver never has to guess a level. All it has to answer, per symbol, is which tone was loudest. That’s a much easier question than “is this audio readable,” and it keeps working long after the audio has stopped being audio. CW and SSB run out of margin because a human ear (or a level detector) runs out of margin. FT8 turns detection into a tone-picking contest, and a computer wins that contest down to -21 dB.

CWSSBFT8
What variesAmplitudeFrequency (analog)Frequency (8 tones)
Symbol states2 (on / off)continuous8 (3 bits each)
Bandwidth~50-150 Hz~2.4-2.8 kHz50 Hz
Typical power5-100 W50-100 W5-25 W
Weak-signal floorthe human earreadable audio-21 dB (software)

The last row is the one I’d point at. CW and SSB are limited by a person, and FT8’s floor is set by software, which keeps getting better every release.

The waveform, by the numbers

FT8 stands for “Franke-Taylor, 8-FSK.” Everything here falls out of two choices, eight tones spaced 6.25 Hz apart.

Eight tones gives you log2(8) = 3 bits per symbol. Eight tones at 6.25 Hz spacing gives you the 50 Hz bandwidth. The symbol rate is also 6.25 baud, and the tone spacing matching the baud rate is what makes the tones mathematically orthogonal, so they don’t interfere with each other. Each symbol lasts 1/6.25, or 0.16 seconds, which is slow and deliberate on purpose.

The 15-second clock

FT8 is strictly synchronized. Every minute gets cut into four 15-second slots and everybody transmits on the boundaries, you on the even slots or the odd ones and the other station on the opposite.

Your 12.6 seconds of tones have to land inside the other guy’s 15-second window, so both machines have to agree on what time it is. Keep the PC within about a second. NTP is plenty for a fixed station, GPS if you’re out portable.

Clock drift is the number one beginner problem. A couple of seconds off and nobody decodes you, and you’ll spend the evening convinced the radio is broken.

The reason for all that rigidity is more interesting than the rule itself. Since the decoder knows exactly when a transmission starts and stops, it can integrate all 12.6 seconds of energy rather than trying to catch it on the way past. That accumulation is a decent chunk of how it hears things you can’t.

An entire QSO in 77 bits

This is my favorite part of the design. Two callsigns and a grid square ride in 77 bits, under 10 bytes, less than this sentence. The budget for a standard message breaks down as 28 bits for the first callsign (sender, or CQ / QRZ / DE), 28 for the station being called, 15 for the grid or report, and 6 for flags and message type.

The trick is structure. You don’t store characters, you store which slot of which alphabet, because a standard callsign has a predictable shape. Slot 1 is one of 37 possible symbols, slot 2 one of 36, then a digit (10), then up to three letters (27 each, counting blank). Multiply it out and 37 x 36 x 10 x 27 x 27 x 27 comes to 262,177,560 combinations, which slides in just under 2^28.

Grids work the same way. 180 x 180 is 32,400 squares, comfortably inside 2^15. Signal reports and RRR / RR73 / 73 reuse that same field with reserved values, so nothing goes to waste.

People sometimes complain that the message set is rigid, and it is, but the rigidity is where the compression comes from. You don’t get a tiny message and free-form text at the same time.

Escape hatches, and one hard ceiling

Not every message is two standard calls and a grid, so there are a few ways out of the box.

Compound and DX calls (say, VP2E/KB3LYB) won’t fit in 28 bits, so FT8 sends a short hash of the full call and your rig fills in the real thing from calls it decoded in the last few minutes. That’s why an unusual callsign shows up in angle brackets sometimes, until your station has learned it. I get asked about that a lot and people are usually relieved it isn’t a bug.

CQ, QRZ, DE, RRR, RR73 and 73 never get spelled out either. They’re reserved values inside the callsign and grid fields, so they cost almost nothing to send. A 3-bit type field picks which layout is in use (standard call, EU VHF contest, nonstandard call, or free text) so the decoder knows how to unpack what it just received.

Then there’s the ceiling: 13 characters of free text, and that’s all you get. It’s the price of packing everything else so tightly, and it’s also the honest reason FT8 is a mode for contacts rather than conversations.

Why it decodes below the noise

A transmission is 79 symbols, 12.6 seconds long, and only 58 of those symbols carry your message. The other 21 are scaffolding, and the scaffolding is most of the reason weak decodes work at all.

CRC and LDPC

Your 77-bit message picks up a 14-bit checksum on the way out, making 91 bits. The checksum earns its keep by letting the decoder throw away a guess that’s almost right, rather than logging a callsign that never transmitted.

Those 91 bits then get expanded to 174 by a low-density parity-check code, LDPC(174,91). So half of what you’re transmitting is redundancy, which is how the decoder repairs damage instead of asking for a repeat. There’s no “say again” in FT8, and there’s no time for one either.

LDPC has a decent story behind it. Robert Gallager came up with it in 1962 and it got ignored for about thirty years, because nobody had the compute to decode the thing. It got rediscovered in the mid-90s once that stopped being true, and it’s now in Wi-Fi, 5G, DVB-S2 and 10GBASE-T. Your radio and your Ethernet switch are running the same idea.

Costas arrays

Every FT8 talk mentions the Costas arrays and then moves right along, which is too bad, because I think they’re the most interesting thing in the protocol.

A Costas array is a synchronization pattern. Think of a sync word, except two-dimensional, in time and in frequency. They’re named for John Costas, who came up with them at GE in the 1960s for sonar and radar work. Same guy as the Costas loop, different invention.

The math behind them is easy enough to state. Take a 7 by 7 grid and put exactly one mark in each row and each column. It qualifies as a Costas array only if every displacement between any pair of marks is unique, meaning no two pairs share the same time-and-frequency offset. That property is the whole point, because it means you can slide the pattern against itself and get one sharp spike where it lines up and at most a single coincidence at any other shift. It can’t partially match itself. Engineers call that a thumbtack autocorrelation, which I’ve always liked as a name.

FT8 uses 7 of the 8 tones over 7 symbols, the sequence 3, 1, 4, 0, 6, 5, 2, one of the 200 possible 7×7 arrays. It goes out three times, at the start, middle and end. Three copies of seven symbols is 21, which is why there are only 58 left over for your message.


Here’s what that buys. The decoder has no idea where you are in the waterfall, when exactly you started, or how far off frequency you are. So it slides this known pattern around in both time and frequency looking for the spike. When it finds one, it has located you, locked your timing, and measured your frequency offset, all before it decodes a single data bit. The three copies let it track drift and reject false matches.

Costas arrays were invented for radar, where you’re measuring range and Doppler at once and can’t afford ambiguity between them. That’s the same problem FT8 has, so the mode borrowed the trick wholesale.

If you want an analogy, they’re the audio version of the three black squares on a QR code. They aren’t data. They just say here I am, this way up, this is the scale.

Soft decoding

The last piece is that the decoder doesn’t work in hard ones and zeros. It works in probabilities, running a belief-propagation pass over and over until it converges on something the checksum will accept. Integrate 12.6 seconds of energy, find the sync spike, repair half the damage with parity, iterate on probabilities, and you get a callsign at -21 dB.

A complete contact

Six transmissions, about 90 seconds, and in practice you double-click a decode and the software runs the rest of the sequence for you.

SlotMessageWhat’s happening
TX:15CQ KB3LYB EN90You call CQ from your grid square
RX:30KB3LYB W1AW FN31W1AW comes back with theirs
TX:45W1AW KB3LYB -12You send a signal report
RX:00KB3LYB W1AW R-09They roger, and report you back
TX:15W1AW KB3LYB RRRYou confirm all received
RX:30KB3LYB W1AW 73They sign 73, contact logged

That’s the entire vocabulary of a standard FT8 contact. All the machinery above exists to move those six little messages around.

Getting a clean signal out

This is the part of the talk that actually improves people’s results. A clean, well-placed signal gets answered, and a loud splattering one gets ignored (or gets you a nastygram).

The most common sin is an overdriven signal. FT8 is a single tone at 100% duty cycle, so drive it such that the ALC barely moves, ideally near zero. Overdriving doesn’t get you more power. It splatters across the band, irritates everybody, and decodes worse than a clean signal at the same setting. Turn on rig split, or “Fake It” if the radio can’t do split, and WSJT-X will shift the carrier so your audio tones stay in the linear part of the passband without you touching a dial.

Place your transmission somewhere sensible too. Click an open slice of the waterfall to set your TX offset, roughly 1000 to 2000 Hz, rather than landing on top of somebody who’s already working someone. Receive matters as well: keep input audio in the green, around 30 to 50 on the meter and not pinned, since clipped receive audio buries weak decodes the same way overdriving splatters on transmit.

If you’re not getting decoded, it’s probably not a power problem.

Working the software

A couple of WSJT-X defaults are worth changing. Check “Hold Tx Freq” first, because the default behavior drags your transmit frequency on top of whoever you answer, which drops you into the pileup you were trying to avoid. Stay on your own clear frequency and let them come to you.

Decode depth (Fast, Normal, Deep) trades decodes for processor time. A quick PC running Deep with AP enabled will dig out the weakest stuff. On a Raspberry Pi, back it off, or decoding won’t finish before the next cycle starts and you’ll wonder where everybody went.

Also, transmit on the opposite slot from the station you’re calling. Two stations keying on the same cycle are completely deaf to each other, which is the other very common reason nobody answers you.

Companion tools

WSJT-X does the radio work, and a few free add-ons make it a lot more usable. GridTracker gives you a live map of every decode plus grid, DXCC and state tracking, award progress, and logging. JTAlert watches decodes for the calls, grids and states you still need, pops an alert, and pushes contacts into your logger. JTSync will keep the PC clock disciplined without you having to fight the Windows time service.

PSK Reporter is the one I’d point a newcomer at first, though. It’s a crowd-sourced map of where your signal is actually being decoded, and it’s honest feedback about your antenna and the propagation in a way no review or model is going to be.

Where it’s headed

People tend to assume the mode was finished in 2017, and it wasn’t.

SuperFox is the big recent addition, aimed at large DXpeditions. It first showed up in the 2.7 release candidates in 2024 and shipped in the 2.7.0 GA release. Instead of the old Fox and Hound approach of transmitting several concurrent FT8 signals, SuperFox sends one constant-envelope waveform carrying up to nine messages at once, which works out to roughly +10 dB of system gain. N5J on Jarvis Island was the first big operation to run it.

The rest of the family keeps filling in around FT8. Q65 has taken over weak-signal VHF, EME and scatter work, and FST4 and FST4W do the same job down on LF and MF. Different bands, same structured-message-plus-FEC playbook.

WSJT-X 3.0 landed in April 2026, and 3.0.2 is current as I write this. Among other things it added parallel FT8 decoding across concurrent threads, filters for decode categories, Wait and Reply / Call / Pounce, and audible alerts. The waveform itself hasn’t moved in years. It’s the software around it that keeps getting more sensitive and more convenient.

FYI, the project’s official home has moved to GitHub. The old SourceForge pages are still up, but releases and docs live at wsjtx.github.io now, and the team is pretty pointed about third-party “improved” builds not being the official distribution.

What you trade away

I’d rather be straight about this part than dodge it, since the room always has people on both sides. FT8 isn’t better than CW or SSB. It’s a different set of tradeoffs, tuned hard for one job, which is completing contacts at the edge of nothing.

What you get is DX on 5 watts and a wire, decodes 20 dB under the noise, a 50 Hz footprint so the band holds hundreds of simultaneous contacts, an exchange that runs itself once you click a caller, and a map showing where you’re getting out.

What you give up is conversation, because 13 characters isn’t a ragchew. You give up spontaneity, since you’re waiting for the next 15-second slot no matter what. You give up contest nuance and most of the personality, and you’re tied to a disciplined clock. Some folks would say you give up the romance too, and that’s where the “is it even radio” argument usually starts.

That argument is the most engaging part of the talk every time I give it, and I don’t think it has a settled answer. The technology’s settled. The culture isn’t.

Where to go deeper

  • WSJT-X for the software, docs and user guide.
  • The QEX paper by Franke, Somerville and Taylor, which is the actual source for the deep-dive half of this post. Section 17 breaks down every message type if you want bit-level detail.
  • PSK Reporter to see where your signal is landing in real time.
  • GridTracker and JTAlert, the two add-ons I’d install on day one.

Credit where it’s due: Joe Taylor K1JT and Steve Franke K9AN designed all of this and then gave it away. Let me know if I got anything wrong, or find me on the waterfall 🙂

73 de KB3LYB