RTL-SDR FM Receiver: Difference between revisions

From GNU Radio
Jump to navigation Jump to search
Line 101: Line 101:


[[File:RTL_SDR_FM_final_output.png]]
[[File:RTL_SDR_FM_final_output.png]]
When you run your flowgraph if you get a string of “aUaUaU” and the audio comes in and out periodically then you have probably entered a sample rate wrong somewhere along the way. Double check all of the sample rate values and interpolation and decimation rate changes.
[[File:RTL_SDR_FM_sample_rate_overflows.png]]

Revision as of 16:30, 18 May 2024

RTL-SDR Based FM Receiver

This tutorial describes how to receive broadcast commercial radio stations transmitting Frequency Modulated (FM) signals using the RTL-SDR receiver. The following hardware is needed for this tutorial:

  • RTL-SDR Receiver
  • VHF Antenna

Please connect the antenna to the RTL-SDR, and plug the RTL-SDR into the USB port on your computer.

Configure the RTL-SDR

Add the Soapy RTLSDR Source block to the flowgraph. Soapy [1] is a SDR support library which interfaces with different SDR hardware.

RTL SDR FM add rtlsdr block.png


The receiver needs to be configured with a proper sampling rate, center frequency and gain value. The RTL-SDR supports multiple sampling rates but in this tutorial the maximum sampling rate of 2.048 MHz is chosen. Update the samp_rate variable with the value 2048000:

RTL SDR FM set samp rate.png


RTL-SDR source block still has an undefined freq. The freq variable needs to be given a frequency associated with a radio station. This tutorial uses the frequency allocations within the United State of America, therefore you will need to modify them according to the allocation for your country. Within the USA, the smallest frequency of a radio station is 87.9 MHz and the largest frequency is 107.9 MHz [2], and each channel is separated by 200 kHz.

Add the QT GUI Range block into the flowgraph. The properties need to be changed in order to incorporate the frequency allocations for broadcast FM.

Open the properties and give it the name freq and the start frequency of 87.9 MHz, the stop frequency of 107.9 MHz and a step of 200 kHz:

RTL SDR FM qt gui range properties.png


The freq variable within the Soapy RTLSDR Source block is now defined. The flowgraph should look like the following:

RTL SDR FM flowgraph with qt gui range.png


Open the Soapy RTLSDR Source block properties. Navigate to the RF Options and enter True for AGC.

RTL SDR FM set AGC.png

Add Time & Frequency Plots

Drag in a QT GUI Time Sink and QT GUI Frequency Sink. Enable the auto-scaling in the QT GUI Time Sink block:

RTL SDR FM time sink autoscale.png


Open the QT GUI Frequency Sink and enter freq as the Center Frequency (Hz):

RTL SDR FM freq sink center freq.png


Connect the QT GUI Time Sink and QT GUI Freq Sink blocks:

RTL SDR FM basic scanner flowgraph.png


Run the flowgraph. A time plot and frequency plot will be displayed. This simple flowgraph represents a basic tuner application, such that dragging the slider bar or entering a frequency manually will retune the RTL-SDR and start producing sampled data.

RTL SDR FM basic scanner plots.png

FM Demodulator

An Audio Sink block is needed to play the sound of a demodulated FM radio station. Drag in an Audio Sink block and open the properties. Notice there are a couple choices for sampling rates to choose from. Select 48 kHz:

RTL SDR FM audio sink properties.png


The question is how to get from the output of the RTL-SDR which is complex IQ sampled at 2.048 MHz to the input of the Audio Sink block which requires real samples at a sampling rate of 48 kHz? The rest of this tutorial will work backwards from the Audio Sink and establishing blocks and connections towards the output of the RTL-SDR.

RTL SDR FM audio sink properties.png

The next block that is needed is the an FM demodulator. Drag in the WBFM Receive block, which takes complex IQ as an input, demodulates the FM thereby producing real output samples and also performs a decimation.

RTL SDR FM add wbfm receive.png


Recall from earlier in the tutorial that FM broadcast channels allocated 200 kHz, therefore we want to process as much of that bandwidth as possible with the FM demodulator. The WBFM Receive block can perform a decimation from a larger input sampling rate to the required Audio Sink input of 48 kHz. The decimation factor must be an integer, and 4*48 kHz = 192 kHz which is close to the total bandwidth of the frequency allocation.

Open the WBFM Receive properties and enter in the quadrature rate of 192 kHz and an audio decimation of 4. Note that the quadrature rate must be evenly divisible by the audio decimation factor, and that the audio decimation must be an integer.

RTL SDR FM wbfm receive properties.png


The flowgraph should now look like the following:

RTL SDR FM flowgraph with WBFM.png


A sample rate change is needed to convert from the RTL-SDR output of 2.048 MHz to the WBFM input of 192 kHz. The required sampling rate change can be simplified as 192000/2048000 = 192/2048 = 3/32, a rational ratio. Therefore the Rational Resampler block can be used to implement the sample rate change.

Drag in the Rational Resampler block and open the properties. Enter 3 for the interpolation and 32 for the decimation:

RTL SDR FM rational resampler properties.png


The flowgraph is now complete and should look like the following.

RTL SDR FM complete flowgraph.png


Run the flowgraph. The same GUI window that was displayed previously will appear but now audio should be playing through your computer. You can drag the bar at the top of the screen to tune to different channels.

RTL SDR FM final output.png


When you run your flowgraph if you get a string of “aUaUaU” and the audio comes in and out periodically then you have probably entered a sample rate wrong somewhere along the way. Double check all of the sample rate values and interpolation and decimation rate changes.

RTL SDR FM sample rate overflows.png