1. What this guide builds
A receiving position for three signals on shortwave. One is data from ships, one is Morse code from amateur beacons, and one is a voice. You need one shortwave receiver, one antenna and one computer.
| Signal | Frequency | Antenna | Radio | Decoder | Computer |
|---|---|---|---|---|---|
| DSC, the digital calls of ships | 2187.5, 4207.5, 6312, 8414.5, 12577, 16804.5 kHz | Any shortwave antenna | An SDR radio | SDRangel, DSC Demodulator | A PC with a screen |
| NCDXF/IARU beacons | 14.100, 18.110, 21.150, 24.930, 28.200 MHz, in CW mode | Any antenna for 14 to 28 MHz | Any shortwave receiver | Your ear and a clock | None needed |
| HFGCS voice | 4724, 8992, 11175, 15016 kHz, upper sideband | Any shortwave antenna | Any shortwave receiver | Your ear. Optional: whisper.cpp | Optional |
In the episode I decode all three with programs that I wrote. Those programs are not public. This guide uses free public programs for the same jobs, and it says where no such program exists.
There are two paths. Path A is the lowest-cost one: a narrow radio, a PC with a screen, one frequency at a time. Path B is my hardware: a wide receiver that hears all of shortwave at once, on a PC with no screen.
Path A (lowest cost)
--------------------
wire or loop antenna -- coax -- RTL-SDR Blog V4L -- USB -- PC with a screen
SDRangel:
DSC Demodulator (ship calls, log file)
SSB Demodulator (beacons, voice, by ear)
Path B (what I use)
-------------------
loop -- RG-6 -- power injector -- 30 MHz low-pass filter -- RF limiter -- RX-888 Mk II
|
own USB 3.0 socket |
v
hf (x86 PC, no screen): ka9q-radio
beacons: 5 channels, by ear with "monitor"
voice: 4 channels, "pcmrecord", then whisper.cpp
DSC: no free public decoder without a screen
2. What you need
Prices are US dollars unless the cell says otherwise. Each price has its seller. I checked the prices on 2026-10-07. They change. A part marked ◆ is what I use. A blank box is for your pencil.
Lowest-cost path (Path A)
| ☐ | Part | Job | Connector | Price | Note |
|---|---|---|---|---|---|
| ☐ | RTL-SDR Blog V4L | The radio | SMA | $37.95, rtl-sdr.com | The maker says it has a built-in shortwave converter, 500 kHz to 28.8 MHz. I have not used it on shortwave |
| ☐ | A shortwave antenna that you own: a dipole, a vertical, or a long wire | The antenna | Yours | Nothing | A receive-only wire of 10 m outdoors is a start |
| ☐ | 50 ohm coax, with an adapter to an SMA plug | Antenna to radio | SMA at the radio | See seller | |
| ☐ | A PC with a screen: Windows, macOS, or Ubuntu Linux on x86-64 | Runs SDRangel | USB | Yours | SDRangel publishes installers for these three |
| ☐ | A clock that shows UTC seconds | The beacon schedule | Nothing | The PC clock is enough if it is synchronized |
You may own a shortwave receiver or transceiver with CW and SSB. Then you need no new radio for the beacons and the voice. You need the SDR radio and SDRangel only for DSC.
What Path A gives up:
- It hears one slice of shortwave, about 2 MHz wide. The six DSC frequencies are far apart, so you watch one at a time.
- It needs a person at the screen. Nothing runs by itself overnight, except a DSC log that SDRangel writes while it is open.
- The radio has 8 bits. Strong broadcast stations at night can cover weak signals.
What I use (Path B)
| ☐ | Part | Job | Connector | Price | Note |
|---|---|---|---|---|---|
| ☐ | ◆ MLA-30+ active loop with its power injector | The antenna | SMA | See listing, Amazon | The amplifier is in the loop head. Mine is still indoors |
| ☐ | ◆ Turn Island Systems F3060 low-pass filter | In front of the receiver | See listing | $80, Turn Island Systems | Required at 64.8 MS/s (section 4) |
| ☐ | ◆ TAPR RF Limiter | Last part before the receiver | See listing | $20, TAPR | Needed if you also transmit |
| ☐ | ◆ RX-888 Mk II, 16-bit, 10 kHz to 64 MHz | The radio: all of shortwave at once | SMA | $152.79, OpenSourceSDRLab, 2026-10-11 | Copies exist. Mine is from OpenSourceSDRLab |
| ☐ | ◆ x86-64 desktop PC, 4 cores of Intel Haswell class (2013) or newer, 8 GB, a USB 3.0 socket on the main board | hf |
USB 3.0 | Used market | Mine: HP EliteDesk 800 G1 SFF, Core i5-4570, 12 GB, bought used |
| ☐ | SATA solid-state drive, 120 GB or more | Storage for hf |
See seller | Recordings fill a drive fast (section 9) |
Cable and small parts
| ☐ | Part | Job |
|---|---|---|
| ☐ | RG-6 quad-shield coax, and two F to SMA adapters | Loop to the receiver. On shortwave, 10 to 20 m of it loses under 1 dB |
| ☐ | Short SMA plug-to-plug jumpers, 3 or more | Injector to filter to limiter to receiver |
| ☐ | Snap-on ferrites | Both ends of the antenna cable, and the USB cable |
| ☐ | Grounding block for the cable where it enters the house, and bonding wire | Section 4, “Ground the cable” |
| ☐ | 50 ohm SMA terminator | The noise test in section 6 |
Do not buy an amplifier at the start. An amplifier in front of a receiver that is already full makes reception worse.
3. Before you start
Skills. You know how to tune an SSB receiver. For Path A you install one program with an installer. For Path B you type commands into a Linux terminal over SSH.
Time. Path A: one evening. Path B: one day, of which 36 minutes is one command that runs by itself on my PC.
Accounts. None.
Values to choose first. Write these down. The steps use them as placeholders.
| Placeholder | Meaning | Example form |
|---|---|---|
<NAME> |
A station name with no personal detail. Path B sends it nowhere unless you add a feeder | my-station |
<LOG_DIR> |
The folder for your logs and recordings | /home/you/shortwave |
<DSC_KHZ> |
The one DSC frequency you watch on Path A | 8414.5 |
You do not need your position for any step. Do not enter it anywhere.
The law, for the United States. I am not a lawyer. US law (47 U.S.C. section 605) says that a person who receives a radio message not meant for the public must not tell others its contents, or use it for gain. It makes exceptions for broadcasts to the public, for amateur radio, and for messages about ships, aircraft or people in distress. Other countries differ.
My rules, which are stricter than that law. They are the rules of this guide.
- This guide is for reception only. Never transmit on a DSC frequency or an HFGCS frequency. You have no licence for them.
- Never publish or pass on a real DSC call: no ship number, no name, no position. A call involves real people.
- If you hear a real distress call, the coast stations have it already. They keep watch on these frequencies all day. Do not relay it, do not post it, and do not try to call the ship.
- Do not publish a recording or a transcript of an HFGCS broadcast. The messages are not meant for the public.
- The beacons are amateur radio. You may log and share what you hear from them.
Every call and message in this guide is an example that I wrote by hand. Each one has the tag “example”.
4. The antenna and the radio-frequency chain
Path A
Caution. A transmitter near the antenna can destroy the radio’s input. Never connect the SDR radio to an antenna while another radio transmits into that antenna or one close to it. Disconnect the SDR radio before you transmit.
- Put the antenna outside if you can. Distance from the electronics in the house matters more than height.
- Connect the coax to the antenna.
- Connect the SMA adapter to the radio end of the coax.
- Connect the coax to the SMA socket of the radio.
- Connect the radio to the PC with a short USB extension cable. The cable moves the radio away from the PC’s noise.
Keep the radio’s bias tee off. A bias tee puts DC on the coax. A dipole or a balun can short it.
Path B
Build the chain in this order, antenna first.
loop -- RG-6 -- power injector -- F3060 (30 MHz low-pass in, shelf filter bypassed)
-- RF limiter -- RX-888 Mk II, HF input
The reasons for the order:
- Injector first on the loop cable. Every part after it then sees no DC. The limiter blocks DC, so it must come after the injector.
- Low-pass filter before the limiter. A limiter makes harmonics when it clamps. TAPR’s manual says to filter ahead of it.
- The 30 MHz filter is not optional. At 64.8 million samples each second, the receiver cannot tell a signal above 32.4 MHz from one below it. A signal from 32 to 65 MHz folds back onto shortwave. The F3060 removes it.
- Leave the F3060 shelf filter bypassed. It cuts 20 dB at 3.5 MHz, and the lowest DSC frequency is below that.
- Bias tee off on the RX-888. The loop takes its power from its own injector.
Ground the cable
An outdoor antenna cable needs a path to ground where it enters the building. In the US the rule is National Electrical Code Article 810. Bond the grounding block to the building’s own grounding electrode system. Never use a ground rod that stands alone: a surge then goes through your equipment. I read a published summary of the rule, not the code text.1 Use a licensed electrician if you are not sure.
5. Path A: the computer and the program
Program: SDRangel. It is free and open source. It drives the radio, shows the spectrum, and holds a decoder for DSC and a demodulator for CW and SSB. I have not run it. The names of its controls below are from its documents.
-
Open the latest release page. On 2026-10-10 that was version 7.27.2, dated 2026-08-19.
-
Download the file for your computer.
Windows sdrangel-7.27.2-win64.exe macOS, Intel sdrangel-7.27.2_mac-15.7.7_x86_64.dmg macOS, Apple silicon sdrangel-7.27.2_mac-14.8.7_arm64.dmg Ubuntu 24.04 sdrangel_7.27.2_ubuntu-24.04_amd64.deb -
Install it. On Ubuntu, use this command in the folder that holds the file.
sudo apt install ./sdrangel_7.27.2_ubuntu-24.04_amd64.deb -
On Windows, install the radio’s USB driver as the RTL-SDR Blog guide for the V4L says. On Linux, stop the kernel’s TV driver from taking the radio: the same guide gives the file.
-
Synchronize the PC clock. Windows and macOS do this by default. On Ubuntu, install
chrony.sudo apt install -y chrony -
Start SDRangel. Add a receiver with the key Ctrl-R. Choose the RTL-SDR device from the list.
Result: a device window and a spectrum window open.
-
Leave “Direct sampling mode” off for a V4L. The maker says the V4L converts shortwave inside the radio. An older RTL radio with no converter needs this box on.
-
Set the center frequency to 8,400 kHz. Start the device with the triangle button.
Result: the button changes to a green square, and the spectrum moves.
Caution. The V4L needs a driver from 2026. An older driver opens the radio and receives nothing. I did not confirm that the driver inside SDRangel 7.27.2 knows the V4L. If the spectrum is a flat line on every band, read section 13.
6. Path B: the computer and the receiver
Receiver program: ka9q-radio, free and open source. Its radiod service reads the whole of shortwave from the RX-888 Mk II. It gives each listener its own channel over the computer’s internal network. I run these steps on my station. They build the version I run (commit b5bbb9aa, 2026-09-25).
-
Install Ubuntu Server 24.04 LTS. Set the host name to
hf. Turn SSH on. Use wired Ethernet. -
Add the author’s package source. Two of the libraries are only there.
sudo wget -P /usr/share/keyrings http://www.ka9q.net/debian/ka9q-radio.asc echo "deb [signed-by=/usr/share/keyrings/ka9q-radio.asc arch=amd64] http://www.ka9q.net/debian noble main" \ | sudo tee /etc/apt/sources.list.d/ka9q.list sudo apt update -
Install the build tools and libraries. The list is from the project’s
docs/INSTALL.md.sudo apt install -y git avahi-utils build-essential make gcc libairspy-dev libairspyhf-dev \ libbsd-dev libfftw3-dev libfftw3-bin libhackrf-dev libiniparser-dev libncurses-dev libopus-dev \ librtlsdr-dev libusb-1.0-0-dev libusb-dev portaudio19-dev libasound2-dev rsync libogg-dev \ libsamplerate0-dev libliquid-dev libncursesw5-dev libbladerf-dev libhydrasdr-dev libfobos-dev \ libcsv-dev libsoapysdr-dev chrony -
Build and install.
cd ~ && git clone https://github.com/ka9q/ka9q-radio.git && cd ka9q-radio git checkout b5bbb9aa make -j && sudo make install sudo adduser $(whoami) radio sudo systemctl enable --now set_lo_multicastResult: the install creates the user and group
radio, the service files, and the rules that load the receiver’s firmware. Log out and in again so the new group applies. -
Connect the chain from section 4. Plug the RX-888 Mk II into a USB 3.0 socket on the PC. Never use a hub for it.
lsusb | grep 04b4 # expect 04b4:00f1 "RX888mk2". 00f3 means the firmware did not load lsusb -t | grep -B2 usbfs # the receiver's line must end in 5000M -
Write the receiver settings. Start from the project’s example.
sudo cp ~/ka9q-radio/config/examples/radiod@rx888-generic.conf /etc/radio/radiod@hf.conf sudoedit /etc/radio/radiod@hf.confSet these lines in the first two sections.
[global] hardware = rx888 status = hf.local [rx888] device = "rx888" description = "<NAME>" samprate = 64m8 gain = 10Always write
samprate = 64m8. One of the project’s default files uses the full rate, which makes more heat and needs a faster PC. -
Make the speed tables for this PC. This took 36 minutes on my Core i5-4570.
radiodmust not run during it.cd /etc/fftw && sudo touch nwisdom && sudo chown $(whoami):radio nwisdom wisdomf 2>/dev/null time fftwf-wisdom -v -T 1 -o nwisdom rof1620000 cob1920 cob1200 cob960 cob800 cob600 \ cob480 cob320 cob300 cob200 cob160 cob150 ls -l nwisdom && cp nwisdom wisdomfDo not leave out
-T 1. Do not copy the file from another computer. -
Start the receiver and look at it.
sudo systemctl enable --now radiod@hf systemctl is-active radiod@hf # expect "active" control hf.local # the live panel. Press q to leaveResult: the panel shows the receiver’s levels. The service name is
radiod@hf, notradiod@hf.conf. -
Set the gain. In the panel, read the level of the analog-to-digital converter. The project’s rule is an average of -20 to -25 dBFS. I run 10 dB of gain, which gives about -32 dBFS here. A count of “overranges” that keeps rising means too much gain.
-
Test that the antenna, not the receiver, sets the noise. Note the noise level on a quiet frequency. Replace the antenna cable with the 50 ohm terminator. The noise must fall by 6 dB or more.
-
Keep the receiver in its case, and keep air around it. It runs hot.
7. Signal 1: the calls of ships (DSC)
What a call is
Digital selective calling (DSC) is the calling system that ships use for distress and safety. A ship’s radio sends a short burst of data in place of a voice call. The public standard is ITU-R M.493.
- The burst is two tones 170 Hz apart, at 100 bits each second. A call lasts a few seconds.
- Each character is sent twice. The call ends with a check character.
- Every ship radio has a nine-digit number, the MMSI. A coast station’s number starts with two zeros.
A call contains these fields.
| Field | What it says | Values you see |
|---|---|---|
| Format | Who the call is for | One ship, a group, an area, all ships, or a distress alert |
| To | The number of the station called | A nine-digit number, or an area |
| Category | How urgent the call is | Routine, safety, urgency, distress |
| From | The number of the caller | A nine-digit number |
| Telecommand | What the caller wants | Test, or a voice mode for the next contact |
| Position and time | Where the ship is. Mostly in a distress alert | Degrees and minutes, and a UTC time |
| Nature of distress | What is wrong. Only in a distress alert | Fire, collision, sinking, disabled and adrift, a piracy attack, and others |
| End, and check | How the call ends, and if the check matched | Request for an answer, answer, or plain end |
Almost all calls are tests. A ship calls a coast station to test its radio, and the coast station answers. On my station, about 98 calls in 100 are a test or its answer. The US Coast Guard says its stations answer test calls on 4207.5 kHz automatically.
Two examples, written by hand. Neither number is a valid ship number, because no country code starts with 1.
EXAMPLE (a test call, invented)
Format Selective call
To 001234567 coast station
Category Safety
From 123456789 ship
Telecmd Test
End Request for an answer
Check OK
EXAMPLE (a distress alert, invented)
Format Distress alert
From 123456789
Nature Piracy or armed robbery attack
Position 12°34' N 123°45' W
Time 12:34 UTC
Check OK
What to tune
The six shortwave frequencies for distress and safety calls are fixed by rule (in the US, 47 CFR 80.359).
| Frequency | Share of the calls at my station | When to try it |
|---|---|---|
| 2187.5 kHz | About 5 in 100 | Night |
| 4207.5 kHz | About 20 in 100 | Night |
| 6312 kHz | About 15 in 100 | Night, dusk and dawn |
| 8414.5 kHz | About 25 in 100 | Most of the day. Start here |
| 12577 kHz | About 15 in 100 | Day |
| 16804.5 kHz | About 15 in 100 | Day |
The shares are one week at my station in the Puget Sound, rounded. Yours differ. The “when” column is the general rule of shortwave: low frequencies travel at night and high frequencies by day.
Path A: decode with SDRangel
Caution. Step 5 below names a switch that sends every call you decode to a public database, with a station name. That breaks the rule in section 3. Leave it off.
-
Start the device as in section 5, with the center frequency at 8,400 kHz.
-
Add a channel to the device. Choose “DSC Demodulator” from the list of channels.
-
Set the frequency shift of the channel to +14,500 Hz. The channel is then on 8414.5 kHz.
-
Set “Mode” to MF/HF. The other mode is for the VHF marine channel 70.
-
Leave “Feed to YaDDNet” off. Leave the UDP box off.
-
Turn “Filter Invalid” on. The table then hides calls that failed their check.
-
Choose a log file with the “.csv Log Filename” button. Put it in
<LOG_DIR>. -
Turn “Start/stop Logging Messages to .csv File” on.
Result: nothing, until a call arrives. Wait. A call is a short, rough buzz, and a narrow double line on the spectrum for a few seconds. Then one new row appears in the table.
For another frequency, change the center frequency and the shift. Keep the center 10 to 50 kHz away from the signal. An RTL radio has a false line at the exact center.
SDRangel is not the only choice. YaDD is a free DSC decoder for Windows that reads the sound of any SSB receiver. I could not read its documents on the check date, so this guide has no steps for it.
Path B: what is missing
I found no free public DSC decoder for Linux that runs without a screen. That is why I wrote my own. My program listens on all six frequencies at once and drops every call that fails its check.
With an RX-888 Mk II you have two honest choices. Run SDRangel on a PC with a screen and a second, low-cost radio, as in Path A. Or wait: a public decoder may appear. I did not test SDRangel with the RX-888 Mk II.
What a good reception looks like
- The ECC column and the Valid column of the row both show a pass.
- “From” and “To” are nine digits each. One of them often starts with two zeros.
- The “Telecommand 1” column says “Test” in most rows.
- The “Errors” column is low. SDRangel may repair a damaged character from its second copy.
SDRangel looks up ship names for the table at the web site aprs.fi. Each lookup sends the ship number to that site.
How many to expect
My station hears about 350 valid calls a day on all six frequencies together, with a small loop indoors. About 40 more each day are damaged, and my program drops them. On one frequency, expect far fewer. My first test heard 9 calls in two hours on one frequency.
How to log it
The CSV file from step 7 is the log. It holds every column of the table. Keep it on your own computer.
To share what you learned, count, and share only the counts. This is the form I use in the episode:
EXAMPLE (a summary that is safe to share, invented numbers)
Week of listening on 8414.5 kHz
Valid calls 120
Tests and answers about 98 in 100
Calls dropped 15
Warning. A call with the format “Distress alert” may be a real emergency, or a false decode. In both cases, do nothing with it. The coast stations and rescue centers have it already. Do not post it, do not pass it on, and do not transmit.
8. Signal 2: the eighteen beacons
What the beacons send
The NCDXF/IARU International Beacon Project runs 18 beacons around the world. Amateur radio groups operate them. All 18 share one frequency on each of five bands, so they take turns.
- A turn is 10 seconds. A round is 18 turns, which is 3 minutes. The beacons run 24 hours a day.
- In its turn, a beacon sends its callsign in Morse code at 22 words a minute. Then it sends four dashes, each one second long.
- The callsign and the first dash have 100 watts. The next dashes have 10 watts, 1 watt and 0.1 watt.
- After its turn, the beacon moves to the next higher band. The next beacon starts on the band it left.
What to tune
| Band | Frequency | Mode |
|---|---|---|
| 20 m | 14.100 MHz | CW |
| 17 m | 18.110 MHz | CW |
| 15 m | 21.150 MHz | CW |
| 12 m | 24.930 MHz | CW |
| 10 m | 28.200 MHz | CW |
In CW mode, set the dial to the exact frequency. A receiver with no CW mode works too. Set it to upper sideband and tune 700 Hz lower: the beacon is then a 700 Hz tone.
Start on 14.100 MHz. It is open to some part of the world for most of the day. The three highest bands open only by day, and only when the sun is active enough.
The schedule
A round starts at every minute of the UTC hour that divides by 3: at :00, :03, :06 and so on. The table gives the start of each beacon’s turn inside the round, in minutes and seconds. I name each beacon by its place. The NCDXF page lists the callsigns.
| Beacon, in the order of the turns | 14.100 | 18.110 | 21.150 | 24.930 | 28.200 |
|---|---|---|---|---|---|
| 1. New York | 0:00 | 0:10 | 0:20 | 0:30 | 0:40 |
| 2. Inuvik, northern Canada | 0:10 | 0:20 | 0:30 | 0:40 | 0:50 |
| 3. Mt. Umunhum, California | 0:20 | 0:30 | 0:40 | 0:50 | 1:00 |
| 4. Maui, Hawaii | 0:30 | 0:40 | 0:50 | 1:00 | 1:10 |
| 5. Masterton, New Zealand | 0:40 | 0:50 | 1:00 | 1:10 | 1:20 |
| 6. Rolystone, Western Australia | 0:50 | 1:00 | 1:10 | 1:20 | 1:30 |
| 7. Mt. Asama, Japan | 1:00 | 1:10 | 1:20 | 1:30 | 1:40 |
| 8. Novosibirsk, Siberia | 1:10 | 1:20 | 1:30 | 1:40 | 1:50 |
| 9. Hong Kong | 1:20 | 1:30 | 1:40 | 1:50 | 2:00 |
| 10. Colombo, Sri Lanka | 1:30 | 1:40 | 1:50 | 2:00 | 2:10 |
| 11. Pretoria, South Africa | 1:40 | 1:50 | 2:00 | 2:10 | 2:20 |
| 12. Kikuyu, Kenya | 1:50 | 2:00 | 2:10 | 2:20 | 2:30 |
| 13. Tel Aviv, Israel | 2:00 | 2:10 | 2:20 | 2:30 | 2:40 |
| 14. Lohja, Finland | 2:10 | 2:20 | 2:30 | 2:40 | 2:50 |
| 15. Madeira | 2:20 | 2:30 | 2:40 | 2:50 | 0:00 |
| 16. Buenos Aires, Argentina | 2:30 | 2:40 | 2:50 | 0:00 | 0:10 |
| 17. Lima, Peru | 2:40 | 2:50 | 0:00 | 0:10 | 0:20 |
| 18. Caracas, Venezuela | 2:50 | 0:00 | 0:10 | 0:20 | 0:30 |
I computed this table from the order and the clock rule on the NCDXF pages. Some beacons are off the air at times. The NCDXF schedule page marks them.
Know the beacon by the clock alone
You do not need to read Morse code. The clock tells you who is on.
- Read the UTC time, for example 14:37:20.
- Find the start of the round: the last minute that divides by 3. Here that is 14:36:00.
- Subtract. Here the time inside the round is 1:20.
- Find that time in the column of your band. On 14.100 MHz, 1:20 is beacon 9, Hong Kong.
This command prints the number of the beacon that is on 14.100 MHz now. It works on Linux and macOS.
echo $(( ($(date -u +%s) / 10) % 18 + 1 ))
For each higher band, subtract 1 from that number. Below 1, continue from 18.
Your clock must be right to one second or two. A clock that is 10 seconds wrong names the wrong beacon.
Use the four dashes to judge a path
Each dash has one tenth of the power of the dash before it. That is a step of 10 dB. So the beacon measures the path for you.
| You hear | What it means |
|---|---|
| Nothing | The path is closed, or the beacon is off the air |
| The callsign and 1 dash | The path is open for 100 watts, with little to spare |
| 2 dashes | 10 watts gets through. The path has about 10 dB to spare |
| 3 dashes | 1 watt gets through. About 20 dB to spare |
| 4 dashes | A tenth of a watt gets through. About 30 dB to spare |
The same test compares two antennas. Listen to one beacon on each antenna in turns that follow each other. One more dash is 10 dB better.
Listen
Path A or your own receiver. Tune as in “What to tune”. In SDRangel, add the channel “SSB Demodulator”. A positive value in its “BW” control selects upper sideband. Set the shift so that the channel sits 700 Hz below the beacon frequency.
Path B. Give radiod the five beacon channels. The project includes the settings.
cat ~/ka9q-radio/config/examples/fragments/ibp.conf | sudo tee -a /etc/radio/radiod@hf.conf >/dev/null
sudo systemctl restart radiod@hf
The lines you added are these.
[IBP]
data = ibp.local
samprate = 12k
encoding = s16be
mode = cwu
freq = "14m100 18m110 21m150 24m930 28m200"
Then listen. The monitor program plays the channels on the sound output of the computer it runs on.
monitor ibp.local
Result: a list of five sessions. Use the arrow keys to select one. Press M to mute all, then u to open the selected one. Press Q to leave. The cwu mode moves the beacon to a 500 Hz tone.
hf has no loudspeaker in my station. Run monitor on a computer with sound, on the same network, with ka9q-radio installed. I did not confirm the network settings that this needs.
What a good reception sounds like
A burst of fast Morse code that lasts a few seconds. Then long tones, each weaker than the one before, in clear steps. Then, 10 seconds after the start, a new station with a new strength. A steady carrier with no steps is not a beacon.
What to expect
With a small loop indoors, I hear a beacon in fewer than 1 turn in 100. In one week I heard northern Canada, California and Hawaii the most. New York, New Zealand and Japan came in now and then. The other twelve, almost never. On 24.930 and 28.200 MHz I heard nothing that I can count.
An antenna outdoors hears far more than that. Your list of regular beacons depends on where you are.
How to log it
Listen to one full round, 3 minutes, on one band. Write one row.
EXAMPLE (one round on 14.100 MHz, invented)
UTC date and time of the round 2026-01-01 18:00
Band 20 m
Dashes heard, beacons 1 to 18 0 2 4 3 0 0 1 0 0 0 0 0 0 0 0 0 0 0
Do this at the same hours for some days. The rows show which paths open, and when.
Programs that do this for you
- Faros, for Windows. It watches all 18 beacons on five bands, and measures signal quality and delay. It needs a CW or SSB receiver and a sound input. I listed it at $25 after a 30-day trial on 2026-10-07. Its page did not show a price on 2026-10-10.
- Beacon Monitor 2, for Linux. The NCDXF page calls it a Faros-like monitor. It is open source, a beta version, written for a SoftRock receiver, and last changed in 2018.
- ka9q-radio gives the five channels, but no program that measures them. My own program does that job. It is not public.
I have run none of the first two.
9. Signal 3: military voice (HFGCS)
What it is
The US Air Force talks to its aircraft on shortwave. The network is the High Frequency Global Communications System (HFGCS). Its frequencies are public. Its best-known messages are long strings of letters and digits, read in the spelling alphabet. Anyone can hear them. Only the intended receivers know what they mean.
What to tune
| Frequency | Mode | Share of the speech at my station |
|---|---|---|
| 4724 kHz | Upper sideband | About 15 in 100 |
| 8992 kHz | Upper sideband | About 40 in 100 |
| 11175 kHz | Upper sideband | About 40 in 100 |
| 15016 kHz | Upper sideband | About 5 in 100 |
Public references list these four as the main voice frequencies. Hobby lists add 6739 and 13200 kHz. I heard nothing I can count on those two in one week.
Start on 11175 kHz by day and 8992 kHz in the evening.
What a good reception sounds like
A clear voice in English, with the flat rhythm of someone who reads a list. Most of what it reads are letters in the spelling alphabet and digits. A typical broadcast lasts about 20 seconds. Some repeat on several frequencies at the same moment.
This is an example that I wrote. The groups are invented.
EXAMPLE (invented)
"All stations, all stations, this is EXAMPLE. Stand by.
Alfa Bravo Two Charlie Delta Seven Echo ... I say again ...
This is EXAMPLE, out."
How long to wait
The network is quiet for long times, then busy. My first test heard nothing in 30 minutes. In one later week my station recorded about 50 pieces of speech a day. Leave the receiver on the frequency while you do other work.
Listen
Path A or your own receiver. Set upper sideband. Set the dial to the frequency in the table. In SDRangel, use the channel “SSB Demodulator” with a positive “BW” value near 3 kHz and a shift of 0 from the frequency.
Path B. Add this section at the end of /etc/radio/radiod@hf.conf. It makes one channel for each frequency.
[HFGCS]
data = hfgcs.local
mode = usb
samprate = 12k
freq = "4724k 8992k 11175k 15016k"
sudo systemctl restart radiod@hf
monitor hfgcs.local
Result: a list of four sessions, each with noise until someone speaks.
Record without a person at the receiver (Path B)
Caution. A recording of this traffic is for your own ears. Do not publish it. Keep the folder on your own computer.
pcmrecord is the recorder of ka9q-radio. It writes one sound file for each channel.
sudo install -d -o radio -g radio /var/lib/hfgcs
sudo -u radio pcmrecord -d /var/lib/hfgcs -s -L 600 hfgcs.local
-dnames the folder.-smakes one folder for each channel, then for each year, month and day.-L 600starts a new file every 600 seconds.
pcmrecord records all the time, noise too. A 12 kHz channel fills about 2 GB each day. Four channels fill about 8 GB each day. I found no public program that keeps only the speech. My own program does that: it tells speech from static by its rhythm. Syllables come 3 to 8 times each second.
Delete old files with this command. It removes files older than 7 days.
sudo -u radio find /var/lib/hfgcs -type f -mtime +7 -delete
Make text from a recording
Program: whisper.cpp, free and open source. It runs with no screen. These are the steps from its README. I use another free program for this job, faster-whisper, on another computer.
-
Build the program and get a model.
sudo apt install -y cmake ffmpeg cd ~ && git clone https://github.com/ggml-org/whisper.cpp.git && cd whisper.cpp sh ./models/download-ggml-model.sh base.en cmake -B build cmake --build build -j --config Release -
Convert one recording to the form that the program reads.
ffmpeg -i <recording>.wav -ar 16000 -ac 1 -c:a pcm_s16le /tmp/one.wav -
Make the text.
./build/bin/whisper-cli -f /tmp/one.wavResult: lines of text, each with a start time and an end time.
Expect mistakes. The program writes words for pure noise too, so use it only on a file that you know holds speech. Always keep the sound: the text is a guide to the sound, not a record.
How to log it
Log that a broadcast arrived, not what it said.
EXAMPLE (a log that is safe to keep and to share, invented)
UTC date and time Frequency Kind Length
2026-01-01 18:42 11175 kHz letter groups 25 s
2026-01-01 19:10 8992 kHz short call 8 s
10. Sharing (optional)
You do not need to share anything. If you do, read this first.
Your station becomes public. Every network below shows a station name, and most show a position or a grid locator. A six-character locator places you within a few kilometers. Choose a name that does not name you or your street.
| Signal | Where people share | My advice |
|---|---|---|
| DSC | YaDDNet, a public database. SDRangel can feed it | Do not feed it. It publishes real calls: ship numbers and positions. That breaks the rule in section 3 |
| Beacons | The NCDXF page lists stations that run Faros and publish their results | Fine. The beacons are amateur radio. I do not feed them |
| HFGCS | Hobby sites collect recordings and text | Do not. Share counts and times only |
11. Running it unattended
Path A. SDRangel keeps its DSC log while it runs. Leave the PC on, with sleep off, on one DSC frequency. That is the only unattended job on Path A.
Path B. radiod is a service already. It starts with the PC. To make the recorder a service too, create this file.
sudoedit /etc/systemd/system/hfgcs-record.service
[Unit]
Description=Record the HFGCS voice channels
After=radiod@hf.service
Requires=radiod@hf.service
[Service]
User=radio
Group=radio
ExecStart=/usr/local/bin/pcmrecord -d /var/lib/hfgcs -s -L 600 hfgcs.local
Restart=always
RestartSec=10
[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload
sudo systemctl enable --now hfgcs-record
systemctl is-active hfgcs-record # expect "active"
I wrote this service file for this guide. I did not run it. My station uses my own recorder.
Run the delete command from section 9 each day. A full drive stops the receiver’s other jobs.
In the PC’s firmware settings, set the PC to start again after a power cut.
12. Check that it works
-
The receiver hears shortwave. Tune 10000 kHz, AM or upper sideband. In most of the world you hear a time signal with a tick each second. Wait: 1 minute.
-
The clock is right. Compare the PC clock with that time signal. They must agree to one second.
-
Beacons. Listen on 14.100 MHz for three full rounds, 9 minutes, in daylight. Pass: one beacon or more, with dashes that get weaker in steps. With an indoor antenna you may need several tries at other hours.
-
The beacon is the one the clock names. If you read Morse code, compare the callsign with the NCDXF list for that turn.
-
DSC. Leave the decoder on 8414.5 kHz for 4 hours. Pass: one row or more with a passed check and a test telecommand. My first test heard 9 calls in two hours.
-
HFGCS. Leave the receiver on 11175 kHz by day or 8992 kHz in the evening. Pass: one broadcast with letter groups. Wait: up to a day.
-
Path B only. Run these.
systemctl is-active radiod@hf # expect "active" lsusb -t | grep -B2 usbfs # the receiver's line ends in 5000M ls -R /var/lib/hfgcs | head # new .wav files
Then write down what you hear in one normal day: beacons per round, DSC calls, broadcasts. That 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 |
|---|---|---|
| SDRangel shows a flat spectrum on every band with a V4L | The driver is older than 2026 and does not know the V4L’s tuner | Update the driver as the RTL-SDR Blog guide says. Try a newer SDRangel |
| Linux: the radio is “busy” or cannot be opened | The kernel’s TV driver took the RTL radio | Block the driver as the RTL-SDR Blog guide says. Restart the computer |
| A strong false line sits on the frequency you want | The exact center of an RTL radio has a false signal | Move the center frequency 10 to 50 kHz away. Use the channel’s shift |
| DSC: the buzz is there, but no row appears | “Mode” is set to VHF, or the shift is wrong | Set MF/HF. Check that center plus shift is the exact frequency |
| DSC: rows appear and vanish, or are marked invalid | Weak or damaged calls | Normal. Keep “Filter Invalid” on. Never trust a row that failed its check |
| DSC: nothing for hours | Wrong band for the hour, or an indoor antenna | Use 8414.5 kHz by day and 4207.5 kHz at night. Put the antenna outside |
| A row says “Distress alert” | A real call, or a false decode | Do nothing with it. Section 3 |
| Beacons: the wrong station for the time | The clock is wrong by 10 seconds or more | Synchronize the clock. Check it against a time signal |
| Beacons: a steady tone with no steps | Another station or a local noise, not a beacon | Wait for the 10-second pattern. A beacon stops after its turn |
| Beacons: nothing on 24.930 and 28.200 MHz | The band is closed. This is common | Listen at local noon. Use 14.100 and 18.110 MHz |
| Voice sounds like a duck | Lower sideband, or the dial is off | Set upper sideband. Set the exact frequency |
| HFGCS: nothing for an hour | Normal. The traffic comes in bursts | Wait. Try 8992 and 11175 kHz |
| whisper.cpp writes text for a file of noise | The model invents words when there is no speech | Use it only on files that hold speech. Listen first |
| Shortwave is full of signals that should not be there (Path B) | No 30 MHz low-pass filter, so signals above 32.4 MHz fold back | Fit the filter (section 4) |
radiod reports dropped data |
The RX-888 is on a hub or a USB 2 socket | Use a USB 3.0 socket on the main board |
| The loop has no signal | DC is wrong: the limiter blocks it, or the injector has no power | Injector first on the loop cable. Check its power supply |
| 2187.5 kHz is weak (Path B) | The F3060 shelf filter is on | Bypass it |
| A ka9q-radio channel hears nothing on its frequency | The frequency has no unit. In ka9q-radio, 22500 means 22.5 MHz |
Write the unit: 8992k |
| The drive is full | pcmrecord records all the time |
Run the delete command in section 9 each day |
14. What I did wrong
- My antenna is still indoors. The loop sits near the computer, which is the worst place for it. I hear a beacon in fewer than 1 turn in 100. Put the antenna outside first.
- I judged DSC from one short test. My first test heard 9 calls in two hours on one frequency. I thought the signal was rare. With all six frequencies and a week of time, the count was about 350 a day.
- I judged HFGCS from 30 minutes. I heard nothing and wrote “no traffic”. The network is quiet, then busy. A week showed about 50 pieces of speech a day.
- I trusted a label before I listened. My program labels about 30 recordings in 100 as coded messages. I have not checked that label by ear. Nobody has checked that every recording is an Air Force station.
- I counted on the high bands. On 24.930 and 28.200 MHz I heard one turn each in a week. That is nothing. An indoor loop does not show what those bands can do.
15. Not run and not confirmed
- I ran none of the public programs in this guide for these signals. My station uses my own decoders. SDRangel, YaDD, Faros, Beacon Monitor 2 and whisper.cpp are not run here.
- Every SDRangel step in sections 5, 7, 8 and 9. The names of the controls are from the project’s documents, read on 2026-10-10. I did not confirm the exact name of the button that adds a channel.
- That SDRangel 7.27.2 holds a driver that knows the RTL-SDR Blog V4L. The V4L needs a 2026 driver.
- The RTL-SDR Blog V4L on shortwave. Its shortwave range and its built-in converter are the maker’s statements. I have not used it below 24 MHz.
- That the DSC Demodulator of SDRangel decodes well on an 8-bit radio. I have no count for it.
- The content of the “ECC” and “Valid” cells in the SDRangel table. The documents name the columns, not the words in them.
- YaDD: its price, its input and its settings. I could not read its documents. For an SSB receiver and a sound-card decoder, the usual practice is upper sideband with the dial 1.7 kHz below the DSC frequency. I did not confirm that from a source.
- The ka9q-radio section
[HFGCS]in section 9. I wrote it for this guide from the form of the project’s examples. My station takes its voice channels in another way. - The
pcmrecordcommand in section 9 and the service file in section 11. The options are from the project’s document. I did not run that combination. I did not confirm that a channel inusbmode sends sound all the time. The 2 GB a day is computed, not measured. monitoron a second computer. I did not confirm the network settings that it needs.- The whisper.cpp steps. They are from its README. I use faster-whisper with the model
small.en. The Ubuntu package namescmakeandffmpegare from memory. - The beacon schedule table. I computed it from the order on the NCDXF “Locations” page and the clock rule in the script of the NCDXF schedule page. I did not compare each cell with the air.
- Which beacons are on the air today. The NCDXF page marks beacons that are off.
- The price of Faros. The page showed none on 2026-10-10.
- The upper sideband mode of HFGCS. The public overview that I link says “single sideband”. Upper sideband is what my station uses, and it works.
- The “when to try it” column of the DSC table. It is the general rule of shortwave, not a count from my station.
- The time signal on 10000 kHz in the checks. It is a published fact about the stations WWV and WWVH. I did not use it as a test.
- The price and the connector of the RX-888 Mk II, the F3060 and the limiter. Read each listing.
- That the newest ka9q-radio builds with the steps in section 6. I built the commit named there.
- No step in this guide was run on a new, empty computer as written.
16. Sources
All were read on 2026-10-10, except where a date is given.
The episode. Its fact sheet, its script and its link list, in the series’ private repository. The numbers from my station are one week, rounded.
The full-station guide. Build the station, sections 2, 4, 11, 15, 17 and 18, checked against my station on 2026-10-07. The parts, the prices, the ka9q-radio steps and the law paragraph come from it.
DSC. ITU-R M.493, the standard: https://www.itu.int/rec/R-REC-M.493 (linked, not read today). US Coast Guard, digital selective calling: https://www.navcen.uscg.gov/digital-selective-calling. The frequencies, 47 CFR 80.359: https://www.law.cornell.edu/cfr/text/47/80.359. SDRangel: https://github.com/f4exb/sdrangel, its release list, and the documents of its DSC Demodulator, SSB Demodulator, RTL-SDR input and main window. YaDD, a description by a user: https://swling.com/blog/2022/11/guest-post-monitoring-digital-selective-calling-dcs-with-yadd (found in a search, not read in full).
Beacons. NCDXF/IARU International Beacon Project: https://www.ncdxf.org/beacon/, its pages “Locations” (https://www.ncdxf.org/beacon/beaconlocations.html) and “Listener programs” (https://www.ncdxf.org/beacon/beaconprograms.html), and the script of its schedule clock. Faros: https://www.dxatlas.com/Faros/. Beacon Monitor 2: https://github.com/yokoyama-flogics/ibp_monitor_2.
HFGCS. A public overview: https://en.wikipedia.org/wiki/High_Frequency_Global_Communications_System. whisper.cpp: https://github.com/ggml-org/whisper.cpp. faster-whisper: https://github.com/SYSTRAN/faster-whisper.
The receiver. ka9q-radio: https://github.com/ka9q/ka9q-radio. Read: config/examples/fragments/ibp.conf, config/examples/radiod@rx888-generic.conf, share/presets.conf, docs/utils/pcmrecord.md, docs/utils/monitor.md, docs/utils/control.md. RTL-SDR Blog V4L: https://www.rtl-sdr.com/buy-rtl-sdr-dvb-t-dongles/.
Rules. 47 U.S.C. 605: https://www.law.cornell.edu/uscode/text/47/605 (read 2026-10-07).
Footnotes
-
Mike Holt’s summary of NEC 810.21, 2020 edition: https://www.mikeholt.com/files/PDF/20BG_810.21.pdf. ↩