| name | ft8-codec |
| description | Encode and decode FT8 and FT4 weak-signal digital mode transmissions in audio WAV format. FT8 is the most popular amateur HF digital mode since 2018, using 8-GFSK at 6.25 baud with LDPC(174,91) FEC and 77-bit structured messages (callsigns, grid locators, signal reports). FT4 is a faster contest variant. Use this skill whenever the user mentions FT8, FT4, WSJT-X, weak signal, Joe Taylor, K1JT, amateur radio digital, ham radio FT8, HF digital mode, FT8 decoder, grid locator, Maidenhead, CQ call, or wants to create/analyze FT8/FT4 audio WAV files. Covers encoding (messages to WAV) and decoding (WAV to text).
|
FT8/FT4 Weak Signal Digital Mode Codec
Encode and decode FT8 and FT4 weak-signal digital mode transmissions used in amateur radio HF weak-signal communications.
FT8 (Franke-Taylor design, 8-FSK) was developed by Joe Taylor K1JT and Steve Franke K9AN and released in WSJT-X in 2017. It has become the most popular amateur HF digital mode since 2018 for making contacts under weak signal conditions. FT4 is a faster variant designed for contest use.
This codec handles the complete FT8/FT4 signal chain:
- 77-bit message packing/unpacking (callsigns, grid locators, signal reports, free text)
- CRC-14 error detection
- LDPC(174,91) forward error correction with belief propagation decoding
- Symbol mapping and sync insertion (Costas arrays)
- GFSK modulation/demodulation with Gaussian smoothing (BT=2.0)
- WAV file I/O and frequency searching
Perfect for ham radio operators and SDR hobbyists who record HF bands and want to decode FT8/FT4 transmissions from their recordings.
Signal Characteristics
FT8:
- Modulation: 8-GFSK (8-tone Gaussian FSK)
- Symbol rate: 6.25 baud
- Bandwidth: ~50 Hz
- Duration: 12.64 seconds per transmission
- Tone spacing: 6.25 Hz
FT4:
- Modulation: 4-GFSK (4-tone Gaussian FSK)
- Symbol rate: 20.8333 baud
- Bandwidth: ~80 Hz
- Duration: 4.48 seconds per transmission
- Tone spacing: 20.8333 Hz
Message Types
FT8/FT4 supports several message types encoded in a 77-bit payload:
-
Standard messages: Two callsigns (28 bits each) + grid locator (15 bits) + type (3 bits)
- Example:
K1JT W9XYZ EN37 (contact with grid)
- Example:
K1JT W9XYZ -15 (signal report in dB)
-
CQ calls: CQ K1JT FN20 (callsign + own grid)
-
Free text: Up to 13 ASCII characters from the FT8 alphabet
-
Telemetry: 18 hex digits
-
Signal reports: R-01 to R+30 or -01 to +30 dB
Encoding/Decoding Pipeline
- Message packing → 77-bit payload (callsign encoding, grid/signal-report encoding)
- CRC-14 → Add 14-bit CRC for error detection (91 bits total)
- LDPC(174,91) → Forward error correction encodes to 174 bits
- Symbol mapping → Convert bits to symbols (3 bits/symbol for FT8, 2 bits/symbol for FT4)
- Sync insertion → Add Costas array sync patterns
- GFSK modulation → Modulate symbols to audio using Gaussian-smoothed FSK
For decoding, reverse the pipeline:
- GFSK demodulation → Extract symbols from audio
- Sync detection → Verify Costas arrays and extract data symbols
- Symbol demapping → Convert symbols back to 174-bit codeword
- LDPC decoding → Belief propagation decoder with error correction
- CRC verification → Check integrity
- Message unpacking → Decode callsigns, grid locators, and text
Usage
Encoding
python3 scripts/ft8_encode.py output.wav --message "CQ K1JT FN20" --freq 1000 --mode ft8
Decoding
python3 scripts/ft8_decode.py input.wav --mode ft8 --freq 1000
To auto-search for signals across the audio spectrum:
python3 scripts/ft8_decode.py input.wav --mode ft8 --all
Testing
Run the comprehensive test suite:
python3 scripts/ft8_test.py
Tests cover:
- Callsign encoding/decoding roundtrips
- Grid locator and signal report encoding
- Free text encoding/decoding
- CRC-14 calculation
- LDPC encode/decode with error correction
- GFSK modulation/demodulation
- Complete FT8/FT4 WAV encode/decode roundtrips
Requirements
References