Category: Broadcast Radio

Decoding and Listening to HD Radio (NRSC-5) with an RTL-SDR

HD Radio is a high definition terrestrial digital broadcast signal that is only used in North America. It is easily recognized by the two rectangular blocks on either side of a broadcast FM station signal on a spectrum analyzer/waterfall display. Since HD Radio uses a proprietary protocol, finding a way to decode it has been difficult and so this signal has been inaccessible to SDR users for a long time. Back in February of this year we posted about Phil Burrs attempt, where he was able to create a partial implementation (up to layer 2) of the HD Radio standard, but didn’t get far enough to decode any audio in layer 3.

However, now cyber security researcher ‘Theori’ has created a full RTL-SDR based decoder for the HD Radio protocol. In his post Theori explains that the HD Radio system is split into three layers. Layer 1 finds the signals and does decoding and error correction. Layer 2 is a multiplexing layer, which allows various layer 3 applications to share the bandwidth. Layer 3 is the audio data layer. In his post he explains how these layers work in detail. 

One of the main findings was the discovery of the audio compression codec. Theori found that the codec was essentially HE-AAC with some minor modifications. The modifications were minor enough that he was able to adapt the open source FAAD2 library for HD Radio audio decoding.

Theori’s code is open source and available on GitHub. The code includes the patch to modify FAAD2 for HD Radio and it is automatically applied during the build. A sample file for testing the decoder is also provided and we tested the decoder with the sample and it worked well. The decoding can also be performed in real time and examples of that are also on the git readme.

HD Radio Spectrum
HD Radio Spectrum

DAB/DAB+ Decoder Software “Welle.io” Now Available on Android

Back in March of this year we posted about “Welle.io”, a DAB/DAB+ decoder that supports the RTL-SDR and other SDRs like the Airspy. It was available for Windows, Linux and Raspberry Pi 2/3.

Albrecht Lohöfener, the author of Welle.io has recently written in to announce that Welle.io is now available for Android as well. The app appears to be free, but is currently marked as beta, so there may still be a few bugs.

The only other app that we’ve seen which is capable of decoding DAB/DAB+ on Android is Wavesink. Wavesink costs $14.90 USD on the Google Play store, but there is a free trial version available with runtime limitations and no DAB+ support.

Albrecht notes that the app is fairly computationally intensive and will require an Android device with at least 4 cores and a clock speed of 1.3 GHz to run the app. He also mentions that they are also looking for any interested developers and translators to help with development of the app.

Welle.io on Android
Welle.io on Android

welle.io: A New RTL-SDR & Airspy DAB/DAB+ Decoder Available for Windows/Linux

Thanks to Albrecht Lohofener for submitting to us his new software package called ‘welle.io’ which is a free DAB and DAB+ decoder and player that supports the RTL-SDR (directly or also via rtl_tcp) and Airspy software defined radios. The software can be run on both Windows and Linux, and also supports Raspberry Pi 2/3 and cheap Chinese Windows 10 tablets.

Albrecht writes that his software is a fork of the qt-dab codebase, with the development goal being to create an easy to use DAB/DAB+ software receiver. The software is still under heavy development, and Albrecht mentions that he is looking for fellow developers and testers to help improve the software and report any bugs. Albrecht writes:

I’m proud to introduce a new open source DAB/DAB+ reception application welle.io https://www.welle.io. welle.io is a fork of qt-dab http://github.com/JvanKatwijk/qt-dab (old dab-rpi and sdr-j-dab) with the goal to develop an easy to use DAB/DAB+ reception application. It supports high DPI and touch displays and it runs even on cheap computers like Raspberry Pi 2/3 and 100€ China Windows 10 tablets. As input devices welle.io supports rtlsdr and airspy.

Currently daily Windows binary builds are available over on the projects GitHub. For Linux and Raspberry Pi users you’ll need to compile the code from source, but in the future he plans to provide Ubuntu snaps.

We gave the welle.io software a brief test and it ran as expected. There is an automatic channel scan feature which scans through all the possible DAB channels and an advanced mode for seeing technical information such as the frequency, SNR and error rates. The software also has a nice touchscreen friendly GUI which automatically downloads and displays the DAB/DAB+ program guide information.

Welle.io DAB/DAB+ decoder for the RTL-SDR and Airspy.
Welle.io DAB/DAB+ decoder for the RTL-SDR and Airspy.

First Steps Towards Decoding HD Radio

Programmer Phil Burr wrote in and wanted to share his newest code which is a partial implementation (no audio) of the iBiquity IBOC HD Radio standard. HD Radio is a proprietary broadcast radio protocol and is used only in North America. You may have noticed it before as the rectangular sidebands on the spectrum which surround standard analogue broadcast FM signals.

The audio codec specifications are not public and is thus not implemented here, so this code has very little use outside of being a good learning tool. But Phil does write that if anyone if able to figure out how to decode the codec, then this code may be a good starting point.

Phil writes:

I wrote this because I wanted to learn about digital broadcasts. Despite the fact that the audio codec used is iBiquity’s proprietary HDC codec, I decided that writing a receiver that could decode the air interface would be a great learning experience.

iBiquity’s HDC codec is supposedly based upon some of the same technologies as HE-AAC codec so it may be possible for some audio codec gurus, given access to the raw HDC audio packets, to write a decoder for the codec.

The receiver is somewhat limited. It only decodes FM MP1 profile transmissions (which happens to includes every IBOC FM transmitter in my area). It is also somewhat limited in the Layer2 packet demultiplexing. It likely needs a strong signal in order to decode signals reasonably well. However it is just enough to get access to the main program stream.

HD Radio Sidebands Visible on the Spectrum
HD Radio Sidebands Visible on the Spectrum

A Tutorial on Using RTL-SDR with LabView: Creating a Simple FM Demodulator

LabView is a popular visual programming environment often used in industry and by engineers for test, automation and control applications. It is somewhat similar to GNU Radio in that programming is done by connecting a series of various blocks together, each of which performs some function. The RTL-SDR is compatible with LabView via a simple RTL-SDR interface.

Recently Albert Lederer wrote in to us and wanted to share his beginners guide to creating an broadcast FM demodulator with an RTL-SDR in LabView. The tutorial focuses only on demodulating the mono part of the broadcast FM signal structure and provides a fully functional LabeView project file. Albert describes the signal chain implemented below:

1. The signal is received from the rtl-sdr device as IQ data. This is converted to a complex signal and the phase is extraced.

2. The phase correction removes phase discontinuities.

3. The key demodulation component in the chain is the phase derivative. The phase derivative takes the phase of the signal and creates a second signal that is composed only of the changes in frequency. This is then the demodulated signal.

4. The low pass filter is used to filter out frequencies above 15kHz, which do not contain the desired information.

5. The rational resample takes the signal, which is still at the sampled rate (in the examples case 286650Hz) and resamples it to something the sound card can handle. In this case, we are using a decimation factor of 13, which results in a 22050Hz audio stream. Actually, I worked this out the other way around. I wanted a 22050Hz audio stream and checked which sample rate would give me an integer decimation while keeping the RF sampling rate as low as possible.

The LabView Broadcast FM Demodulator
The LabView Broadcast FM Demodulator

Decoding DAB with an RTL-SDR and SDR-J On an Odroid C2

The Odroid C2 is a $40 USD single board computer with a 1.5 GHz ARM-A53 quad core CPU and 2 GB of RAM. Compared to a Raspberry Pi 3 it is more powerful and costs almost the same. YouTube uploader radio innovation recently wrote into us and wanted to share his video showing SDR-J decoding DAB+ smoothly on his Odroid C2. It seems that SDR-J works perfectly and only uses a small amount of CPU.

DAB stands for Digital Audio Broadcast and is a replacement/alternative to standard broadcast FM stations. SDR-J is a software suite that includes a DAB decoder for the RTL-SDR. It is compatible with Windows, Linux and the Raspberry Pi (and evidently also the Odroid C2). Over on their website they also provide a ready to go Raspberry Pi 2 image, and they write that it should perform well on the Rpi2 platform as well.

We’ve also seen that there is a new variant of SDR-J for the Raspberry Pi (and potentially other similar devices) available on GitHub. This one has a nice touch screen friendly GUI, which should be useful for creating a cheap portable DAB device.

Alternative SDR-J Raspberry Pi GUI
New SDR-J Variant for the Raspberry Pi with nice GUI

Experimenting with Broadcast FM RDS (TMC, RT+) and SCA Audio

A typical broadcast FM station can sometimes contain “hidden” subcarriers embedded within the main signal. The subcarriers contain data or audio services.

An example of a data subcarrier hidden within broadcast FM is the “Traffic Message Channel” (TMC). The TMC contains traffic data, and is used on GPS devices that advertise as having live traffic capabilities. TMC data is encrypted so that it can be sold, but is very easily broken. Another data service is RDS-RT+ data which transmits song information, for radios that can display it.

An example of a voice subcarrier (SCA/ACS) might be niche radio stations, such as ethnic stations, elevator music, music for doctors offices etc. Usually a specialized radio is required to receive a SCA channel. In a previous post we showed how a user was able to receive SCA on Windows.

Over on his blog Gough Lui has been investigating the broadcast FM subcarriers in his home town of Sydney, Australia. In his post he looks at TMC, RDS-RT+ and SCA subcarriers and explains a bit about what they are and how they work. He also goes on to receive and decode the subcarriers with an RTL-SDR, gr-rds and GNU Radio. While Gough doesn’t bother to decrypt the TMC service, he can still see when an event occurs and what the even was. Without decryption he just doesn’t know where the location on the event is. For SCA he wrote a GNU Radio program to extract the audio subcarrier and was able to decode audio from a local Indian station for migrants.

SCA GNU Radio Decoder
SCA GNU Radio Decoder

Receiving DAB with a Raspberry Pi 3 and RTL-SDR

Over on his blog Michael Carden has produced a tutorial showing us how to use SDR-J on the Raspberry Pi 3 for receiving Digital Audio Broadcast (DAB) radio. DAB is a type of digital broadcast radio used in several countries outside of the USA for general broadcast radio programs. It usually provides clearer digital audio compared to FM broadcast.

His post starts from scratch, showing how to create a Raspberry Pi image file and configure the Pi, then shows how to install and use SDR-J.

SDR-J is also available for Windows and is compatible with the RTL-SDR and other radios such as the Airspy and SDRplay.

SDR-J Running on Windows.
SDR-J Running on Windows.