A cross platform Python frequency scanning GUI for USB TV dongles, using the OsmoSDR rtl-sdr library.

In other words a cheap, simple Spectrum Analyser.

The scanner attempts to overcome the tuner's frequency response by averaging scans from both the positive and negative frequency offsets of the baseband data.

Tested on:

Windows 7 (x86 and x64)

Ubuntu 12.04 (x86), 12.10 (x64), 13.04 (x64) and 14.04 (x64)

OS X Snow Leopard (10.6) and Mountain Lion (10.8)

Download

Download the installer or stand-alone Windows executables from GitHub.

Download the latest source from GitHub.

Installation

Installation instructions are here.

The following dependencies are needed:

Linux and Mac users will need to manually install these, Windows users can use the installer.

Manual

A basic manual is available in Portable Document Format.

Quick start

Run ' python -m rtlsdr_scanner '.

To start a scan simple enter the range at the bottom of the window and click 'Start', after a while a plot of signal strengths should be displayed.

'Dwell' controls how long each step is sampled for, longer times will result in more averaging of the signal.

'Continuous update' updates the display on each step. Caution only use this with small scans and low dwell times, otherwise it will become unresponsive.

'Grid' displays a grid on the scan plot.

Auto Calibration

Scans around the frequency specified for the strongest signal and then calculates the error correction of the dongle.

To get the best out of it you really need a continuous signal peak that stands out from the background noise. If you live near an airport RADAR signals are great for this. Mobile phone signals also work well but you need to know the channel frequencies, making it tricky. I have had some luck with commercial FM radio but you'll have to set the dwell time to the highest setting to get a usable offset.

Main Window

Start - Scan start frequency

Stop - Scan stop frequency

Mode - Sing or continuous scanning

Dwell - Sampling time spent on each step

FFT Size - FFT size, greater values result in higher analysis precision (with higher sizes dwell should be increased)

Live update - Update the display on each step (caution this can be slow and unpredictable)

Grid - Show a grid on the scan

Display - Change the plot type

File Menu

Open... - Open a saved scan

Save As... - Save a scan

Export... - Export a scan to a CSV file

Properties ... - Scan information

Edit Menu

Preferences - Set dongle gain, calibration, Local Oscillator (positive offset for upconverters) and sample bands (see below)

Scan Menu

Start - Start a scan

Stop - Stop the scan

Stop at end - Stop the scan when the current sweep is finished (only in continuous mode)

Tools Menu

Compare - Compare two previously saved scans

Auto Calibration - Perform a crude calibration of the dongle to a known signal (this should be a continuous, unwavering signal)

Tweaking

Dongles will differ depending on the tuner and circuit that's used, the software allows you to pick the best range that is sampled to give improved results.

Click on View -> Preferences and select the 'Band Offset' for you tuner, next detach the aerial or even better terminate it with a 50 ohm load. Now click refresh to show the noise floor of the tuner, adjust the offset so the marked bands overlay the flattest areas of the plot and click OK.

I find the following offsets work well (click the offsets for images):

Tuner Offset (kHz) Elonics E4000 250 Fitipower FC0012 140 Rafael Micro R820T 100

Note the large peak in the middle, this is at 0Hz (i.e. its the DC offset). On the R820T it is much narrower, this is because it uses an intermediate frequency away from the low frequencies. In this case the resulting spike is due to the sample length not being infinitely long (imagine taking a complete cycle of a sine wave then chopping the end off, this leaves it unbalanced and its average value is no longer 0, in other words it looks like it has a DC offset), the sample is windowed to reduce this but it's a trade-off between accuracy and frequency response.

Troubleshooting

Run 'rtlsdr_scan_diag.py', this tests if the correct modules are installed.