Multiband WSPR transceiver

Some interesting links on the Weak Signal Propagation Reporter (WSPR) protocol:

Short description

This project implements a standalone multiband WSPR transceiver with all the WSPR signal processing done by Red Pitaya in the following way:

With this configuration, it is enough to connect Red Pitaya to an antenna and to a network. After switching Red Pitaya on, it will automatically start operating as a WSPR receiver.

The transmitter part is disabled by default and should be enabled manually.


The FPGA configuration consists of eight identical digital down-converters (DDC). Their structure is shown on the following diagram:

WSPR receiver

The DDC output contains complex 32-bit floating-point data at 375 samples per second and is directly compatible with the WSPR decoder.

The projects/sdr_transceiver_wspr directory contains three Tcl files: block_design.tcl, rx.tcl and tx.tcl. The code in these files instantiates, configures and interconnects all the needed IP cores.


The write-c2-files.c program accumulates 42000 samples at 375 samples per second for each of the eight bands and saves the samples to eight .c2 files.

The recorded .c2 files are processed with the WSPR decoder.

The decoded data are uploaded to using curl.

The script launches write-c2-files, wsprd and curl one after another. This script is run every two minutes by the following cron entry:

1-59/2 * * * * root cd /dev/shm && /root/ >> decode-wspr.log 2>&1

The transmit-wspr-message.c program transmits WSPR messages.

Getting started

A pre-built SD card image can be downloaded from this link.

The SD card image size is 1 GB, so it should fit on any SD card starting from 2 GB.

To write the image to a SD card, the dd command-line utility can be used on GNU/Linux and Mac OS X or Win32 Disk Imager can be used on MS Windows.

The default password for the root account is changeme.

To use the full size of a SD card, the SD card partitions should be resized with the following commands:

# delete second partition
echo -e "d\n2\nw" | fdisk /dev/mmcblk0
# recreate partition
parted -s /dev/mmcblk0 mkpart primary ext4 16MB 100%
# resize partition
resize2fs /dev/mmcblk0p2

Configuring WSPR receiver

By default, the uploads to are disabled and all the decoded data are accumulated in /dev/shm/ALL_WSPR.TXT.

To enable uploads, the CALL and GRID variables should be specified in These variables should be set to the call sign of the receiving station and its 6-character Maidenhead grid locator.

The frequency correction ppm value can be adjusted by editing the corr parameter in write-c2-files.cfg.

The bands list in write-c2-files.cfg contains all the WSPR frequencies. They can be enabled or disabled by uncommenting or by commenting the corresponding lines.

Configuring WSPR transmitter

The WSPR message, transmit frequency and frequency ppm value can be adjusted by editing transmit-wspr-message.cfg.

Building from source

The installation of the development machine is described at this link.

The structure of the source code and of the development chain is described at this link.

Setting up the Vivado environment:

source /opt/Xilinx/Vivado/2016.4/

Cloning the source code repository:

git clone
cd red-pitaya-notes

Building boot.bin, devicetree.dtb and uImage:

make NAME=sdr_transceiver_wspr all

Building a bootable SD card image:

sudo sh scripts/ scripts/ red-pitaya-wspr-debian-8.6-armhf.img 1024

Feedback and results

I would like to thank PA7T and DK5HH for their interest in this project, for the tests that they have done and for the valuable feedback that they have provided.

The following plots show the number of WSPR spots per hour decoded by the multiband WSPR receiver:

WSPR spots by PA7T WSPR spots by DK5HH WSPR spots by SWLJO20