View on GitHub

Devendra's Log

Listening to FM radio using RTL-SDR

I am tinkering with an RTL-SDR dongle to listen to FM radio, on a MacBook Pro with OS X Yosemite, and a Windows 8.1 VM running on Parallels Desktop 10. There are several software options available. I’ll go into those that I tried, others that I didn’t, and one that is surprisingly good.


This is a multi-platform library available as open source. On Mac OS X, you can obtain it using homebrew

brew install librtlsdr

Here’s how you can use the rtl_fm sample available with the library, to record wide-band FM

rtl_fm -f 88700000 -M wbfm - | ffmpeg -f s16le -ar 17000 -ac 2 -i - wbfm.wav

I pipe the output of rtl_fm, which is in signed 16-bit little-endian PCM format, to ffmpeg to produce a WAV file. The WAV file can then be played using Audacity, or any music player of your choice.


SDR# is a Windows freeware that used to be open source in the past. It is fairly easy to listen to FM radio by following the SDR# FM radio tutorial from Adafruit. The quality of audio is not so good on a Windows VM.

I attempted to build an older open source version of SDR# using Xamarin Studio for Mac OS X. It fails to run because run-time dependencies such as libsndfile and portaudio, installed through homebrew, are 64-bit binaries. 64-bit build of mono 3.12.0 and libgdiplus (the latter depends on cairo installed through homebrew) from source also does not work due to crash in native code invoked by System.Windows.Forms.XplatUICarbon.CGDisplayBounds. Windows Forms on 64-bit Mono on Mac OS X is currently a no-go.

There’s HDSDR, another Windows freeware, that I haven’t tried. A Mac OS X port of gnuradio is something else I want to try, but it is only available through MacPorts. I don’t use MacPorts, and building gnuradio from source looks daunting due to the number of dependencies.

Radio Receiver Chrome App

Radio Receiver

The open source Radio Receiver App from a developer at Google, is probably the best way to listen to FM radio using RTL-SDR. The sound quality is awesome, and it’s mostly implemented in JavaScript! How cool is that!?