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

I'll certainly take a look into a method of continuously exporting data to a CSV file as it is currently unavailable.

At the moment, as you have found, the only option is to export the current set of sweeps which is limited to 500.

Al's picture

Hi again,
I've just added a continuous export feature.

To use this select it from the file menu before you start scanning, when a sweep is completed the data will be written out to this file.
To turn it off click on the menu item again.

Hope that helps.

Yes, this will help a lot, thank you - now this app can be used for scan logs over longer periods of time.
Thank you!

Hi Al,
Again, excellent software, works without problems on w7, and recent feature is just what I needed for Radioastronomy application.
However, I have a problem with XP installation - at the end, it says setup was completed successfully. but when I click Next, the message is:
RTLSDR Scanner download failed: SendRequest Error
How can this be sorted out?

Just to mention more details, I did run Zadig_XP 2.2 and installed WinUSB (v6.1.7600.16385) driver.
However, rtlsdr_scan_diag,py keeps returning "rtldriver not found in path" error, with recommendation to download from osmocom website... where I can't find download link for something like that.
A fiend did compile for me the latest source on 32-bit machine (W7) and that standalone executable works as it should.

Thank you in advance!

Al's picture

Hi Bojan,

The problem lies with XP, when the installer tries to download the software from GitHub it fails as XP does not support the newer secure transfer protocols.

Unfortunately there is no fix for this as Microsoft no longer updates Windows XP.

Your options are to use a more recent version of Windows, or manually install it.  I no longer have access to Windows XP so unfortunately I can't add a stand-alone version for you.

Hi Al,
Thank you for the reply.
Interesting, I have it running on XP couple of months ago on my desktop (I had to replace it due to motherboard issue), there were no problems with installation, so something must have been changed in the meantime.
Could you please tell me more about manual installation ? (Zadig_XP_2.2).
Unfortunately it is not easy for me upgrade windows at the moment.

Would this link be the one with right information:

Thank you in advance!

Hi Al. my applogies for all those questions...
I downloaded RTLSDR-Scanner-master.zip from Git.
What should I do with it, where to place subdirectory called RTLSDR-Scanner?

I repeated the manual procedure as described on webpage (no errors apparently), test utility finds tuner and even communicates (reads data... no display, however, there is only message "reading samples in async mode... lost at least 124 bytes.),

In the CMD window, when I run standalone app, at the end it says:
Attribute error function 'CancelloEx' not found rtlsdr_scan returned -1
And that's it.

The older standalone 32-bit version (from 01/25/16) works OK.

Al's picture


It sounds like you have the driver working properly so there is no need to play with Zadig.

The error 'CancelioEx' not found rtlsdr_scan returned -1' is because one of the Python libraries requires this function but it is not found on Windows XP.

You might be able to get it working by uninstalling PySerial and installing this version.  If that doesn't help you could try an old version of Python 2.7.x.

The main problem is that Windows XP is way beyond it's life and is not supported by vast majority of software used by this application.  I highly recommend you switch to a newer version!


Hi Al,
Still no joy..

Diagnostic reports there it can't find pyrtlsdr (but I did install it? there are many versions to download on github.com/roger-/pyrtlsdr.. which one is right?) and Pillow.. it says I need to install libraries for python 2.7, which I did (I think i did...)

Al's picture


Try the command:

python -m pip install pyrtlsdr

I've updated the manual installation instructions as most of the libraries now support 'pip'.

As you were getting an error about a missing function ignore uninstall PySerial and then install an older version:

python -m pip uninstall pyserial

python -m pip install pyserial==2.7

Hi Al,
Thank you for your help and effort, but.. I can't make the latest release work on this lap with XP (the last exe you posted works without problems, but subsequent versions with installer have problems).
I think I'll give up... and install second HD with W'7 on my lap, as optional boot.
Happy New Year!

Al's picture


Sorry for the delay, I've been busy changing the way the software distributed and installed.
There's an updated setup which now installs on XP, I recommend you uninstall Python and wxPython from the 'Add/Remove Programs' section in the Windows control panel first.

Fingers crossed!

Hello there,

I am currently trying to run your program for usage with wireless microphones.

while it worked perfectly with my Custom build graphics PC running Windows 10 Pro, i cant quite make it work on my Lenovo tablet PC running Windows 10 home. both times i installed it using the 32bit installer exe, using the zadig Driver Program the same way. any suggestions?

Al's picture


What happens when you run the rtl_test utility at a command prompt?

Hi Al,
Currently, rtl-sdr scanner displays the measurement result in voltage (db/sqrt(Hz))
Would it be possible to change this to power [dBm/Hz]?
Thanks in advance!

One more detail:
In pull-down menu "File->Properties", for measurements I am doing now (settings are: dwell=0.131s, FFTsize =16), I am getting for RBW=250kHz.
On display there are couple of carriers sitting at leve, say l = -10dB/SQRT(Hz).
They are not the noise, so power level of those peaks calculated from RBW will not be correct...

Al's picture

The RBW is used to give an indication of the minimum signal frequency resolution based on width of the frequency bins used for the FFT. Levels are not calculated based on the RBW.

Al's picture

Hi Bojan,
The level seen by the dongle is proportional to power but due to the design of these USB sticks it is not referenced to a specific level, hence dB rather than dBm.

OK, thanks for clarification.
I plan to use the siggen to determine the correction factor and apply this later to recorded levels in csv

Al's picture

Glad to help.

It will be interesting to see what you find out regarding the signal level correction. I have seen some AGC-like behaviour in my R820T dongles but I've not had change to properly investigate this.

Hi Al,
I played with dongle calibration, using Siggen (modulated with UMTS downlink, BW=3.85MHz) and Agilent SA (N1966A).
I have couple of comments:
- Gain setting of the dongle affects the displayed level accordingly, which means the displayed result is for the level at ADC input, and not the level at dongle input.
- FFT size setting affects the RBW value displayed on "properties", but it doesn't change the displayed level, which means it is not the same thing as RBW of the spectrum analyzer (it is more like VBW).
- The change of input level by 10dB changes the displayed level by the same amount, which means the displayed result is proportional to power level at ADC input.
- Saturation of displayed signal occurs at displayed level a bit below -5dB.
Taken all above into account, my RTL dongle has correction factor -16.28dB (at 920MHz).
So, when displayed peak level value is corrected for bandwidth and previously mentioned correction factor (-16.28dB), I am getting pretty accurate power level reading for WCMA signal (or WB noise).
However, CW signals scale doesn't seem to be treated the same way (FFT issue?), so calibration factor for those will be different.
Also, I noticed a 2-3 dB drop of noise floor close to signal (AGC-like?) but otherwise the displayed level value is consistent with attenuator setting... which means RTL dongle and your app is very useful as simple spectrum analyser.
Cheers, Bojan

Al's picture

Thanks for replying with your findings.

- I'd expect the level at the dongle input to remain constant with your input, the various gain blocks are found after this in both the tuner and the RTL2832U (which contains the ADC).

- The RBW of a digital spectrum analyser differs from an analogue one; in analogue ones it relates to the IF filter width whereas in the digital world it is based on the FFT bin size, National instruments have a brief white paper on this subject.

- I haven't been able to find and specs on linearity but I'd expect it to be quite reasonable, any errors introduced by the FFT should be very small.

- I'm a bit surprised clipping occurred at -5dB, what gain was this tested at?

It sounds like I better add a calibration setting to the software, I think I'll add it to the 'Radio Devices' dialog in the 'Edit' menu.  Stay tuned (pun intended)!

The software calculates the power spectral density (using Welch’s average periodogram method) of the input signal rather than the raw FFT, this results in an average level of the signal being displayed. Reducing the dwell will reduce this but also increases the chance that a non-continuous signal will be missed, I consider this an acceptable trade-off.

The 2-3dB drop could also be attributed to the PSD but I've also got a feeling that the driver doesn't turn off all the AGCs in the signal path with R820T tuners, but I could do with having a proper look at the code to be sure.


Yes, calibration may be very useful feature, especially because dongle itself has a number of internal spurious responses, the most prominent is harmonic of 28.8MHz clock.

Perhaps, it would be good to do couple of scans with dummy load, average and store store them and then subtract them from measurement data.

As for saturation. it is occurring at any gain setting - the display simply doesn't show much above -5~ 0dB... only below -5dB it follows the input level (dB for dB), that is why I concluded the osmocom lib takes into account only ADC value, and nothing else which is between antenna input and ADC.

I noticed another possible issue - the gain setting is not saved in rfs file.

Al's picture

I decided that the offset is per device and not per scan, therefore it is saved in the device configuration and not the scan file.

Al's picture

I have though about calibration, but as you can change the frequency range in subsequent scans it could cause confusion for some users.

On the plot toolbar you can display the delta from the first sweep which may be of some use:
- Perform a single sweep with the input terminated.
- Change the 'Start' button to 'Continue' by clicking on the down arrow and perform your scan.
- Click the delta icon on the toolbar under the plot, this displays the delta between the initial and all subsequent sweeps.

After a few years using RTLSDR on OSX 10.9 i have installed RTLSDR on a fresh OSX 10.12.
everything works fine, but the folder structure is now different, an i can´t locate the RTLSDR folder to update the source...


Al's picture

The software is now distributed as a Python package, to find the location execute this command

pip show rtlsdr-scanner

It will be in the 'rtlsdr_scanner' sub-directory.

Your software is really very nice, There are some important things missing.
The scale must also to be uV/m
The scale must be able to fix better. Min, Max, ecc.
If you are scanning 500Mhz, For a while you see the progress, then it locks, then appears finished.
There would be parameters to make the 1/2Ghz scanning faster

Al's picture

Thanks very much Giorgio, glad you like it.

I've used a relative rather than absolute scale as the gain of the dongles can vary by a large amount and I don't want to lull users into a false sense of security by using any sort of absolute units.
You can set a gain offset in Edit->Radio Devices if you have access to a signal generator to provide a known reference.  Likewise the input impedance varies so you'd have to measure that as well to calculate the voltage.

I agree that setting scale limits needs to be improved, at the moment you have to turn off auto-ranging on the toolbar and zoom the axis accordingly.  I'll try and make this the next addition to the software (maybe a right-click on the button for more options...).

Enabling 'real time' plotting on the toolbar will always be slow unfortunately.  I use the matplotlib library which produces great looking plots but it wasn't the best choice for fast plotting; it's aimed more at producing documentation-quality graphs. 
For this reason there is also a 'Preview' display which is much faster (select it from the list at the bottom right of the window).  You can also right-click on the graph and select 'Limit points' (the limit can be changed in the settings).

One final option is to reduce the dwell time, but shorter dwell times reduce the chance of detecting non-continuous signals.

Hope that helps.


Previous versions of the RTLSDR Scanner supported heatmapping (RF signal strength and location information) and displaying the results on Google Earth. I don't see heatmapping in the current version. Can that feature be re enabled?

Al's picture


You can find this option by selecting 'File -> Export Map', when you've selected the options you require click 'OK' and select 'Google Earth' as the filetype (this should be the default).

Hope that helps.

I have tried the 32 bit and the 64 bit versions. The GPS signal is good. But the "Export Map" selection is greyed out. ???


I'd like to use RTLSDR-Scanner to create a heatmap of signal levels on shortwave frequencies.

Ideally I'd like to be able to use a RTL SDR V3 dongle which incorporates a 820 T2 tuner (which is fine) and also has a direct sampling function for the Short Wave bands already built in.

So ideally I'd like to be able to select direct sampling by having an option to enable the normally unused Q input on the RTL2832U chip rather than the I input which is fed from the 820 T2 tuner.

Alternatively, I may be able to run SDR# in the direct sampling mode and drive this from RTLSDR Scanner using the SDRSharp Net Remote plugin. However I have installed the plugin and have verified that it is working by means of telnet, but RTLSDR Scanner doesn't seem to connect to it. Do I need to configure RTLSDR Scanner in some other way in addition to ticking the 'tune sdr #' box in the preferences menu ?


Martin - G8JNJ

Al's picture

Hello Martin,

The software uses both the I and Q phases (a complex signal) to analyse the spectrum, a real signal (just I or Q) has insufficient information in it for the power spectral density conversion which it uses.
For HF bands you'll have to use an up-convertor otherwise you are limited to the 24MHz lower limit of the R820T2.

The software is a bit limited with the remote plugin; it just allows you to tune SDR# to a frequency of interest for further live analysis and demodulation. I added this as a few users requested this as the scanner does not have this functionality.

Hi Al,

OK thanks for the reply and additional information.

I'll use an external upconvertor.


Martin - G8JNJ

Hi Al,

I have looked though the, user guide, comments and FAQ and I can't seem to find the answer to this question.

The smallest scan range is 1MHz wide.

How do I select a smaller bandwidth to measure and log & plot a heatmap of signals just contained between two limits ? e.g. 153.2 to 153.25MHz

I have tied entering upper and lower limits in the measurement box but as soon as I enter the second parameter the first is cleared out.

I have also tried zooming to display just the wanted signal but it seems like other stronger signals contained within the 1Mhz scan range are still being logged.

What am I doing wrong ?


Martin - G8JNJ

Al's picture

The minimum sweep is 1MHz, this is due to the software using part of the spectrum to get a flatter response, please refer to yesterdays email I sent you.

For your scan use a frequency range of 1MHz, perform a scan then when you export the map you can set a centre frequency and bandwidth (both in kHz) - click update to see the changes in the map.

Hi Al,

Ah OK, that's even better :-)

I couldn't find this information in the Manual or FAQ.

Have I been looking in the wrong place ?


Martin - G8JNJ

Al's picture

No, I haven't had chance to add this to the documentation. There are tooltips on each control so I hoped this would be fairly self-explanatory.

Hi Al,

OK thanks again for the reply.

I'm making some progress and have now got most of my kit working.

However I've got a couple more questions :-(

In order to be able to export a map my understanding is that before I can do this I have to have selected 'Track in Google Earth' . If I use the 'Track in Google maps' option instead I will not be able to export a map. Is this correct ?

In order to be able to load up a map I understand that (at least initially) I'll need to have an internet connection.

My intention is to drive around whilst collecting data, and I can't rely upon having a permanent internet connection as cell phone coverage is very poor in the area I wish to map.

Is there some way I can track and plot a heat map without requiring an always-on internet connection to do this ?


Martin - G8JNJ

Al's picture

Hi Martin,

You don't need to enable the track option to create maps, this just allows you to see your current position in Google Earth.

When you start a scan with GPS enabled each sweep is tagged with the last reported location, both the sweeps and locations are saved in the '.rfs' file so you can generate a map later on when you have internet access. The map can only be generated when you have completed the scanning.
You could stop a scan, generate your map and the continue the scan by clicking the arrow on the right of the start button and using the 'Continue' mode which appends new sweeps to the existing ones.

Hi Al,

Unfortunately despite a lot of trying - I still can't get the heat map to plot correctly.

However as an alternative method I find that Excel has a heat map option.

In order to be able to use this I need to be able to generate a CSV file (or similar) that includes for each scan the position in latitude and longitude along with the level measured at that location.

I can't figure out how to do this as the export CSV option doesn't seem to include the lat and long data for each measurement.

Would it be possible to add an option to the existing export map function to export a CSV file as an alternative to the KMZ file type.


Martin - G8JNJ

Al's picture

I can certainly look into that, but I don't have Excel to try it out. I'm assuming that the file requires columns of latitude, longitude and strength?

Hi Al,

A standard CSV format file would be fine.

Basically the same information that would be conveyed in the export map function, except that instead of producing the graphic map overlay information the following detail would be saved as one line of a CSV file per scan.

Date, Time, Frequency, Bandwidth, Latitude, Longitude and Signal level for each scan result.

The frequency and bandwidth data is as specified in the export map setting fields so that it's possible to export several files with different center frequencies and bandwidth settings. Then at a later time it would be possible to extract the separate sets of frequencies and produce separate overlaid heat maps showing the 'background' signal level and that of a specific (separate) signals contained within the scan.

This is useful when plotting interference as it then makes it possible to setup a baseline map with the normal noise floor on an adjacent frequency, and then overlay the interfering signal so that you can see the delta's.

I hope this makes sense.


Martin - G8JNJ

It looks really a nice article to me and I am thinking to share it with my dad after my new york to niagara falls


Click to add a comment