RTL-SDR Radio Scanner

RTL-SDR Radio Scanner

In this post I’ll be giving some background and install steps on RTL-SDR. SDR stands for software defined radio and has been in use since the 1970s. Traditional radio processing is handled by hardware components like oscillators, regulators, and mixers. SDR replaces these functions with digital computer processing. RTL-SDR is a device that was originally designed to receive digital television transmissions, namely DVB-T TV using the RTL2832U chipset. The device is typically contained in a USB dongle. The RTL2832U chipset was identified by developers as having an ability to process SDR well and subsequent tools have been developed to enable it for such a purpose. Coupling the SDR functions with decoding processes, this inexpensive device can recieve and decode digital radio transmissions using MultiMon-NG. Much of this post is based of the work provided here, https://oneguyoneblog.com/2016/08/10/decoding-p2000-raspberry-pi-rtl-sdr/shared=email&msg=fail

The first item needed with be the RTL2832U chipset dongle. You should be able to find them for sale online. A search on Amazon for “RTL2832U chipset” will show several options, most being under $20.

Next, we’ll need to install the RTL-SDR software on the computer. The source can be found at https://github.com/osmocom/rtl-sdr. Refer to this site for current install procedures. The following worked for my installation, but this may change, so check with the developer for current steps.

git clone https://github.com/osmocom/rtl-sdr
cd rtl-sdr
mkdir build
cd build
sudo make install

Now we are able to test that our system is able to receive radio signals. Use the “rtl_test” command to check that all is working as expected. Be sure the USB dongle is plugged in otherwise the “No supported devices found” message will appear. You should get this message back if all is working as expected.

Found 1 device(s):
  0:  Generic, RTL2832U, SN: XXXXXX...........

Using device 0: Generic RTL2832U
Detached kernel driver
Found Rafael Micro R820T tuner
Supported gain values (29): 0.0 0.9 1.4 2.7 3.7 7.7 8.7 12.5 14.4 15.7 16.6 19.7 20.7 22.9 25.4 28.0 29.7 32.8 33.8 36.4 37.2 38.6 40.2 42.1 43.4 43.9 44.5 48.0 49.6 
[R82XX] PLL not locked!
Sampling at 2048000 S/s.

Info: This tool will continuously read from the device, and report if
samples get lost. If you observe no further output, everything is fine.

Reading samples in async mode...

I pressed [Ctrl] + [X] to end the process, but the USB device was still active. If you enter in the rtl_test command again, you will get a “usb_claim_interface error” message. I have found that either unplugging the USB dongle or closing the terminal window to be effective in stopping this error. Pressing [Ctrl] + [C] ends the process and reattaches the kernel driver so there is no need to unplug the dongle or close the terminal window.

To tune the receiver and play audio back, I used the following command that pipe aplay to the rtl_fm command. I’m tuning to the local NOAA weather broadcast station KHB60 located on Cougar Mountain, near Issaquah WA. It’s listed as operating on 100 Watts at 162.55 Mhz Narrow FM, however I get better tuning at 162.541 Mhz. I used a filter width of 8.4 Khz

rtl_fm -M fm -f 162.541M -s 22k | play -t raw -r 22k -es -b 16 -c 1 -V1 -

Here is a command to tune to the same channel, but this time I’ll save the data received by the dongle instead.

rtl_fm -M fm -f 162.541M -s 22k "/home/local/Desktop/RTL-SDR/NOAA-KHB60.raw"
play -t raw -r 22k -es -b 16 -c 1 "/home/local/Desktop/RTL-SDR/NOAA-KHB60.raw"

Now I’ll clean up the audio with some SoX processing. I’ll filter off the upper frequencies and then apply or noise filter profile. Then I’ll wrap it up with another upper frequency filter.

sox -t raw -r 22k -es -b 16 -c 1 "/home/local/Desktop/RTL-SDR/NOAA-KHB60.raw" "/home/local/Desktop/RTL-SDR/NOAA-KHB60.wav" sinc -5k 
sox "/home/local/Desktop/RTL-SDR/NOAA-KHB60_NoiseProfile.wav" -n noiseprof "/home/local/Desktop/RTL-SDR/NOAA-KHB60_NoiseProfile.prof"
sox "/home/local/Desktop/RTL-SDR/NOAA-KHB60.wav" "/home/local/Desktop/RTL-SDR/NOAA-KHB60_NoiseFiltered.wav" noisered "/home/local/Desktop/RTL-SDR/NOAA-KHB60_NoiseProfile.prof" 0.075 sinc -2k 

This removed a significant amount of noise from the audio. You can see a stark contrast between the two in these spectrograms.

It is more common for radio transmissions to be momentary, versus constant in the NOAA sample above. During radio silence, there is background noise that is received. If we were to record these transmissions using the command from above, we would end up with a lot of noise. To eliminate this we’ll use a squelch function in rtl-sdr. This will removed background noise during radio silence and make listening less bothersome. Here is the command I used after some trial and error to capture RF transmissions with squelch

rtl_fm -M fm -f 167703400 -l 160 -s 22k - | play -r 22k -t raw -e s -b 16 -c 1 -V1 -
rtl_fm -M fm -f 167703400 -l 160 -s 22k "/home/local/Desktop/RTL-SDR/Ballard_Digital_Squelch_160.raw"
sox -t raw -r 22k -e s -b 16 -c 1 "/home/local/Desktop/RTL-SDR/Ballard_Digital_Squelch_160.raw" "/home/local/Desktop/RTL-SDR/Ballard_Digital_Squelch_160.wav" silence 1 0.2 0.5% -1 0.2 0.5% 

The first line uses RTL_FM to tune to a narrow FM channel at 167.7034 Mhz with a 22 Khz sample rate. The squelch level is set at 160 after some testings, this produced the best results. The raw results are piped to SoX that plays it at a 22 Khz rate with 16 bit resolution on a mono audio channel. SoX treats the data as signed-integer encoded. Lastly the verbosity of the output of the SoX command is set to failure messages only. The results are live listening of radio signal on the speaker.

The second line uses RTL_FM the same way, but this time saves the data to a raw file. Instead no verbosity is set and it works with the raw file and saves the output file as a wav file. There are gaps of silence in the audio when the squelch is active. I used the silence command to truncate the gaps of silence so I’m left for nothing but the actual transmissions.

Now to use RTL_FM as a channel scanner. This command will sweep through three frequencies and stop at a frequency that is actively transmitting. I’ll use SoX afterward to convert the data to a wav file and remove the silence.

rtl_fm -M fm -f 167703400 -f 167453900 -f 167702900 -l 200 -s 22k - | play -r 22k -t raw -e s -b 16 -c 1 -V1 -
rtl_fm -M fm -f 167703400 -f 167453900 -f 167702900 -l 200 -s 22k "/home/local/Desktop/RTL-SDR/Ballard_Scanner.raw"
sox -t raw -r 22k -e s -b 16 -c 1 "/home/local/Desktop/RTL-SDR/Ballard_Scanner.raw" "/home/local/Desktop/RTL-SDR/Ballard_Scanner.wav" silence 1 0.2 0.5% -1 0.2 0.5% 

These inexpensive radio receivers along with SDR give the public access to a resource that has historically been only available to the privileged. There are public services that are transmitted and these should be available to the public without the need to purchase expensive dedicated equipment. Using a small $20 USB radio receiver turns the tide in favor of the general population. I’m glad to see that this is available to young people and will inspire them to help all of us.

Comments are closed.