The GNU Chirp Sounder is a software defined radio based receiver for monitoring ionospheric sounders (ionosondes) and over-the-horizon radars that use linear frequency sweep FM-CW transmissions. The software is based on gnuradio and relies on Ettus research USRP2 and USRP N210 based digital receivers. The receiver can be used to receive the whole HF band (typically at 25 MHz bandwidth) simultaneously, and to receive multiple sounders simultaneously. The current receiver can be used to perform single or dual polarization (channel) soundings. The dual channel recorded can be used to determine the polarization form vertical soundings, or for angle of arrival measurements. Multiple independent receivers could also be used for imaging purposes.

The program consists of a data recorder that performs chirp downcoversion band-pass filtering and decimation. The chirp downconversion multiplies the received signal with the undelayed analytic chirp waveform. Another program can be used to visualize the recorded data files, essentially performing a windowed spectrogram of the data file and scaling the axes correctly.

An example oblique sounding of a Cyprus based over the horizon radar measured in Sodankylä. The digital receiver was tuned to 22.5 MHz, but due to the help of aliasing, the full band between 8 and 35 MHz can be measured.

A sounding from Puerto Rico demonstrating the new adaptive filtering feature that removes HF broadcast stations.

An example dual polarization vertical sounding of the Sodankylä ionosond located 1 km from the receiver. The plot shows the phase difference between the North-South and East-West polarized incident plane waves.

An example O-mode vertical sounding of the Sodankylä ionosond located 1 km from the receiver.

An example X-mode vertical sounding of the Sodankylä ionosond located 1 km from the receiver.

6 days of the Cyprus 8-35 MHz OTHR measured up to 25 MHz with 5 minute time resolution.

2 days of oblique soundings in Boston using the new HF broadcast removal feature added in 1.23.

6 days of the Sodankylä ionosonde measured 1 km from transmitter (vertical sounding).


New version out 2013.10.10. This version removes R dependency, adds gnuradio 3.7 compatibility, as well as a new adapative filtering option to suppress HF broadcast interference. The software is provided as a set of gnuradio blocks and a few python scripts, which are located here: gr-juha-1.23.tar.gz. The software has only been tested under Ubuntu Linux, but it should work on any platform supported by gnuradio 3.7 series and the Ettus UHD drivers. Version 1.23 has been tested with gnuradio 3.7.1 (svn master branch accessed on 2013.10.10). For hardware, you'll need a GPS locked USRP N200 series device, preferably with the internal GPSDO, but an external clock should also work. I haven't tested on other USRPs that offer external reference synchronization, they might work too.

To install the program, first install uhd and gnuradio as per instructions on the gnuradio web site. Then make sure you have python matplotlib and numpy installed. Compile gr-juha using the standard mkdir build; cd build ; cmake ../ ; make ; sudo make install method used by gnuradio out of tree blocks. The chirp sounder code is under gr-juha/apps/chirpsounder. records data, plots soundings, and is the configuration file.


The program is divided into two parts that are implemented as separate programs: data recording and ionogram analysis. The receiver is a combination of python and a custom gnuradio signal processing block that can be used to downconvert chirps and store them into narrow band files. The analysis program is a python script, which operates on the recorded files.

The recorder program is intended to be operated continuously. It stores the recorded data files into a daily changing subdirectory (of form YYYY.MM.DD). The analysis program can then be used to calculate ionograms from these files.

The single channel data recorder program is The sounders that are to be received can be defined by editing the sounders data structure in

This definition would result in two threads that run in parallel. The first thread would receive the "cyprus1" and "pr" sounders, while the other thread would track "virginia" and "longreach". You can have as many threads as your computer can handle, and this allows you to track more sounders at the same time.

sounders = [[{'rep':300,'chirpt':235,'name':'cyprus1','rate':0.1e6,'dur':250, 'cf':12.5e6, 'rmin':7500, 'rmax':17500},
            {'rep':720,'chirpt':380,'name':'pr','rate':0.1e6,'dur':250, 'cf':12.5e6, 'rmin':2000, 'rmax':12000}],
            [{'rep':720,'chirpt':346,'name':'virginia','rate':0.1e6,'dur':250, 'cf':12.5e6, 'rmin':0, 'rmax':8000},
            {'rep':300,'chirpt':137,'name':'longreach','rate':0.125e6,'dur':250, 'cf':12.5e6,'rmin':15000, 'rmax':30000}]]

The receiver is started by calling:


The analysis program is started by calling:

./ /data/chirp/2013.10.10
. It will store analyzed soundings as png files under the same data directory

An example recording of cyprus1 can be found here


Example hardware

The receiver requires a USRP2 or USRP N200 series, equipped with a GPS stabilized reference 10 MHz and 1 PPS synchronization signal (internal GPSDO is recommended). The receiver also requires at least one antenna that covers the frequency range of interest.

Example hardware configuration for dual polarization soundings using the GNU Chirp Sounder. A single channel receiver can be done with just one usrp2, n210 or n200.


The GNU Chirp sounder has been developed by Juha Vierinen. You can contact me by e-mail: j (AT)