Skip to main content

FT8 Decoding and Encoding in Python with test/loopback code

Project description

PyFT8 PyPI Downloads

FT8 Decoding and Encoding in Python with CLI and research code

This repository contains Python code to decode and encode (all the way to audio) FT8, plus a minimal Command Line Interface for reception, and a nascent set of research code. Untitled presentation

Motivation

This started out as me thinking "How hard can it be, really?" after some frustration with Windows moving sound devices around and wanting to get a minimal decoder running that I can fully control.

My current aim is to push the low SNR performance whilst using only one time/frequency grid and no time-domain processing.

Code I'd like to highlight, all in 100% Python:

Uses

I use this code for my own hobby-level reseearch into FT8 decoding and Python coding techniques, and I'm also building a browser-GUI station controller (image below) which has an FT8 transceiver integrated within it. You can see that here but note that it's focussed on my station, i.e. ICOM-IC-7100 with an Arduino controlling antenna switching and magloop tuning.

station-gui

Contents

[being written]

Installation

This repository is usually a little ahead of the releases I send to PyPI, but you can pip install it from there and just use the Command Line Interface (which can also transmit individual messages) if you want to.

cmd

Install using:

pip install PyFT8

And to run, use the following (more info here)

PyFT8_cli "Keyword1, Keyword2" [-c][-v]

* where keywords identify the sound device - partial match is fine - and -c = concise, -v = verbose

Otherwise, please download or browse the code, or fork the repo and play with it! If you do fork it, please check back here as I'm constantly (as of Jan 2026) rewriting and improving.

Limitations

In pursuit of tight code, I've concentrated on core standard messages, leaving out some of the less-used features. The receive part of the code doesn't (yet) have the full capability of the advanced decoders used in WSJT-x, and so gets only about 60% of the decodes that WSJT-x gets, depending on band conditions (on a quiet band with only good signals PyFT8 will get close to 100%).

Acknowledgements

This project implements a decoder for the FT8 digital mode. FT8 was developed by Joe Taylor, K1JT, Steve Franke, K9AN, and others as part of the WSJT-X project. Protocol details are based on information publicly described by the WSJT-X authors and in related open documentation.

Some constants and tables (e.g. Costas synchronization sequence, LDPC structure, message packing scheme) are derived from the publicly available WSJT-X source code and FT8 protocol descriptions. Original WSJT-X source is © the WSJT Development Group and distributed under the GNU General Public License v3 (GPL-3.0), hence the use of GPL-3.0 in this repository.

Also thanks to Robert Morris for:

  • basicft8(*1) - the first code I properly read when I was wondering whether to start this journey
  • weakmon - much good information

(*1 note: applies to FT8 pre V2)

Other useful resources:

<script data-goatcounter="https://g1ojs-github.goatcounter.com/count" async src="//gc.zgo.at/count.js"></script>

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

pyft8-1.0.0.tar.gz (377.7 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

pyft8-1.0.0-py3-none-any.whl (35.8 kB view details)

Uploaded Python 3

File details

Details for the file pyft8-1.0.0.tar.gz.

File metadata

  • Download URL: pyft8-1.0.0.tar.gz
  • Upload date:
  • Size: 377.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.12.2

File hashes

Hashes for pyft8-1.0.0.tar.gz
Algorithm Hash digest
SHA256 8bb918b03f92ecde57879f52ed8fa7791c416415f99e5a94774d59b936ea2aa0
MD5 2a365a02eb6789a366fdfe550a66f09d
BLAKE2b-256 4f6f2b0c21f03764f6c7e2c930893523c9d5ee79461d7dbc5e9a7b9689fa6217

See more details on using hashes here.

File details

Details for the file pyft8-1.0.0-py3-none-any.whl.

File metadata

  • Download URL: pyft8-1.0.0-py3-none-any.whl
  • Upload date:
  • Size: 35.8 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.12.2

File hashes

Hashes for pyft8-1.0.0-py3-none-any.whl
Algorithm Hash digest
SHA256 7199421a9329ab494f5e92989ea0b6cfd102e7f93ce5a1c28a4c776fab985385
MD5 ed2c289efb8474cdc363a70040dfcf4e
BLAKE2b-256 41ae99efdb76e3f95498d585ef27b72820355fefe1ea382144cef5fc8a305be8

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page