{"id":13576338,"url":"https://github.com/Guenael/rtlsdr-wsprd","last_synced_at":"2025-04-05T05:31:32.137Z","repository":{"id":44931475,"uuid":"60928691","full_name":"Guenael/rtlsdr-wsprd","owner":"Guenael","description":"WSPR daemon for RTL receivers","archived":false,"fork":false,"pushed_at":"2024-12-10T03:12:32.000Z","size":1100,"stargazers_count":116,"open_issues_count":5,"forks_count":30,"subscribers_count":17,"default_branch":"main","last_synced_at":"2024-12-10T03:20:11.063Z","etag":null,"topics":["beacon","c","decoder","propagation","radio","rtl","rtl-sdr","sdr","wspr","wsprnet"],"latest_commit_sha":null,"homepage":"","language":"C","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Guenael.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2016-06-11T21:32:14.000Z","updated_at":"2024-12-10T02:41:03.000Z","dependencies_parsed_at":"2024-12-10T03:29:24.957Z","dependency_job_id":null,"html_url":"https://github.com/Guenael/rtlsdr-wsprd","commit_stats":null,"previous_names":[],"tags_count":9,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Guenael%2Frtlsdr-wsprd","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Guenael%2Frtlsdr-wsprd/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Guenael%2Frtlsdr-wsprd/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Guenael%2Frtlsdr-wsprd/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Guenael","download_url":"https://codeload.github.com/Guenael/rtlsdr-wsprd/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247294396,"owners_count":20915333,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["beacon","c","decoder","propagation","radio","rtl","rtl-sdr","sdr","wspr","wsprnet"],"created_at":"2024-08-01T15:01:09.354Z","updated_at":"2025-04-05T05:31:27.125Z","avatar_url":"https://github.com/Guenael.png","language":"C","funding_links":[],"categories":["C"],"sub_categories":[],"readme":"# rtlsdr-wsprd -- WSPR daemon for RTL receivers\n\n![rtlsdr-wsprd](art/rtlsdr-wsprd-web.jpg)\n\n![Project Status](https://img.shields.io/badge/status-OK-green)\n![Workflow Status](https://img.shields.io/github/workflow/status/Guenael/rtlsdr-wsprd/CI)\n![Last commit](https://img.shields.io/github/last-commit/Guenael/rtlsdr-wsprd)\n![Commit activity](https://img.shields.io/github/commit-activity/m/Guenael/rtlsdr-wsprd)\n\n## TL;DR\n\nThis project aim at decoding [WSPR](https://en.wikipedia.org/wiki/WSPR_(amateur_radio_software)) signals using an [RTL device](https://osmocom.org/projects/rtl-sdr/wiki/Rtl-sdr), usually connected to a [Raspberry Pi](https://www.raspberrypi.org/).\nTo install and use your dongle on a Raspberry Pi with a Raspberry Pi OS, follow these steps:\n\n```bash\necho \"== Install dependencies\"\nsudo apt-get update \u0026\u0026 sudo apt-get -y install build-essential clang cmake libfftw3-dev libusb-1.0-0-dev libcurl4-gnutls-dev help2man ntp git\n\necho \"== Install rtl-sdr library (on RPi, don't use your distro package)\"\ngit clone https://github.com/osmocom/rtl-sdr\ncd rtl-sdr\nmkdir -p make\ncd make\ncmake -DCMAKE_INSTALL_PREFIX:PATH=/usr -DINSTALL_UDEV_RULES=ON -DENABLE_ZEROCOPY=ON -DDETACH_KERNEL_DRIVER=ON -Wno-dev ..\nmake\nsudo make install\ncd ../..\n\necho \"== Install rtlsdr-wsprd\"\ngit clone https://github.com/Guenael/rtlsdr-wsprd\ncd rtlsdr-wsprd\nmake\nsudo make install\n\necho \"== Start/test rtlsdr-wsprd\"\nrtlsdr_wsprd -f 2m -c A1XYZ -l AB12cd -g 29\n```\n\n## Overview\n\nThis non-interactive application allows automatic reporting of WSPR spots on [WSPRnet](https://wsprnet.org). The initial idea was to allow a small computer like a Raspberry Pi and a RTL-SDR device to send WSPR reports for [VHF/UHF](https://en.wikipedia.org/wiki/Amateur_radio_frequency_allocations#Very_high_frequencies_and_ultra_high_frequencies) bands. This kind of lightweight setup could run continuously without maintenance and help to get additional propagation reports. The code is massively based on Steven Franke ([K9AN](https://github.com/k9an)) implementation of Joe Taylor ([K1JT](https://en.wikipedia.org/wiki/Joseph_Hooton_Taylor_Jr.)) publication and work.\n\nThis application written in C does:\n\n- A time alignment (2 mins, required NTPd to run on the OS)\n- Start the reception using the RTL lib\n- Decimate the IQ data (2.4Msps to 375 sps)\n- Decode WSPR signals\n- Push any spots on WSPRnet\n- Repeat, again and again...\n\n## Installation\n\n  1. Install a Linux compatible distro on your device.\n\n     For Raspberry Pi, you can download official images [here](https://www.raspberrypi.com/software/operating-systems/).\n\n  2. It's a good practice to update your OS. With Pi OS, run this command as usual:\n     ```bash\n     sudo apt-get update \u0026\u0026 sudo apt-get upgrade\n     ```\n\n  3. Install dependencies \u0026 useful tools (for example, [NTP](https://en.wikipedia.org/wiki/Network_Time_Protocol) for time synchronization). Example with a Debian based OS, like Rasbian, or Raspberry Pi OS:\n     ```bash\n     sudo apt-get update \u0026\u0026 sudo apt-get -y install build-essential clang cmake libfftw3-dev libusb-1.0-0-dev libcurl4-gnutls-dev help2man ntp git\n     ```\n\n  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 \u0026 100% CPU pattern).\n     ```bash\n     git clone https://github.com/osmocom/rtl-sdr\n     cd rtl-sdr\n     mkdir -p make\n     cd make\n     cmake -DCMAKE_INSTALL_PREFIX:PATH=/usr -DDETACH_KERNEL_DRIVER=ON -Wno-dev ..\n     make\n     sudo make install\n     cd ../..\n     ```\n  Note: You may have to re-plug you dongle if it was already connected, or play with `udev` if not automatically detected. For example, you can apply `sudo udevadm control --reload-rules` to force a re-scan. If you still have some issues, check this page: [SDR udev rules](https://github.com/jopohl/urh/wiki/SDR-udev-rules).\n  \n  5. Clone this repository:\n     ```bash\n     git clone https://github.com/Guenael/rtlsdr-wsprd\n     ```\n\n  6. Build the application:\n     ```bash\n     cd rtlsdr-wsprd\n     make\n     sudo make install\n     ```\n\n  7. Finally, start the application with the right parameters/options for you (frequency, callsign, locator etc... Fake example below):\n     ```bash\n     rtlsdr_wsprd -f 2m -c A1XYZ -l AB12cd -g 29\n     ```\n\n## Container Image\n\nAs an alternative to the above steps, a pre-built container image containing rtlsdr-wsprd is available for use with [Docker](https://www.docker.com/) or [Podman](https://podman.io/).\n\nThe 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:\n\n```bash\necho 'blacklist dvb_usb_rtl28xxu' | sudo tee /etc/modprobe.d/blacklist-dvb_usb_rtl28xxu.conf\nsudo modprobe -r dvb_usb_rtl28xxu\n```\n\nIf the `modprobe -r` command errors, a reboot is recommended to unload the module.\n\nYou can then start the container with the right parameters/options for you (frequency, callsign, locator etc... Fake example below):\n\n```bash\ndocker run --rm -it --pull=always --device=/dev/bus/usb ghcr.io/guenael/rtlsdr-wsprd:latest -f 2m -c A1XYZ -l AB12cd -g 29\n```\n\n## Tips (for your Raspberry Pi and SDR dongles)\n\n  - Use ferrite bead on the USB cable to limit the QRN\n  - Use an external clean power supply\n  - Cut off the display (could help to reduce QRN)\n    ```bash\n    /opt/vc/bin/tvservice -o\n    ```\n  - Remove unused modules (for example, /etc/modules: #snd-bcm2835)\n  - Use an enclosure, and ground it\n\n## Crystal stability\n\nMost of RTL dongles use a cheap crystal, and frequency drift can effect the decoding \u0026 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.\n\nSome manufacturers integrate a 0.5ppm TCXO. It's the best second option, after an external clock. Based on my personal experience:\n\n- NooElec NESDR SMART : Works fine out of the box\n- RTL-SDR Blog 1PPM TCXO : Works with some drift, require additional mass, or a better enclosure\n- Other no-name like : RT820, E4000, FC0012, FC0013, can work, but require modification and usually drift a lot\n\n## Performance \u0026 hardware tests\n\nSome performance tests using:\n- Raspbian GNU/Linux 11 (bullseye) for Raspberry Pi devices\n- rtlsdr-wsprd version 0.4.2\n- Build with `clang -O3 -std=gnu17`\n\n| Hardware      | Supported          | RX Load | Decode burst |\n| ------------- | ------------------ | ------- | ------------ |\n| RPi-1         | :heavy_check_mark: | 23.2%   | 8.4s         |\n| RPi-2         | :heavy_check_mark: | 13.5%   | 4.1s         |\n| RPi-3         | :heavy_check_mark: | 10.9%   | 2.1s         |\n| RPi-4         | :heavy_check_mark: |  5.8%   | 1.1s         |\n| PC (i7-5820K) | :heavy_check_mark: |  1.7%   | 0.5s         |\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FGuenael%2Frtlsdr-wsprd","html_url":"https://awesome.ecosyste.ms/projects/github.com%2FGuenael%2Frtlsdr-wsprd","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FGuenael%2Frtlsdr-wsprd/lists"}