ChannelSPURIOUS EMISSIONS

Sheet 4 · The written guides

WSPR
and FT8

At the end you have a computer that decodes WSPR, FT8 and FT4 from shortwave and writes one line for each message. You can count those lines to see which bands are open. You never transmit.

Rev A · checked 2026-10-10

Download the Markdown

The Markdown file is the whole guide in plain text. You can give it to a coding agent.

Some links are affiliate links: if you buy through them, I may earn a commission at no extra cost to you. As an Amazon Associate I earn from qualifying purchases. How links work.

Contents

1. What this guide builds

A receiver, a computer with an exact clock, and a decoder program. The decoder writes one line for each message that it hears from an amateur station. This guide is receive only: nothing in it transmits.

There are two paths. Choose one.

  • Path A: one band at a time. One shortwave receiver in upper sideband, and the program WSJT-X. Most amateurs start here. It works with the radio you own.
  • Path B: every band at once. A wideband receiver with the program ka9q-radio, and the decoders wsprd and decode_ft8. This is what I use (marked ◆).
Signal Frequency Antenna Radio Decoder Computer
FT8 One dial frequency on each band, 1.8 to 28 MHz (section 4) Any shortwave antenna A: one receiver, upper sideband. B: ◆ RX-888 Mk II A: WSJT-X. B: ◆ decode_ft8 A: Windows, macOS or Linux. B: ◆ x86 PC with Ubuntu
FT4 One dial frequency on each band, 3.5 to 28 MHz The same The same A: WSJT-X. B: ◆ decode_ft8 The same
WSPR One dial frequency on each band, 0.136 to 28 MHz The same The same A: WSJT-X. B: ◆ wsprd The same
 Path A   antenna -- receiver (USB mode) -- audio -- computer: WSJT-X
                     one band at a time               exact clock
                                                      (optional) reports to
                                                      PSK Reporter, WSPRnet

 Path B   loop -- injector -- 30 MHz filter -- limiter -- RX-888 Mk II -- hf (x86 PC)
                                                                           |
          radiod (ka9q-radio) cuts one channel for each band               |
            FT8 channels  -- ft8-record  -- decode_ft8 -- /var/log/ft8.log
            FT4 channels  -- ft4-record  -- decode_ft8 -- /var/log/ft4.log
            WSPR channels -- wspr-decoded -- wsprd ------- /var/log/wspr.log
                                                     (optional) reports

What path A gives up: it hears one band and one mode at a time. You choose the band by hand, so you see one row of the band chart, not all of it. What path B costs: a second computer, a wideband receiver, a required filter, and an evening at a Linux command line.

In this guide, a decode is one message that the decoder read one time. One station gives many decodes in a day.

2. What you need

Prices are US dollars unless the cell says otherwise, as listed by the named seller on 2026-10-07. They change. A part marked ◆ is what I use. A blank box is for your pencil.

Path A, the lowest-cost path

If you own a shortwave transceiver or receiver with upper sideband, you may need to buy nothing.

☐ Part Job Connector Price
☐ A shortwave receiver or transceiver with upper sideband (USB) mode Receives one band Yours You own it
☐ The antenna you use on shortwave now Receives Yours You own it
☐ An audio path from the receiver to the computer: the receiver’s own USB sound device, or a cable from its line or headphone output to the computer’s line input Carries the receiver’s sound to WSJT-X USB, or 3.5 mm See seller
☐ A computer with Windows 10 or later, macOS 13 or later, or Linux. WSJT-X asks for a 1.5 GHz processor, 200 MB of free memory, and a 1024 x 780 screen Runs WSJT-X You own it
☐ An internet connection Sets the clock (section 5)

If you own no shortwave receiver, a software-defined radio (SDR) can take its place. An SDR is a USB receiver that needs a program on the computer to tune it. I did not run WSJT-X with an SDR. Section 6 says what that needs, and section 15 lists it as not run.

☐ Part Job Price Note
☐ RTL-SDR Blog V4L A low-cost SDR $37.95, rtl-sdr.com I use one on VHF. I did not try it on shortwave
☐ Airspy HF+ Discovery An SDR made for shortwave, 768 kHz wide See listing I do not own one

Path B, what I use

Path B needs the wideband receiver from the guide Shortwave receiver. That guide has the receiver, the filter, the limiter and the computer in full. This table repeats the list, so you can see the cost.

☐ Part Job Connector Price Note
☐ ◆ RX-888 Mk II, 16-bit, 10 kHz to 64 MHz direct Hears all of shortwave at once SMA, USB 3 $152.79, OpenSourceSDRLab, 2026-10-11 Copies exist. Mine is from OpenSourceSDRLab
☐ ◆ MLA-30+ active loop with its power injector Antenna SMA See listing, Amazon Any shortwave antenna works
☐ ◆ Turn Island Systems F3060 low-pass filter Stops signals above 30 MHz SMA $80, Turn Island Systems Required at 64.8 MS/s
☐ ◆ TAPR RF Limiter Protects the receiver input SMA $20, TAPR Needed if you also transmit nearby
☐ ◆ x86-64 desktop PC, 4 cores of Intel Haswell class (2013) or newer, 8 GB, a USB 3.0 socket on the main board Runs the receiver and the decoders Used market Mine: HP EliteDesk 800 G1 SFF, Core i5-4570, 12 GB
☐ SATA solid-state drive, 120 GB or more Storage See seller The FT8 recorder writes files all day
☐ RG-6 quad-shield coax, and two F to SMA adapters Loop to receiver F, SMA See seller

My Core i5-4570 was 29 % busy with the receiver and every decoder of my station, HFDL included. It dropped no data in a 19-hour test.

3. Before you start

Skills. Path A: install a program and set its options. Path B: type commands at a Linux command line, and edit a text file with sudoedit.

Time. These are my estimates. Path A: about one hour to the first decode, if the receiver and the audio path work. Path B: one evening after the receiver from the other guide runs.

Accounts. None to receive. Reporting is optional (section 9). PSK Reporter needs no account. I could not confirm what WSPRnet needs.

Values to choose first. Write these down. The steps use them as placeholders.

Placeholder Meaning Example form
<CALL> Your callsign, or a name for a receive-only station (section 9) Your own
<LOCATOR> Your Maidenhead locator. 4 characters is a square of 2 degrees by 1 degree. 6 characters is a few kilometers 4 or 6 characters
<ANTENNA> A short text that describes your antenna small loop

Caution. <CALL>, <LOCATOR> and <ANTENNA> become public if you turn reporting on. The networks show them on a world map and keep them. Read section 9 before you enter a 6-character locator in any program.

The law, in short. I am not a lawyer. This is what I read, for the United States. To receive needs no licence. US law (47 U.S.C. section 605) restricts what you pass on from messages not meant for the public, and it makes an exception for amateur radio. Other countries differ. This guide never transmits. To transmit on these frequencies, you need an amateur licence.

4. The frequencies

Every mode has one agreed frequency on each band. You set the receiver to that dial frequency in upper sideband (USB). The signals then appear as tones in the receiver’s sound, between about 200 Hz and 3000 Hz.

These are the default working frequencies of WSJT-X 3.0.2, in MHz. I read them from its source file models/FrequencyList.cpp on 2026-10-10. Conventions change with time: the list in your copy of WSJT-X is the one to use.

Band FT8 FT4 WSPR
2200 m 0.1360
630 m 0.4742
160 m 1.840 1.8366
80 m 3.573 3.575 3.5686
60 m 5.357 5.357 none in the list1
40 m 7.074 7.0475 7.0386
30 m 10.136 10.140 10.1387
20 m 14.074 14.080 14.0956
17 m 18.100 18.104 18.1046
15 m 21.074 21.140 21.0946
12 m 24.915 24.919 24.9246
10 m 28.074 28.180 28.1246

Notes on the table:

  • A second FT8 frequency. The list has a second FT8 frequency on most bands, labelled for expeditions: 3.567, 7.056, 10.131, 14.090, 18.095, 21.091, 24.911 and 28.091 MHz.
  • Region 3. The list gives 3.568 MHz for FT4 on 80 m in IARU Region 3 (southern Asia and the Pacific).
  • WSPR is very narrow. All WSPR signals of one band sit in a slice 200 Hz wide. The center of the slice is 1500 Hz above the dial frequency.
  • Start with 20 m by day and 40 m at night. That is my advice, not a rule. On my station those two bands had the most decodes.

How wide and how long each signal is, from the WSJT-X manual:

Mode Message Time on the air Slot Width Decodes down to (in 2500 Hz)
FT8 77 bits 12.6 s 15 s 50 Hz -21 dB
FT4 77 bits 5.04 s 7.5 s 83.3 Hz -17.5 dB
WSPR 50 bits 110.6 s 2 minutes 5.9 Hz -31 dB

5. The clock

Every station starts to send at the same moment. FT8 starts every 15 seconds. FT4 starts every 7.5 seconds. WSPR starts at an even minute. The decoder looks for a signal only near those moments. If your clock is wrong by more than about one second, the decoder finds nothing, although the signals are there.

The WSJT-X manual asks for a clock within 1 second of UTC. It also asks for a clock that never jumps. A good time program corrects the clock by a change of its speed, not by a step.

Set the clock on Linux

  1. Install the clock service chrony.

    sudo apt install -y chrony
    
  2. Wait one minute. Then read the clock error.

    chronyc tracking
    

    Result: a line System time : 0.000... seconds slow of NTP time (or fast). The number must be far below 1 second. The line Leap status : Normal shows that the clock follows a time server.

Set the clock on Windows

The WSJT-X manual says that the time service built into Windows may not be adequate. It recommends the program Meinberg NTP Client. Its section “Installation, Windows” has the link and the steps. I did not run them.

Set the clock on macOS

The WSJT-X manual says: use System Preferences to select an external time source. On current macOS, find the date and time settings and turn the automatic setting on. I did not test how exact that is.

With no internet

A GPS receiver can set the clock. This guide does not cover that.

6. Path A: one band with WSJT-X

Program: WSJT-X, free and open source (GPL version 3). Its authors made FT8, FT4 and WSPR. The latest release on 2026-10-10 is 3.0.2.

Caution. WSJT-X is made for transceivers and it can key one. Do not click Enable Tx or Tune. Do not connect the computer’s audio output to the radio. If your radio is a transceiver, turn its VOX off.

Connect the receiver

  1. Connect the antenna to the receiver.

  2. Connect the audio path from the receiver to the computer.

  3. Set the receiver to upper sideband (USB or USB Data).

  4. Set the widest filter that the receiver has in that mode, up to about 5 kHz.

  5. Turn the receiver’s automatic gain control (AGC) off, or reduce its RF gain. The manual says this is usually best.

  6. Tune the receiver to 14.074 MHz by day, or to 7.074 MHz at night.

    Result: you hear a mix of soft tones that all start and stop together, every 15 seconds.

Install WSJT-X

  1. Open the WSJT-X downloads page. The installers are on GitHub: the page says that is the only official source.

  2. Download the file for your system: ...-win64.exe for Windows, ...-arm64-macOS.pkg or ...-x86_64-macOS.pkg for a Mac, ...-linux-x86_64.deb or ...-linux-aarch64.deb for Debian and Ubuntu.

  3. Install it. On Debian or Ubuntu:

    sudo dpkg -i <package-name>
    

    On Windows, the manual says to install into a folder of its own, such as C:\WSJTX, not into C:\Program Files. For any 64-bit Linux there is also an AppImage file that needs no installation.

  4. Set the clock (section 5).

Set the options

  1. Start WSJT-X. In the File menu, select Settings. On a Mac, select Preferences in the WSJT-X menu.
  2. On the General tab, enter <CALL> and <LOCATOR> under Station Details. Select your IARU Region: 1 is Europe, Africa, the Middle East and northern Asia. 2 is the Americas. 3 is southern Asia and the Pacific.
  3. On the Radio tab, set Rig to None. WSJT-X then does not control the radio: you tune it by hand.
  4. On the Audio tab, select the Input device that carries the receiver’s sound. The device must sample at 48000 Hz, 16 bits. Leave Output on a device that is not connected to the radio.
  5. On the Reporting tab, leave Enable PSK Reporter Spotting off for now.
  6. Click OK.

Receive FT8

  1. In the Mode menu, select FT8.

  2. Select the band in the band control, so that the frequency in WSJT-X agrees with the receiver’s dial.

  3. Click Monitor if it is not green.

    Result: the status bar shows Receiving, and the waterfall (the Wide Graph window) scrolls.

  4. Set the level. Use the receiver’s gain control or the computer’s input level. With no signals, the scale at the lower left of the main window must read about 30 dB.

  5. Wait for the end of the next 15-second slot.

    Result: lines appear in the left window, Band Activity. Each line is one decode. Section 8 says how to read a line.

Receive FT4 and WSPR

  1. For FT4: select FT4 in the Mode menu. Tune the receiver to the FT4 frequency of the band (section 4). The slots are 7.5 seconds long.

  2. For WSPR: select WSPR in the Mode menu. Tune the receiver to the WSPR frequency of the band, for example 10.1387 or 14.0956 MHz.

  3. Click Monitor. One WSPR receiving period is 2 minutes.

  4. Leave Enable Tx off. If the window shows the control Tx Pct, set it to 0.

    Result: at the end of each 2-minute period, WSJT-X lists the beacons that it decoded.

With an SDR in place of a receiver

I did not run this. The principle: an SDR program tunes the SDR to the dial frequency in upper sideband and makes sound. A “virtual audio cable” program carries that sound to the audio input of WSJT-X. Every other step in this section stays the same. You must find an SDR program and a virtual audio cable for your system. I name none, because I tested none.

7. Path B: every band with ka9q-radio

Receiver program: ka9q-radio. Its radiod service reads all of shortwave from the RX-888 Mk II. It gives each decoder its own channel on each band, over the computer’s internal network. Nothing here needs a screen.

First build the receiver. Follow the guide Shortwave receiver until systemctl is-active radiod@hf prints active. The same steps are in sections 4 and 11 of Build the station. The steps below start from there. They use the computer name hf and the settings file /etc/radio/radiod@hf.conf from those guides.

I ran these steps on Ubuntu Server 24.04 with ka9q-radio at commit b5bbb9aa (2026-09-25). The project changes every week. Where its files of 2026-10-10 differ from mine, the step says so.

The clock

  1. Install chrony and read the clock error, as in section 5.

FT8 and FT4

Decoder: decode_ft8 from ka9q/ft8_lib, free and open source (MIT licence). The method is in the project’s docs/ft8.md. Two recorders write one short sound file for each band and each slot. The decoder reads each file, writes its decodes to a log, and deletes the file.

  1. Build the decoder.

    cd ~ && git clone https://github.com/ka9q/ft8_lib.git && cd ft8_lib
    make && sudo make install
    ls /usr/local/bin/decode_ft8
    

    Result: the last command prints /usr/local/bin/decode_ft8.

  2. Give radiod the channels. In /etc/radio/radiod@hf.conf, add the line disable = yes to the section [FT8]. Then add the project’s two channel files at the end.

    cd ~/ka9q-radio/config/examples/fragments
    cat ft8.conf ft4.conf | sudo tee -a /etc/radio/radiod@hf.conf >/dev/null
    
  3. Delete every frequency above 30 MHz from the lines you added. In the files of 2026-10-10 these are 50m310 in the section [ft8-30-12-6m] and 50m318000 in the section [FT4]. Keep the quote marks around the frequencies that stay.

    The receiver cannot hear those frequencies at 64.8 MS/s. It would report false stations.

  4. Check that the two settings files of the recorders exist. make install does not write to /etc/radio/.

    cat /etc/radio/ft8-decode.conf /etc/radio/ft4-decode.conf
    

    Result: two lines for each mode. If a file is missing, create it with sudoedit and these lines (for FT4, write ft4 in both lines).

    MCAST=ft8.local
    DIRECTORY=/var/lib/ka9q-radio/ft8
    
  5. Start the recorders and the decoders.

    sudo systemctl restart radiod@hf
    sudo systemctl enable --now ft8-record ft4-record ft8-decode@1 ft4-decode@1
    tail -f /var/log/ft8.log
    

    Result: new lines every 15 seconds on an open band. Press Ctrl+C to stop the display.

The channels are wider than a voice channel. On 20 m, for example, the FT8 channel covers 14.0711 to 14.102 MHz, so it also takes in the expedition frequency. One ft8-decode@1 is enough for every band, by the project’s document.

WSPR

Decoder: wsprd, part of WSJT-X, free and open source (GPL version 3). The wspr-decoded service of ka9q-radio records two minutes on each band and runs wsprd on each recording.

  1. Install the decoder.

    sudo apt install -y wsjtx
    ls /usr/bin/wsprd
    

    Result: the last command prints /usr/bin/wsprd. This installs all of WSJT-X from Ubuntu’s package source. You use only wsprd.

  2. Find the section [WSPR] in /etc/radio/radiod@hf.conf. If its freq line holds a frequency above 30 MHz, delete that frequency.

  3. Make the two names agree. Read the data = line in the section [WSPR]. Read the MCAST= line in /etc/radio/wspr-decode.conf.

    grep -A12 '^\[WSPR\]' /etc/radio/radiod@hf.conf | grep 'data'
    cat /etc/radio/wspr-decode.conf
    

    Result: the same name in both, for example wspr.local. If they differ, put the name from the data = line after MCAST=. Then run sudo systemctl restart radiod@hf.

  4. Start it.

    sudo systemctl enable --now wspr-decoded
    grep -v DecodeFinished /var/log/wspr.log | tail
    

    Result: at the end of the next full 2-minute period, lines with a time, a level in dB, a frequency and a callsign. Expect about 10 stations an hour at night on an indoor loop, and far more outdoors.

The project’s WSPR section has 15 channels: the 11 WSPR frequencies of section 4, and also 3.5926, 5.2872, 5.3647 and 13.5539 MHz.2

8. Read a decode line

In every example below, a grey block stands for a callsign or a locator. I never print the callsign or the locator of a station that I heard.

WSJT-X, FT8 and FT4

 UTC    dB   DT  Freq    Message
183015  -12  0.3 1436 ~  CQ ▒▒▒▒▒▒ ▒▒▒▒
183015   -3  0.1  872 ~  ▒▒▒▒▒▒ ▒▒▒▒▒▒ ▒▒▒▒
183030  -19 -0.2 2210 ~  ▒▒▒▒▒▒ ▒▒▒▒▒▒ -15
183045   -8  0.2 2210 ~  ▒▒▒▒▒▒ ▒▒▒▒▒▒ RR73
Field Meaning
UTC The start of the slot
dB Signal-to-noise ratio, measured against the noise in a 2500 Hz channel. A negative number is a signal weaker than that noise
DT Time offset in seconds: how far the signal’s start is from your clock’s slot
Freq The tone’s frequency in the sound, in Hz. Add it to the dial frequency to get the radio frequency
~ The mode mark: ~ is FT8, + is FT4
Message See below

A standard message has one of four forms. The four lines above show them in this order:

  1. CQ, a callsign and a locator: a station calls any station. The locator has 4 characters.
  2. Two callsigns and a locator: the second station answers the first.
  3. Two callsigns and a report such as -15 or R-15: the signal-to-noise ratio that one station measured for the other.
  4. Two callsigns and RRR, RR73 or 73: the end of the contact.

The first callsign is the station that is called. The second is the station that sends. RR73 is not a locator, although it has the shape of one. A ? at the end of a line means a decode with lower confidence.

WSJT-X and wsprd, WSPR

This is one line of /var/log/wspr.log on my station. WSJT-X shows the same fields in its window.

1830 -24  0.2  14.097059  0  ▒▒▒▒▒▒ ▒▒▒▒ 37
Field Meaning
1830 UTC time of the start of the two minutes
-24 Signal-to-noise ratio in dB, in a 2500 Hz channel. Here the signal is about 250 times weaker than that noise
0.2 DT, the time offset in seconds
14.097059 The signal’s frequency in MHz
0 Drift: how far the frequency moved during the message, in Hz
▒▒▒▒▒▒ ▒▒▒▒ The beacon’s callsign and its 4-character locator
37 The power that the beacon states, in dBm. 37 dBm is 5 watts. This value is an example

decode_ft8, FT8 and FT4 (path B)

2026/10/06 18:30:15  23 +0.42 14,075,436.0 ~ CQ ▒▒▒▒▒▒ ▒▒▒▒
Field Meaning
2026/10/06 18:30:15 UTC date and time of the slot
23 A score from the decoder. It is not a signal-to-noise ratio
+0.42 The time offset in seconds
14,075,436.0 The signal’s radio frequency in Hz
~ and the rest The message, as above

Use DT to check your clock

Look at the DT column of 20 lines. With an exact clock, the values scatter around zero. If most lines show the same large offset, for example near +1.5, your clock is wrong by that amount. This is my reading of the column. The manual calls DT a diagnostic value and gives no limit.

9. Report what you hear (optional)

Two public networks collect reports from receiving stations and draw them on a world map. PSK Reporter takes FT8, FT4 and other modes. WSPRnet takes WSPR. A sender anywhere can then see that your station heard it.

Your callsign and your locator become public. Each report carries <CALL>, <LOCATOR> and <ANTENNA>. The map shows your station at that locator to everyone. A 6-character locator places you within a few kilometers. PSK Reporter says that it keeps the records as an archive, and that licensing authorities use them. If that is not acceptable, do not turn reporting on. Reception works the same without it.

Choose the name you report under

  • With a licence: your callsign. I report with my callsign and a number after a dash. That keeps the receiver apart from my transmitting station.
  • With no licence: PSK Reporter says that you do not need one. It asks you to pick a name with your country prefix on it. Its example has the form <PREFIX>/SWL/<PLACE>. Choose a place name as wide as your region, not your town.
  • The antenna text is public too. Write the antenna type, and nothing about where it is.

Path A: WSJT-X to PSK Reporter

  1. In Settings, on the General tab, check <CALL> and <LOCATOR>. PSK Reporter asks for a locator of at least 6 characters.

  2. On the Frequencies tab, enter <ANTENNA> for each band in the Station Information table.

  3. On the Reporting tab, select Enable PSK Reporter Spotting.

  4. Click OK. Leave Monitor on.

  5. After 10 minutes, open https://pskreporter.info, follow its link to the map, and search for <CALL>.

    Result: your station is on the map, with lines to the stations you heard.

WSJT-X reports only standard messages that hold the sender’s callsign and its locator. Most of those are CQ messages. So the map shows fewer stations than your Band Activity window.

Path A: WSJT-X to WSPRnet

In WSPR mode the main window has a box Upload spots. Its help text says: “Upload decoded messages to WSPRnet.org”. The manual says that WSJT-X can upload WSPR reports to WSPRnet automatically. I did not run this, and I could not confirm if WSPRnet needs an account for it.

Path B: the logs to PSK Reporter

Uploader: ftlib-pskreporter. It is a service that reads the decoder’s log and sends the reports. Its author runs PSK Reporter and wrote it for ka9q-radio.

  1. Install the uploader.

    cd ~ && git clone https://github.com/pjsg/ftlib-pskreporter.git && cd ftlib-pskreporter
    sudo apt install -y python3-docopt
    sudo install -m 755 pskreporter-sender /usr/local/bin/
    sudo install -m 644 pskreporter.py /usr/local/lib/python3.12/dist-packages/
    sudo cp pskreporter@.service /etc/systemd/system/
    sudo cp ft8-pskreporter.conf ft4-pskreporter.conf /etc/radio/
    
  2. Enter your values in both files. The files come with the author’s example values: replace all three.

    sudoedit /etc/radio/ft8-pskreporter.conf /etc/radio/ft4-pskreporter.conf
    
    FILE=/var/log/ft8.log
    MODE=ft8
    CALLSIGN=<CALL>
    LOCATOR=<LOCATOR>
    ANTENNA="<ANTENNA>"
    

    The locator needs at least 6 characters here.

  3. Start the two services.

    sudo systemctl daemon-reload && sudo systemctl enable --now pskreporter@ft8 pskreporter@ft4
    sudo ss -tnp | grep 4739
    

    Result: a line with an open connection. That means the service uploads.

Facts to know:

  • The uploader reports a station only from a CQ message, or from a message with two callsigns and a locator.
  • The reports of FT8 and FT4 carry no signal strength. The decoder’s number is a score, not a measurement.
  • The uploader has an option --no-send, which prints the reports and sends nothing. I did not use it.

Path B: WSPR reports

There are three ways, and I ran none of the public ones.

Way Goes to State
ftlib-pskreporter with its file wspr-pskreporter.conf and the service pskreporter@wspr PSK Reporter Its README lists WSPR. I did not test it
wsprdaemon WSPRnet The usual public program. It installs and manages its own copy of ka9q-radio, so do not add it to this build without a plan
A small program of my own WSPRnet Not public

10. Read band openings from the counts

Each decode proves that one path was open on one band at one moment. So a count of decodes for each band and each hour is a picture of the bands. You need no map for it.

Path A

WSJT-X shows the number of decodes of the last slot in its status bar. Write that number down for the same band at several hours of a day. To compare bands, change the band every few minutes and write each number down. With reporting on, the PSK Reporter map shows the stations that <CALL> heard.

Path B

The log has every band at once. This command counts today’s FT8 decodes for each UTC hour and each band. I wrote it for this guide and tested it on example lines only.

grep "^$(date -u +%Y/%m/%d)" /var/log/ft8.log \
  | awk '{split($2,t,":"); f=$5; gsub(",","",f); printf "%s UTC %2d MHz\n", t[1], f/1e6}' \
  | sort | uniq -c

Result: one line for each hour and band, with the count in front, for example 1250 18 UTC 14 MHz. The band appears as its frequency in whole MHz: 14 is 20 m.

What the counts show

On my station, one day in October with the loop indoors gave these numbers (rounded):

What Count in one day
FT8 decodes 76,500
FT4 decodes 4,200
WSPR decodes 4,300
Different stations About 3,100
Bands with decodes 10, from 160 m to 10 m

How to read your own counts:

  • High bands by day, low bands at night. On that day, 20 m to 10 m had decodes from about 7 am to 9 pm local time only. 160 m and 80 m had decodes from about 6 pm to 8 am only.
  • The logs are in UTC. Convert to local time before you compare with sunrise and sunset.
  • A count is not a number of stations. One station that calls CQ for an hour gives hundreds of decodes.
  • Compare a band with itself. A busy band such as 20 m always has more decodes than 160 m. Look at each band’s own busiest hour and its own empty hours.
  • Zero has two meanings. The band is closed, or nobody sends. WSPR beacons run all day, so WSPR answers that question better than FT8.
  • It changes. Shortwave changes with the sun, the season and the time of day. Keep one normal day as your baseline, and compare with it.

11. Run it unattended

Path A

  1. Turn the computer’s sleep mode off. A sleeping computer decodes nothing.
  2. Leave WSJT-X open with Monitor green.
  3. To hop between bands in WSPR mode, WSJT-X needs a radio that it controls. That is outside this guide.

Path B

The command systemctl enable --now in section 7 already makes every service start with the computer. Two more things:

  1. In the PC’s firmware settings, set it to start again after a power cut.

  2. Check the services after each restart of the computer.

    systemctl status ft8-record 'ft8-decode@*' wspr-decoded
    

    Result: each service shows active (running).

If the decoders stop while the recorders run, sound files collect in /var/lib/ka9q-radio/ft8. The decoders work through them after a restart. To restart only the services that already run:

sudo systemctl try-restart ft8-record 'ft8-decode@*'

12. Check that it works

  1. The clock. Run chronyc tracking (Linux). Pass: System time far below 1 second. Wait: one minute after the service starts.
  2. The sound (path A). The waterfall shows short vertical streaks about 50 Hz wide that start and stop together. Pass: streaks in several places from 200 to 3000 Hz. Wait: 30 seconds.
  3. The first FT8 decode. Pass: one or more lines after a slot ends, on 14.074 MHz by day or 7.074 MHz at night. Wait: up to 5 minutes on an open band.
  4. DT. Pass: the DT values of 20 lines scatter around zero (section 8).
  5. WSPR. Pass: one or more lines with a callsign and a locator. Wait: up to 30 minutes. A beacon does not send in every slot.
  6. Every band (path B). Run tail /var/log/ft8.log /var/log/wspr.log. Pass: new FT8 lines every 15 seconds on an open band, and new WSPR lines every 2 minutes.
  7. Reports (optional). Pass: your station on the PSK Reporter map. Wait: 10 minutes or more.

Then write down the number of decodes in one normal day. That number is your baseline. Change one thing at a time, and compare with it.

13. If it does not work

Symptom Likely cause What to do
The waterfall shows signals, and nothing decodes The clock is wrong by more than about 1 second Section 5. Then look at DT
Every line has the same large DT The clock is wrong by that amount Section 5
No decodes, and the waterfall is empty or one flat color No sound reaches the program, or the level is far too low or too high Select the right Input device. Set the noise level to about 30 dB
Signals on the waterfall, cut off above about 2.7 kHz The receiver’s filter is a standard SSB filter Normal. Use a wider filter if the receiver has one
No decodes, and the receiver is in LSB, AM or CW Wrong mode Set upper sideband (USB)
Decodes on FT8, none on WSPR The receiver is not on the WSPR dial frequency, or its dial may be off frequency Section 4. All WSPR signals sit in a slice 200 Hz wide
A band is empty at noon, or at midnight The band is closed at that hour Normal. Try 20 m by day and 40 m at night
Path B: /var/log/wspr.log stays empty The name after data = and the name after MCAST= differ Step 3 of “WSPR” in section 7
Path B: /var/log/ft8.log stays empty, and the recorders run The file /etc/radio/ft8-decode.conf is missing, or radiod was not restarted Steps 4 and 5 of “FT8 and FT4” in section 7
Path B: stations on 6 m or 2 m in the log A frequency above 30 MHz is still in the channel list. Those decodes are false Step 3 of “FT8 and FT4” in section 7
Path B: shortwave is full of signals that should not be there No 30 MHz low-pass filter, so signals above 32.4 MHz fold back Fit the filter: see the receiver guide
Path B: the uploader runs, and the map shows nothing The locator has fewer than 6 characters, or the example values are still in the file Edit the ...-pskreporter.conf files. Restart the two services
The map shows fewer stations than your log Only messages with a callsign and a locator make a report Normal
Few decodes, and many signals on the waterfall The receiver overloads, or electrical noise from the house covers the weak signals Reduce the gain. Move the antenna away from the house’s electronics

14. What I did wrong

  • My loop is still indoors. It sits near the computer, which is the worst place for it. It still heard about 3,100 stations in one day, and about 180 of them more than 5,000 miles away. Outdoors it will hear more. Do not wait for a good antenna to start.
  • Two names did not agree. After the install, the WSPR channel name in the receiver’s settings and the name in the decoder’s settings differed. Nothing was decoded, and no error appeared. Check both names first.
  • I left frequencies above 30 MHz in the list. The receiver cannot hear them at my sample rate. The decoder reported stations there anyway. They were false.
  • I read the FT8 number as a signal strength. The number that decode_ft8 prints is a score. Only wsprd and WSJT-X give a signal-to-noise ratio.
  • I counted decodes as stations. One station gives many decodes. Count different callsigns if you want stations, and keep that list private.

15. Not run and not confirmed

  • All of path A. My station does not run WSJT-X as a receiving program. Every step in section 6 and the WSJT-X steps in section 9 come from the WSJT-X manual and its source code, read on 2026-10-10.
  • The manual I read is ahead of the release. The online manual describes version 3.2. The latest release is 3.0.2. A label or a tab may differ in your copy.
  • WSJT-X with an SDR and a virtual audio cable. Not run. I name no programs for it.
  • The RTL-SDR Blog V4L and the Airspy HF+ Discovery on shortwave. Not run. The price of the Airspy HF+ Discovery: not checked.
  • That WSJT-X accepts a receive-only name in place of a callsign. PSK Reporter describes such names. I did not test one in WSJT-X.
  • That PSK Reporter accepts a 4-character locator. It asks for 6 or more.
  • Tx Pct at 0. I recall that 0 means “never transmit”. The manual does not say so. Keep Enable Tx off in any case.
  • The exact columns of the WSJT-X windows. The examples in section 8 follow the manual’s list of fields. The spacing and the time format may differ.
  • The DT rule in section 8. It is my reading. The manual gives no limit for DT.
  • Every waiting time in sections 6, 9 and 12, and the audio range of 200 to 3000 Hz. They are my estimates.
  • The name and place of the macOS time setting, and of the map link on the PSK Reporter page. I did not open either on a screen.
  • WSPRnet. Its rule for a listener with no callsign, and if an upload needs an account. Its site refused my reader on 2026-10-10. I saw only its map page.
  • The Meinberg NTP steps on Windows, and the accuracy of the macOS time setting. Not run.
  • How my own hf computer keeps its time. I did not check this for the guide. The chrony commands come from its documentation.
  • The newest ka9q-radio. I built commit b5bbb9aa. The newest commit on 2026-10-10 is 71832bef. The project also offers ready-made packages. I did not use them.
  • Step 4 of “FT8 and FT4” in section 7. The project’s document says that make install does not write to /etc/radio/. I did not check on a new computer if the two files are there after the install.
  • The WSPR path to PSK Reporter, --no-send, and wsprdaemon. Not run.
  • The count command in section 10. Tested on example lines, not on my station’s log.
  • Log rotation. The ka9q-radio source has rotation files for the three logs. I did not confirm that the install puts them in place.
  • The price of the RX-888 Mk II. I found no seller page I could read. Read https://www.rx-888.com before you buy.
  • No step in this guide was run on a new, empty computer as written. The path B settings are the ones on my station, checked against each project’s documents.

16. Sources

All were read on 2026-10-10, except where a date is given.

The modes and WSJT-X. Home page: https://wsjtx.github.io/wsjtx/index.html · Downloads: https://wsjtx.github.io/wsjtx/downloads.html · User Guide: https://wsjtx.github.io/wsjtx/guide-full.html (sections System Requirements, Installation, Settings, Transceiver Setup, WSPR Mode, On-Screen Controls, Decoded Lines, Protocol Specifications) · Source: https://github.com/WSJTX/wsjtx (models/FrequencyList.cpp at tag v3.0.2, widgets/mainwindow.ui) · The older User Guide for version 2.7.0: https://wsjt.sourceforge.io/wsjtx-doc/wsjtx-main-2.7.0.html · The paper by the authors of the modes, not read again for this guide: https://wsjt.sourceforge.io/FT4_FT8_QEX.pdf

Path B. https://github.com/ka9q/ka9q-radio (read docs/ft8.md, docs/INSTALL.md, config/examples/fragments/ft8.conf, ft4.conf and wspr.conf, config/ft8-decode.conf, config/ft4-decode.conf, config/wspr-decode.conf, service/wspr-decoded.service.in) · https://github.com/ka9q/ft8_lib (README and decode_ft8.c) · https://github.com/pjsg/ftlib-pskreporter (README, pskreporter-sender, pskreporter@.service, the .conf files) · https://github.com/rrobinett/wsprdaemon

The clock. chrony, the chronyc manual: https://chrony-project.org/doc/4.5/chronyc.html

Reporting. PSK Reporter: https://pskreporter.info and https://pskreporter.info/pskdev.html · WSPRnet: https://www.wsprnet.org (map page only)

My station. The commands of path B are those of Build the station, sections 11, 13 and 14, checked against my station on 2026-10-07. The counts are from one day, 2026-10-06, rounded.

Parts. The maker or seller page linked from each row of section 2. Prices as listed on 2026-10-07.

Rules. 47 U.S.C. 605: https://www.law.cornell.edu/uscode/text/47/605, read on 2026-10-07.

Footnotes

  1. The WSJT-X list has no WSPR frequency for 60 m. The ka9q-radio channel file listens on 5.2872 and 5.3647 MHz. The rules for 60 m differ from country to country. ↩

  2. The 15 are: 0.136, 0.4742, 1.8366, 3.5686, 3.5926, 5.2872, 5.3647, 7.0386, 10.1387, 13.5539, 14.0956, 18.1046, 21.0946, 24.9246 and 28.1246 MHz. The frequency 13.5539 MHz is not in an amateur band. ↩

SpurMy station runs path B only. Path A comes from the WSJT-X manual, not from my desk. Section 15 lists every step that I did not run.