Guenael / rtlsdr-ft8d

FT8 decoder of RTL devices
36 stars 12 forks source link
beacon c decoder ft8 propagation radio rtl rtl-sdr sdr

rtlsdr-ft8d -- FT8 daemon for RTL receivers

rtlsdr-wsprd

Project Status Workflow Status Last commit Commit activity

PROJECT STALLED -- Need help to test this project (automated reporting disabled for now)

TL;DR

This project aim at decoding FT8 signals using an RTL device, usually connected to a Raspberry Pi. To install and use your dongle on a Raspberry Pi with a Raspberry Pi OS, follow these steps:

echo "== Install dependencies"
sudo apt-get update && sudo apt-get -y install build-essential clang cmake libfftw3-dev libusb-1.0-0-dev libcurl4-gnutls-dev ntp git

echo "== Install rtl-sdr library (on RPi, don't use your distro package)"
git clone https://github.com/steve-m/librtlsdr
cd rtl-sdr
mkdir -p make
cd make
cmake -DCMAKE_INSTALL_PREFIX:PATH=/usr -DDETACH_KERNEL_DRIVER=ON -DINSTALL_UDEV_RULES=ON -DENABLE_ZEROCOPY=ON -Wno-dev ..
make
sudo make install
cd ../..

echo "== Install rtlsdr-ft8d"
git clone https://github.com/Guenael/rtlsdr-ft8d
cd rtlsdr-ft8d
git submodule update --init --recursive
make
sudo make install

echo "== Start/test rtlsdr-ft8d"
rtlsdr_ft8d -f 2m -c A1XYZ -l AB12cd -g 29

Overview

This non-interactive application allows automatic reporting of FT8 messages on Internet with PSKreporter. The initial idea was to allow a small computer like a Raspberry Pi and a RTL-SDR device to send FT8 reports for VHF/UHF bands. This kind of lightweight setup could run continuously without maintenance and help to get additional propagation reports. This code is just a glue between RTL libs and an FT8 open source library based on Karlis Goba (YL3JG) work.

This application written in C does:

Installation

  1. Install a Linux compatible distro on your device.

    For Raspberry Pi, you can download official images here.

  2. It's a good practice to update your OS. With Pi OS, run this command as usual:

     sudo apt-get update && sudo apt-get upgrade
  3. Install dependencies & useful tools (for example, NTP for time synchronization). Example with a Debian based OS, like Rasbian, or Raspberry Pi OS:

     sudo apt-get update && sudo apt-get -y install build-essential clang cmake libfftw3-dev libusb-1.0-0-dev libcurl4-gnutls-dev help2man ntp git
  4. Install rtl-sdr library manually. Do not use the librtlsdr-dev package on Raspberry PiOS. There is a know bug with this lib and rtlsdr_wsprd will not be able to get enough samples (don't decode anything & 100% CPU pattern).

     git clone https://github.com/steve-m/librtlsdr
     cd rtl-sdr
     mkdir -p make
     cd make
     cmake -DCMAKE_INSTALL_PREFIX:PATH=/usr -DDETACH_KERNEL_DRIVER=ON -Wno-dev ..
     make
     sudo make install
     cd ../..

    Note: You may have to re-plug you dongle if it was already connected, or play with udev if not automatically detected.

  5. Clone this repository:

     git clone https://github.com/Guenael/rtlsdr-ft8d
     cd rtlsdr-ft8d
     git submodule update --init --recursive
  6. Build the application:

     make
     sudo make install
  7. Finally, start the application with the right parameters/options for you (frequency, callsign, locator etc... Fake example below):

     rtlsdr_ft8d -f 2m -c A1XYZ -l AB12cd -g 29

Container Image

As an alternative to the above steps, a pre-built container image containing rtlsdr-ft8d is available for use with Docker or Podman.

The RTL DVB kernel modules must first be blacklisted on the host running the container. RTL-SDR itself is not required on the host running the container. This can be permanently accomplished using the following commands:

echo 'blacklist dvb_usb_rtl28xxu' | sudo tee /etc/modprobe.d/blacklist-dvb_usb_rtl28xxu.conf
sudo modprobe -r dvb_usb_rtl28xxu

If the modprobe -r command errors, a reboot is recommended to unload the module.

You can then start the container with the right parameters/options for you (frequency, callsign, locator etc... Fake example below):

docker run --rm -it --pull=always --device=/dev/bus/usb ghcr.io/guenael/rtlsdr-ft8d:latest -f 2m -c A1XYZ -l AB12cd -g 29

Tips (for your Raspberry Pi and SDR dongles)

Crystal stability

Most of RTL dongles use a cheap crystal, and frequency drift can effect the decoding & performance. The use of no-name RTL dongle for VHF/UHF bands usually require crystal modification, for a better one. External clock could be also used, like GPSDO or rubidium reference clock, aligned on 28.8MHz.

Some manufacturers integrate a 0.5ppm TCXO. It's the best second option, after an external clock. Based on my personal experience:

Performance & hardware tests

Some performance tests using:

Hardware Supported RX Load Decode burst
RPi-1 :heavy_check_mark: 24.4% 650ms
RPi-2 :heavy_check_mark: 13.9% 290ms
RPi-3 :heavy_check_mark: 9.4% 210ms
RPi-4 :heavy_check_mark: 6.3% 120ms
PC (i7-5820K) :heavy_check_mark: 1.8% 18ms