FM receiver


fmreceiver is - as the name suggests - software for decoding FM signals. Objective in the design was to have software that was flexible, with user control over many settings, and software that showed as much information as possible.

The first version of the software dates from 2012, since then many improvements were made. The current implementation contains elements submitted by Tomneda, some of the contributions relate to the GUI, other are "under the hood".

The GUI of the fmreceiver shows the spectrum of the incoming signal - a signal with a rate of 2304000 samples per second, (The samplerate is chosen such that in two steps the rate can be decimated to 192000. Devices like the SDRplay, the AIRspy and others only support samplerates from 2000000 and up. Internally the software uses 192000 Ss.) In the second display (left) the right half of the spectrum of the decoded signal (a signal with a rate of 192000, so the display shows a band of 96000) is shown. One clearly sees the L+R signal from 0 to 15 KHz, the pilot signal at 19 KHz, the L-R signal ar 38 KHz, and the RDS signal at 57 KHz.

The GUI further shows the constellation of the RDS signal, ideally we should see here two dots, symmetrical around the middle line.

Correct pilot detection is essential for both stereo decoding and rds decoding, the pilot is decoded using a PLL, and the GUI shows whether or not the PLL is able to lock

A contribution of Tomneda is the addition of a PSS analyzer. As (probably) known, the L-R component of the signal is an AM signal, modulated on an 38 KHz carrier, i.e. twice the pilot. To recover the L-R signal, the signal should be extracted from the spectrum and shifted -38 KHz to an IF of zero. The carrier of 38 Khz needed, is derived from the pilot.

The PSS (i.e. Perfect Stereo Separation) algorithm computes - using the pilot signal as well as the L-R signal - the perfect carrier for demodulating and decoding the L-R signal, such that the left and right channel are optimally separated.

The same applies to the RDS signal, but here with 3 times the pilot frequency, the carrier to shift the RDS signal in frequency should be a perfect match.

To limit the number of controls on the main widget, a separate configuration widget is used.


The configuration widget typically contains selectors that are less often used. The top line contains buttons to control dumping and logging, the second and third row selectors and display for scanning.

The selector labeled Europe allows selection between Europe and the USA wrt certain PTY codes. A second selector, labeled 50us (Europe, non-USA) allows selection of different setttings for the deemaphasis filter.

The number with the larger point size given an indication of the CPU load of the computer where the program is running. It is interesting to see that the CPU load when running the FM decoder is much higher than the load when running a DAB decoder.

The bottom line of the configuration widget contains two selectors, one for the audio channel, with the other one a "skin" can be selected (contributed by Tomneda).

The software currently supports devices listed below with a large(r) bandwidth and control and datatransfer using USB.

  1. SDRplay (with library v2.13),
  2. SDRplay (with library v3.xx),
  3. AIRspy,
  4. hackrf devices,
  5. lime devices,
  6. adalm pluto devices, and of course
  7. rtlsdr dabstick devices

The device interface is pretty simple, assuming a new device supports setting frequency, bandwidth and a the samplerate used, interfacing the device is straightforward.

While the software was originally developed for use with a soundcard, soundcard support is - for practical reasons - removed from the current AppImage and Window Installer. It is, however, possible to configure the software for use with soundcard (and a pmSDR as radio device), provided the soundcard is able to deliver samples with a rate of 192000, but not combined with the "fast" devices.