RTLSDR Scanner



Manual (EN) (FR)

Frequently Asked Questions

Screenshot 1

Screenshot 2

Screenshot 3

Screenshot 4

Screenshot 5

Screenshot 6

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 the installer or stand-alone Windows executables from GitHub.

Download the latest source from GitHub.


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.


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)


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.


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




Click to view comments

Al's picture


You can now use the 'Delta' button on the plot tool bar, it subtracts the first sweep from any subsequent ones.
To use it change the mode to single and perform a sweep with your noise source. The connect the device under test and click the arrow next to the start button and change it to 'continue'. Press the button and a sweep will be added, if the 'Delta' button is pressed (looks like a triangle) you'll now see the difference between the two sweeps.

Hope that helps.

Hi Al,
thanks for answer.
I'll try.
Very useful software!

Please can you clarify something for me, I use your software with command like this rtlsdr_scan.py -s 1240 -e 1480 -g 20.7 -P 67 test.rfs on 1 machine or 2 with (rtl_tcp -a IP_standbyhost -P -g 20.7 and rtlsdr_scan.py -s 1240 -e 1480 -r IP_standbyhost test.rfs), BUT that readings are always different from different command readings like this rtl_power -f 1240M:1480M:0.1M -g 50 -p 67 -e 24h test.csv, for arround 13 dB, which is HUGE. That means that in that range actually are not readings at all, maybe faulty readings. I run both command on same rtl card, also I will left link so that you can look about what I'm talking (2 filesdifferent commands rtl_power and yours). Know for sure that in that range operate something with hopping channel.

Al's picture

The difference is due to the way each application analyses the input signal; rtl_power uses a FFT which gives units in dB, but my software gives the spectral density in dB/Hz.
I used the more complex spectral density approach as it generates less noise and produces an output which is closer to the input as it overcomes some of the shortcomings of standard FFTs.

I was wondering how to start rtlsdr_scan command line version with GPSD enabled. I have tried to use gps.conf without any luck.
Is this possible?

Al's picture


Currently gpsd isn't supported via the CLI, you'll have to stop gpsd and edit gps.conf to point to the GPS serial port (assuming there is one).
I am considering adding it at some point in the future.


the RTLSDR Scanner works fine on my Ubuntu Linux machine. But when i want to use the CLI the rtl-sdr device is not recognized.

RTLSDR Scanner
Error: No devices found

rtl_test works fine, rtlsdr_scan_diag works fine, GUI works fine.

Any hint for me?


Al's picture


That's strange that it doesn't work in the CLI but the GUI does. Which version of Ubuntu are you using?

Do you have any level calibration data for NooElec NESDR XTR (E4000) and www.rtl-sdr.com (R820T)? It would be nice to know dB to dBuV mappings.

Al's picture

Sorry I don't have calibration data for that. I think you would be best borrowing a signal generator if possible, as I'd expect some variation between devices even of the same type.

fresh install ... ubuntu 4.04 ....

[email protected]:~/Downloads/RTLSDR-Scanner-master/src$ python ./rtlsdr_scan.py
RTLSDR Scanner

Found Rafael Micro R820T tuner
rtlsdr_demod_read_reg failed with -1
r82xx_read: i2c rd failed=-1 reg=00 len=5
r82xx_set_freq: failed=-1
rtlsdr_demod_read_reg failed with -1
rtlsdr_demod_read_reg failed with -1
Found Rafael Micro R820T tuner
rtlsdr_demod_read_reg failed with -1
[R82XX] PLL not locked!
rtlsdr_demod_read_reg failed with -1
rtlsdr_demod_read_reg failed with -1
Found Rafael Micro R820T tuner
[R82XX] PLL not locked!
Exact sample rate is: 2000000.052982 Hz
r82xx_read: i2c rd failed=-1 reg=00 len=5
r82xx_set_freq: failed=-1
rtlsdr_demod_read_reg failed with -1
Segmentation fault (core dumped)
[email protected]:~/Downloads/RTLSDR-Scanner-master/src$

On the same system with kernel driver blacklisted -- same for scanner --
Gqrx works fine ....

Al's picture

I'm still looking into this, unfortunately I can't get it to do the same on my setup.

Is PPM compensation real frequency minus frequency of SDR or frequency of SDR - real frequency?

If Kalibrate (Kal) says -30 PPM do I set calibration PPM in RTLSDR Scanner to -30?

Al's picture

Sorry I managed to miss your question.

I'm not sure how the value Kal gives represents the compensation, but with my program a positive value results in a higher tuning frequency.

Hope that helps.


Thanks for the tremendous work on this software. I'm having a hell of a time setting up the local oscillator offset. I have entered -125 MHz in the radio configuration tab as I am using an upconverter so that I can characterize some filters in the HF band. After setting up -125 MHz, when I attempt to scan say 10-20 MHz, I get an error, and I can see in the command line that the software is trying to set a starting frequency of 10 MHz instead of 135 MHz. Any thoughts or help would be greatly appreciated!



Al's picture

Hi Rob,

Thanks, it's always good to hear I'm doing something right!

Try setting the LO to the local oscillator frequency of 125MHz rather than the offset it results in (-125MHz), it isn't too clear. I'll try and make it a bit clearer in future versions and improve the range checking.

That did it, Al. Thanks for the advice!

Most complicated install software of the world.
Here nothing's simple.

Broadcast engineer in radio and television

Al's picture

You could try the stand alone releases instead which need no installation other than the RTLSDR driver, if you're on Windows.


i want to try your great program and use it in radiointerferences in radioastronomy. I've installed it but i get the next error when i try to execute it:
RTLSDR Scanner

Traceback (most recent call last):
File "./rtlsdr_scan.py", line 129, in
frame = FrameMain(APP_NAME)
File "/home/abelix/RTLSDR-Scanner-1.0.22298.18049/src/main_window.py", line 177, in __init__
File "/home/abelix/RTLSDR-Scanner-1.0.22298.18049/src/main_window.py", line 201, in __create_toolbars
File "/home/abelix/RTLSDR-Scanner-1.0.22298.18049/src/panels.py", line 101, in __init__
self.measureTable = PanelMeasure(self, settings)
File "/home/abelix/RTLSDR-Scanner-1.0.22298.18049/src/panels.py", line 799, in __init__
self.Bind(wxGrid.EVT_GRID_CELL_CHANGED, self.__on_cell_change)
AttributeError: 'module' object has no attribute 'EVT_GRID_CELL_CHANGED'
i ran rtlsdr_scan_diag.py with a good result (i think):

Tests for missing libraries

Testing for wxPython
Testing for Numpy
Testing for matplotlib
Testing for pySerial
Testing for pyrtlsdr
Testing for Pillow
No problems found

Using driver librtlsdr.so.0
any hint to solve the problem?

thank you very much for so good job

i've deleted the line 799 in panels.py and added the other two lines. Now is working fine

Al's picture


Sounds like you are running a slightly older version, I updated it last week to hopefully fix this error with other versions of wxPython.


Can you please clarify what GPS option do in rtlsdr_scan, trying to determine destination from strongest signal at some point of time???.
I don't have alone gps unit, but I manage to share GPS from smart phone. You have option in program to accept direct tcp/ip traffic or piping from tcp/ip to virtual serial port, and that works fine, but when I configure it like that, when trying to determine location from signal, I always get mobile phone GPS location, not signal/frequency location...


Al's picture


To find the signal location you'll have to move around the survey the area. Each sweep will record the location it was taken at, you can the go to 'File -> Export map...' and build a heap map based on the results (the more sweeps the better).

About ready to give up. I have used the installer to install the 32 bit version of RTLSDR SCANNER in the Program Files (x86) folder. Running rtl_test works fine and all seems to be OK, however running rtlsdr_scan.py yields the error message "No module named matplotlib". In fact running rtlsdr_scan_diag.py cannot find wxpython, matplotlib or Pillow. I have installed and uninstalled wxpython numerous times including removing everything from Python27 folder.

Any advice appreciated.

Al's picture


Have you tried the stand-alone version, you just need the RTLSDR driver (64 bit version) in your path?

Thanks for the suggestion. It was my fault. I have been confused by the proper installation for 32 and 64bit systems and got them mixed up a bit. I used the 64-bit runtime after installing the Osmo and Zadig drivers and it all works very nicely. many thanks for your reply and excellent help with the solution.

Al's picture

No problem, glad it works!

File -> export map option is grey option (disable), maybe it's depending on some module, or I'm doing something wrong???, 10 sweeps eats 1GB of ram, when I live on continuous mode for 5 min, don't know how many sweeps, scanner eats 2.2 GB of ram, which of course freeze my old laptop, can I scan in continuous mode in CLI, or do you have better tips to scan in continuous mode but that my hardware resource don't "suffer" that much.


Forget about export map, that was my fault!!!, but can you share your opinion about memory leakage on ubuntu 14.04, on win7 64 bit, same configuration with 7 sweeps eats 110 MB of ram, with 21% CPU which is great....


Al's picture

Glad it's working. I'll look into the memory problems and see what I can find, the only difference that I can think of is matplotlib is a really old version on Ubuntu.

update on mine topic before

With new OS arch with 6 sweeps (1 sweep runs around 3 minutes) python "eats" around 550-600MB, with GPS tracking, which is much better than old OS ubuntu 14.04 with lot's of apps and libraries on. It would be nice that someone share opinions with rasbery pi 2 model B, or any rasberry, can rtlsdr_scan runs under X with couple of sweeps!!!

My lap is 9 years old lenovo SL500 with 3GB ram and CPU T5870 @ 2.00GHz

Al's picture

I've run it on a Raspberry Pi B but I don't recommend it as it's very slow, I haven't heard from anyone running it on a RPi 2.

What is lowest frequency that I can scan with rtlsdr_scan....

I have spyverter wich I'm using with R820T under SDR# with new driver http://www.rtl-sdr.ru/page/novaja-modifikacija-sdr-rtls-sdr-drajvera, can we expect something similar on rtlsdr_scan....

Al's picture

The minimum frequency you can set is 0Hz.

If you are using a SpyVerter you can set the LO to 120MHz in Edit -> Radio Devices then scan your HF range (there is no need to account for the 120MHz offset when setting the range).

All works OK..
When exporting the results in cvs file, what is the format of timestamp? It says "Time (UTC)"...

Al's picture

It's the 'Unix Timestamp' which is the number of seconds since midnight on 1/1/1970.

For example, if you are using Excel this will convert it into the Excel date format (credit):



I refer to comment from Thomas,

Export maps, wrong dimensions location in Google Earth

version update 04/22/16, error is the same, what can I do to show correctly plotting on google earth.

Thanks, Robin.

Al's picture

Thanks, it should be fixed in the code I've just uploaded, the stand alone version will follow shortly...


Now is working, Thanks for that Al. When you open eport map, you have two square options Mesh and Heat map. Mesh plots correctly in google earth, but heat map plots 90° shifts up compare to mesh position!!!, presume that is bug....


Al's picture

Glad that bit works, sounds like I've mixed up longitude and latitude with the heat map!
I'll try and take a look at that soon.

Thanks for the feedback.

Al's picture

Hope I've got it this time!

The new code and a release are up on GitHub now.


On fresh installs of Windows 7 Home Premium and Windows 10 Home I couldn’t get the 20 September 2016 release of “rtlsdr_scan-windows-64bit.exe” to load until I installed “msvcr100.dll” into either the RTLSDR Scanner directory or the Windows\System32 directory. It doesn’t seem to matter which one. I didn’t experience this issue with Windows 7 Professional or Windows 10 Professional releases.

After I install Microsoft Visual C++ 2013 X64 and run Zadig_2.2, I find I need the following in the RTLSDR Scanner directory for your 64 Bit Stand Alone version to work:
msvcr100.dll (Windows 7 Home Premium and Windows 10 Home only)

Also, I’ve noticed that the 64 Bit Stand Alone versions take considerably longer to load on all three of my machines. Is this normal?

Thanks for this really great program.

Al's picture

Thank you.

If you follow the driver installation instructions then the RTLSDR files will be in your path and there is no need to copy them to the location of the application.  I'll add a link to the Github release page pointing to this.

It's probably better (an easier) to install the Microsoft Visual C++ Redistributable Package (x64) to get the msvcr100.dll file, I'll add this to the instructions as I didn't realise some Windows versions didn't include this.

The stand alone application takes longer to start up as it extracts files to a temporary directory first when you run it. It's quite normal an nothing to be concerned about.


Thank you for the timely reply.
I did a fresh install of Windows 7 Home Premium 64 bit, installed Microsoft Visual C++ 2013 X64, Zadig 2.2, sdrsharp-x86 v1.0.0.1489 and your 64 Bit Stand Alone version using the directory from above. When I scanned the C:\ drive I only found msvcr100.dll in the following locations:
C:\RTLSDR Scanner 64 Bit Stand Alone 20 Sep 2016-809 KB-Created Saturday, October 29, 2016, 6:06:58 PM
C:\sdrsharp-x86 v1.0.0.1450-755 KB Created Saturday, October 29, 2016, 6:06:58 PM

I also found a .dll file named msvcr100_clr0400.dll located in:
C:\Windows\System32-808 KB Created Thursday, March 18, 2010, 2:27:14 PM
C:\Windows\SysWOW64-753 KB Created Thursday, March 18, 2010, 1:16:28 PM
Unless I downloaded the wrong Microsoft Visual C++ 2013 X64 package, it doesn’t look like Microsoft Visual C++ 2013 X64 installs msvcr100.dll?

I tried swapping the msvcr100.dll file from SDR# directory, but it wouldn’t work with your 64 Bit Stand Alone version, probably because it’s a 32 bit version of msvcr100.dll?

Al's picture

Thanks for the update.

Did you download the redistributable from the link, this should be the 2010 and not the 2013 version? It looks like I found an old link for this, there is a newer version available.

You are correct in thinking that the 32 bit version is incompatible with the 64 bit one.


Yes, the first version I tried was v1.0.22298.18049 and I used the link to get the Visual C++ Redistributable Package. That link was labeled; “The stand alone version requires the Visual C++ Redistributable Packages for Visual Studio 2013 x64”. Since all the subsequent releases pointed to that same link I’ve just kept using the 2013 version for fresh installs.

I did notice that the latest version (v1.0.22497.10311) in addition to linking to Visual Studio 2013 x64 also has a link to “Some Windows versions may also require the Visual C++ Redistributable Packages for Visual Studio 2010 (x64).” I’ve not tried that one, so maybe it installs the required 64 bit msvcr100.dll?

Al's picture


Yes, install the 2010 version to get the required DLL.

I really like this software, and I would like to use it for radio astronomy.
Unfortunately, it seems the current version can't be configured to continuously save the results in text (or *.csv) file.
Exporting scan to *.csv file looks like to be limited to 500 scans only.

Could you point me to the way to configure the permanent, unlimited scan recording?
Thank you in advance!


Click to add a comment