Download as pdf or txt
Download as pdf or txt
You are on page 1of 180

Communications Toolbox™ Support Package

for RTL-SDR Radio


User's Guide

R2023a
How to Contact MathWorks

Latest news: www.mathworks.com

Sales and services: www.mathworks.com/sales_and_services

User community: www.mathworks.com/matlabcentral

Technical support: www.mathworks.com/support/contact_us

Phone: 508-647-7000

The MathWorks, Inc.


1 Apple Hill Drive
Natick, MA 01760-2098
Communications Toolbox™ Support Package for RTL-SDR Radio User's Guide
© COPYRIGHT 2014–2023 by The MathWorks, Inc.
The software described in this document is furnished under a license agreement. The software may be used or copied
only under the terms of the license agreement. No part of this manual may be photocopied or reproduced in any form
without prior written consent from The MathWorks, Inc.
FEDERAL ACQUISITION: This provision applies to all acquisitions of the Program and Documentation by, for, or through
the federal government of the United States. By accepting delivery of the Program or Documentation, the government
hereby agrees that this software or documentation qualifies as commercial computer software or commercial computer
software documentation as such terms are used or defined in FAR 12.212, DFARS Part 227.72, and DFARS 252.227-7014.
Accordingly, the terms and conditions of this Agreement and only those rights specified in this Agreement, shall pertain
to and govern the use, modification, reproduction, release, performance, display, and disclosure of the Program and
Documentation by the federal government (or other entity acquiring for or through the federal government) and shall
supersede any conflicting contractual terms or conditions. If this License fails to meet the government's needs or is
inconsistent in any respect with federal procurement law, the government agrees to return the Program and
Documentation, unused, to The MathWorks, Inc.
Trademarks
MATLAB and Simulink are registered trademarks of The MathWorks, Inc. See
www.mathworks.com/trademarks for a list of additional trademarks. Other product or brand names may be
trademarks or registered trademarks of their respective holders.
Patents
MathWorks products are protected by one or more U.S. patents. Please see www.mathworks.com/patents for
more information.
Revision History
September 2014 Online only Revised for Version 14.2.0 (R2014b)
March 2015 Online only Revised for Version 15.1.0 (R2015a)
September 2015 Online only Revised for Version 15.2.0 (R2015b)
March 2016 Online only Revised for Version 16.1.0 (R2016a)
September 2016 Online only Revised for Version 16.2.0 (R2016b)
March 2017 Online only Revised for Version 17.1.0 (R2017a)
May 2017 Online only Rereleased for Version 17.1.1 (R2017a)
September 2017 Online only Revised for Version 17.2.0 (R2017b)
March 2018 Online only Revised for Version 18.1.0 (R2018a)
September 2018 Online only Revised for Version 18.2.0 (R2018b)
March 2019 Online only Revised for Version 19.1.0 (R2019a)
September 2019 Online only Revised for Version 19.2.0 (R2019b)
March 2020 Online only Revised for Version 20.1.0 (R2020a)
September 2020 Online only Revised for Version 20.2.0 (R2020b)
March 2021 Online only Revised for Version 21.1.0 (R2021a)
September 2021 Online only Revised for Version 21.2.0 (R2021b)
March 2022 Online only Revised for Version 22.1.0 (R2022a)
September 2022 Online only Revised for Version 22.2.0 (R2022b)
March 2023 Online only Revised for Version 23.1.0 (R2023a)
Contents

Getting Started with Communications Toolbox Support


Package for RTL-SDR Radio
1
What To Do After Installation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1-2

Supported Hardware and Required Software . . . . . . . . . . . . . . . . . . . . . . . 1-3


Supported Hardware . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1-3
Required Software . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1-3
Recommended Software . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1-3
Support Package . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1-3

Install Support Package for RTL-SDR Radio . . . . . . . . . . . . . . . . . . . . . . . . 1-4

RTL-SDR Support Package Hardware Setup . . . . . . . . . . . . . . . . . . . . . . . . 1-5


Install USB Driver (Windows) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1-5
Install USB Driver (Linux) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1-6
Install USB Driver (Mac) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1-6
Verify Hardware Setup . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1-7

Configure Multiple RTL-SDR Radios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1-9

Common Problems and Fixes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1-11


sdrinfo returns empty message after calling step . . . . . . . . . . . . . . . . . . 1-11
sdrinfo returns only three radio settings . . . . . . . . . . . . . . . . . . . . . . . . . 1-11
sdrinfo returns radio ID as “vm” . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1-12
Cannot find radio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1-12
Simulink hangs when radio is removed during simulation . . . . . . . . . . . . 1-12
Kernel driver is active, or device is claimed by second instance of librtlsdr
..................................................... 1-12
Package Manager in Use . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1-13
Setup Warns "Xcode not Found" or "Xcode Command Line Tools not Found"
..................................................... 1-14
No Radios Found . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1-15
Invalid MEX-file error . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1-15
Test connection fails and displays 'Error Code -12' message . . . . . . . . . . 1-16

Uninstall Support Packages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1-17

iii
Radio Management
2
Check Radio Connection . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2-2
Block Connection to RTL-SDR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2-2
System Object Connection to RTL-SDR . . . . . . . . . . . . . . . . . . . . . . . . . . . 2-2

Query Radio Address . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2-4


Block Radio Address . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2-4
System Object Radio Address . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2-4

Set Radio Sample Times . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2-6


Block Radio Sample Times . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2-6
System Object Sample Times . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2-6

Real-Time Operation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2-8


Block Lost Samples and Latency Outputs . . . . . . . . . . . . . . . . . . . . . . . . . 2-8
System Object Lost Samples and Latency Outputs . . . . . . . . . . . . . . . . . . 2-8

Use Multiple Radios Attached to Host Computer . . . . . . . . . . . . . . . . . . . . 2-9


Assignment of USB Port Addresses . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2-9
Multiple Radio Blocks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2-10
Multiple Radio System Objects . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2-10

Desired Versus Actual Parameter Values . . . . . . . . . . . . . . . . . . . . . . . . . . 2-12


Desired Versus Actual Value in Receiver Block . . . . . . . . . . . . . . . . . . . . 2-12
Desired Versus Actual Value in Receiver System Object . . . . . . . . . . . . . 2-12

Supported Data Types . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2-13

Performance Optimization
3
Model Performance Optimization . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3-2
Acceleration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3-2
Model Tuning . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3-2
Simulink Code Generation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3-2

MATLAB Performance Optimization . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3-4


Code Profiling . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3-4
Vector-Based Processing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3-4
MATLAB Code Generation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3-4

General Host Operations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3-7

iv Contents
RTL-SDR Deployment on External Hardware
4
Signal Monitoring and Parameter Tuning . . . . . . . . . . . . . . . . . . . . . . . . . . 4-2
Configure Model . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4-2
Signal Monitoring and Parameter Tuning . . . . . . . . . . . . . . . . . . . . . . . . . 4-3

Run Model as Standalone Application . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4-5


Configure Model . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4-5
Build and Deploy Model . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4-6
Run and Stop Model on Target Hardware . . . . . . . . . . . . . . . . . . . . . . . . . 4-7

Blocks
5

System Objects
6

Functions
7

Examples
8
Airplane Tracking Using ADS-B Signals . . . . . . . . . . . . . . . . . . . . . . . . . . . 8-2

Ship Tracking Using AIS Signals . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8-10

Automatic Meter Reading . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8-17

FM Broadcast Receiver . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8-23

Frequency Offset Calibration for Receivers . . . . . . . . . . . . . . . . . . . . . . . . 8-27

FRS/GMRS Walkie-Talkie Receiver . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8-31

RDS/RBDS and RadioText Plus (RT+) FM Receiver . . . . . . . . . . . . . . . . . 8-36

Airplane Tracking Using ADS-B Signals with Raspberry Pi and RTL-SDR


......................................................... 8-46

Airplane Tracking Using ADS-B Signals in Simulink . . . . . . . . . . . . . . . . 8-52

v
Automatic Meter Reading in Simulink . . . . . . . . . . . . . . . . . . . . . . . . . . . 8-58

FM Reception with RTL-SDR Radio on Raspberry Pi Hardware with


Simulink . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8-62

FM Broadcast Receiver in Simulink . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8-66

Frequency Offset Calibration for Receivers in Simulink . . . . . . . . . . . . . 8-69

FRS/GMRS Receiver in Simulink . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8-74

RDS/RBDS and RadioText Plus (RT+) FM Receiver in Simulink . . . . . . . 8-79

Spectrum Analysis of Signals . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8-89

Spectrum Analysis of Signals in Simulink . . . . . . . . . . . . . . . . . . . . . . . . . 8-92

vi Contents
1

Getting Started with Communications


Toolbox Support Package for RTL-SDR
Radio
1 Getting Started with Communications Toolbox Support Package for RTL-SDR Radio

What To Do After Installation


After you have successfully installed the support package, you can do any of the following:

• Explore and experiment with the Support Package for RTL-SDR Radio Featured Examples.

• Examine radio waves in your vicinity using “Spectrum Analysis of Signals” on page 8-89.
• Track airplanes, using “Airplane Tracking Using ADS-B Signals in Simulink” on page 8-52.
• Make a standalone FM receiver using Raspberry Pi® with “FM Reception with RTL-SDR Radio
on Raspberry Pi Hardware with Simulink” on page 8-62.
• Check out the Radio Management topics. These topics explain how to create blocks and System
objects, and how to adjust radio settings.
• Tweak your design’s performance with “Performance” optimizations.

Note Each time you use the Communications Toolbox Support Package for RTL-SDR Radio with
MATLAB®, call the function sdrsetup. This function performs certain behind-the-scenes operations
so that you can use this support package cleanly every time.

See Also

Related Examples
• “Common Problems and Fixes” on page 1-11

1-2
Supported Hardware and Required Software

Supported Hardware and Required Software

Supported Hardware
• NooElec® NESDR radio
• RTL-SDR USB radios featuring RTL2832U chip

Required Software
• MATLAB
• Communications Toolbox

Recommended Software
• Simulink®

Support Package
When you install this support package, the installation process also installs all required third-party
software. To start the installer, on the MATLAB Home tab, in the Environment section, click Add-
Ons > Get Hardware Support Packages.

For more information, see “Get and Manage Add-Ons”.

See Also

Related Examples
• “Installation and Setup”

External Websites
• https://www.mathworks.com/hardware-support/rtl-sdr.html

1-3
1 Getting Started with Communications Toolbox Support Package for RTL-SDR Radio

Install Support Package for RTL-SDR Radio


1 On the MATLAB Home tab, in the Environment section, click Add-Ons > Get Hardware
Support Packages.
2 In Add-On Explorer, browse or search for the Communications Toolbox Support Package for
RTL-SDR Radio.
3 Select the support package and then click Install.
4 During support package installation, you will be prompted to install the drivers needed for the
RTL-SDR Radio software.

For more information, see “Get and Manage Add-Ons”.

See Also

Related Examples
• “RTL-SDR Support Package Hardware Setup” on page 1-5

1-4
RTL-SDR Support Package Hardware Setup

RTL-SDR Support Package Hardware Setup


To implement features in the Communications Toolbox Support Package for RTL-SDR Radio, you must
establish communication between the host and the radio hardware.

If you are connecting two radios to the same host, see “Configure Multiple RTL-SDR Radios” on page
1-9 after installing the support package but before installing the USB driver.

Install USB Driver (Windows)


USB Driver Installation Preparation

The support package installer guides you through installing the drivers required for using the RTL-
SDR device as a software-defined radio (SDR) receiver. Before you begin, remove all nonessential
USB devices from your computer so that you do not accidentally replace the driver for a different
device.

These instructions are for installing the USB driver for one RTL-SDR device. To install more than one
RTL-SDR device for use with this support package, see “Configure Multiple RTL-SDR Radios” on page
1-9.

Insert RTL-SDR Radio into USB Port

1 Insert the RTL-SDR radio into an available USB port on your computer. If your operating system
(OS) automatically installs a driver for the device as a DVB-T receiver, wait until the OS finishes
the installation before continuing.

Note Some USB 3 ports do not recognize the RTL-SDR radio correctly and can result in a
connection error. Your hardware configuration might require you to plug the RTL-SDR device into
a USB 2 port.
2 Click Next. The installer opens the Zadig software in a separate window.

Install USB Driver with Zadig Software

If the Zadig software displays a User Control Account prompt, then the software requires
administrative privileges to install the USB driver. Click Yes to continue.

Follow the directions in the Support Package Installer window to install Zadig device drivers.

Caution If the wrong device is selected when you install the driver, the selected device becomes
unusable. For example, if the selected device is the keyboard, the keyboard will not be usable after
the driver update.

Test Radio Connection (Windows)

On this page you can Confirm communication with your RTL-SDR radio and get information about the
connected radio.

If test connection fails and the page does not update to show radio information:

1-5
1 Getting Started with Communications Toolbox Support Package for RTL-SDR Radio

• Try putting the RTL-SDR radio in a different USB port.


• Make sure the radio works by trying it in a different computer.
• Check the “Common Problems and Fixes” on page 1-11, and topics that resolve your problem.

If you still cannot discern the problem, contact Tech Support at https://www.mathworks.com/
support/.

Install USB Driver (Linux)


The support package installer guides you through installing the drivers required for using the RTL-
SDR device as a software-defined radio (SDR) receiver. The installer uses the files you downloaded
during setup to install the RTL-SDR library.

RTL-SDR Install Driver

If you see this page, the installer uses the files you downloaded during setup to install the RTL-SDR
library. The installation process requires permission to copy files to system directories. You might be
prompted for your sudo password before the installation can continue.

If you are prompted, enter your sudo password in the MATLAB Command Window, and then return to
the installer. If you do not have a sudo password, click Cancel and contact your network
administrator to install this software.

Insert RTL-SDR Radio into USB Port

1 Insert the RTL-SDR radio into an available USB port on your computer.
2 Click Next.

Test Radio Connection (Linux)

On this page, you can confirm communication with your RTL-SDR radio and get information about the
connected radio.

If test connection fails and the page does not update to show radio information:

• Try putting the RTL-SDR radio in a different USB port.


• Make sure the radio works by trying it in a different computer.
• If you do not see any radios listed after the installation is completed, the digital TV (DVB) driver
may be superseding the RTL-SDR driver. If the device is in use by the DVB driver, the installer
cannot access it. You might need to unload the kernel module or prevent it from loading. See
“Kernel driver is active, or device is claimed by second instance of librtlsdr” on page 1-12.
• Check “Common Problems and Fixes” on page 1-11 for topics that resolve your problem.

If you still cannot discern the problem, contact Tech Support at https://www.mathworks.com/
support/.

Install USB Driver (Mac)


The support package installer guides you through installing the drivers required for using the RTL-
SDR device as a software-defined radio (SDR) receiver. The installer uses the files you downloaded
during setup.

1-6
RTL-SDR Support Package Hardware Setup

Insert RTL-SDR Radio into USB Port

1 Insert the RTL-SDR radio into an available USB port on your computer.
2 Click Next.

Test Radio Connection (Mac)

On this screen you can confirm communication with your RTL-SDR radio and get information about
the connected radio.

If test connection fails and the page does not update to show radio information:

• Try putting the RTL-SDR radio in a different USB port.


• Make sure the radio works by trying it in a different computer.
• Check “Common Problems and Fixes” on page 1-11 for topics that resolve your problem.

If you still cannot discern the problem, contact Tech Support at https://www.mathworks.com/
support/.

Verify Hardware Setup


This step helps you to verify that MATLAB can communicate with the RTL-SDR radio using the
support package. If you get a successful status, it means that MATLAB can communicate with the
radio and the radio is ready to be used.

1 At the MATLAB command prompt, call the sdrsetup function.

Note Each time you use the Communications Toolbox Support Package for RTL-SDR Radio with
MATLAB, you must call sdrsetup. This function performs internal operations that enable you to
use this support package cleanly every time.
2 To get information for all radios connected to your computer, call the sdrinfo function:

hwinfo = sdrinfo

To get information on a specific radio, enter the function with this format:

hwinfo = sdrinfo(Address)

Address is the radio ID, for example:

hwinfo = sdrinfo('0');

• If sdrinfo is successful, MATLAB returns a hardware information structure. For example:

hwinfo =

RadioName: 'Generic RTL2832U OEM'


RadioAddress: '0'
RadioIsOpen: 0
TunerName: 'R820T'
Manufacturer: 'Realtek'
Product: 'RTL2838UHIDIR'
GainValues: [29×1 double]
RTLCrystalFrequency: 28800000

1-7
1 Getting Started with Communications Toolbox Support Package for RTL-SDR Radio

TunerCrystalFrequency: 28800000
SamplingMode: 'Quadrature'
OffsetTuning: 'Disabled'
• If sdrinfo returns the message There was no response at address Address or it
returns an empty cell array, then check for the following:

• No radio connected
• Radio ID not specified properly
• USB driver not installed properly
3 If the connection is successful, you can start designing your own radio interface.

See Also

Related Examples
• “What To Do After Installation” on page 1-2
• “Radio Management”

1-8
Configure Multiple RTL-SDR Radios

Configure Multiple RTL-SDR Radios


To install the drivers required for different RTL-SDR device models, perform the following steps for
each distinct RTL receiver model.

1 Plug one RTL-SDR device into an available USB port on your computer.
2 On the MATLAB Home tab, in the Environment section, click Add-Ons > Manage Add-Ons.
Select the support package then click the Setup button, ( ).

The Hardware Setup window opens at the Connect Hardware step. Follow the on‑screen setup
steps to install drivers and test the radio connection. After successful test of the radio
connection, close the Setup window.
3 Unplug the RTL-SDR device.
4 Repeat the preceding steps for each RTL-SDR model that you want to use.

These steps configure the USB ports to work with your RTL-SDR radios for the installed version of
the Communications Toolbox Support Package for RTL-SDR Radio.

USB Port Address Assignment The assignment of USB port addresses can be counterintuitive. If
an RTL-SDR device is plugged into the first USB port, it is at address 0. However, if an RTL-SDR
device is plugged into any port after the first one, the address varies depending on whether a device
is plugged into any of the previous ports. This figure shows how the USB port addresses are assigned
when devices are added and then removed in first in, first out (FIFO) order.

This figure shows how the USB port addresses are assigned when devices are added and then
removed from port 0. The radio address for the second RTL-SDR device changes based on whether
the first port has an RTL-SDR device in it. To access a radio with the correct radio address, you must
keep track of the plugged-in devices in order.

1-9
1 Getting Started with Communications Toolbox Support Package for RTL-SDR Radio

After you complete these steps, plug in the radios you plan to use. To check the configuration and
note the radio address associated with each device, enter sdrinfo at the MATLAB command prompt.

See Also

Related Examples
• “What To Do After Installation” on page 1-2
• “Radio Management”

1-10
Common Problems and Fixes

Common Problems and Fixes


In this section...
“sdrinfo returns empty message after calling step” on page 1-11
“sdrinfo returns only three radio settings” on page 1-11
“sdrinfo returns radio ID as “vm”” on page 1-12
“Cannot find radio” on page 1-12
“Simulink hangs when radio is removed during simulation” on page 1-12
“Kernel driver is active, or device is claimed by second instance of librtlsdr” on page 1-12
“Package Manager in Use” on page 1-13
“Setup Warns "Xcode not Found" or "Xcode Command Line Tools not Found"” on page 1-14
“No Radios Found” on page 1-15
“Invalid MEX-file error” on page 1-15
“Test connection fails and displays 'Error Code -12' message” on page 1-16

sdrinfo returns empty message after calling step


Problem

Function sdrinfo returns an empty cell array

Possible Solution

The radio may not be connected or configured correctly. Follow these steps to reconfigure the port
and radio:
1 Connect the radio
2 Install the USB driver.

On the MATLAB Home tab, in the Environment section, click Add-Ons > Manage Add-Ons.
3 The Hardware Setup dialog will open at the Connect Hardware step. Follow the on screen
setup steps to install drivers and test the radio connection. After successful test of the radio
connection, close the setup dialog.
4 At the MATLAB command prompt, run sdrsetup.

sdrinfo returns only three radio settings


Problem

Function sdrinfo does not return all radio settings for the specified device.

Possible Solution

sdrinfo returns all valid radio fields that are applicable, as long as the System object™ or block is
not open (unlocked). If the block or System object is currently running, sdrinfo returns only the top
three fields: RadioName, RadioAddress, and RadioIsOpen.

If this is the case, you can do one of the following actions:

1-11
1 Getting Started with Communications Toolbox Support Package for RTL-SDR Radio

• Release the System object


• Stop the model simulation
• Close the block mask

sdrinfo returns radio ID as “vm”


Problem

In the Zadig software window, the USB driver is reported as RTL2838UHIDIR. When you hover your
mouse over vendor ID field (“USB ID” row first text field), it reports the vendor as “VM”.

Possible Solution

This issue can happen sometimes when the VMPlayer is running on Windows®. Turn off the VMplayer
and try again. You can start the VMPlayer after your computer recognizes the RTL-SDR radio
correctly.

Cannot find radio


Problem

The RTL-SDR radio is attached to your computer but when you run sdrinfo, it returns empty or the
info method of an RTL-SDR System object returns "Cannot find radio".

Possible Solution

Unplug the radio and then plug the radio back in again. Be sure to use the same USB slot.

Simulink hangs when radio is removed during simulation


Problem

Simulink hangs if the RTL radio is removed while running a simulation.

Possible Solution

You must terminate the MATLAB session and restart.

In the future, do not remove an RTL radio while it is in use.

Kernel driver is active, or device is claimed by second instance of


librtlsdr
Problem

Sometimes the digital TV (DVB) driver takes over. If this is the case, you may see this message in the
command shell:
Kernel driver is active, or device is claimed by second instance of librtlsdr.
In the first case, please either detach or blacklist the kernel module
(dvb_usb_rtl28xxu), or enable automatic detaching at compile time.

usb_claim_interface error -6

1-12
Common Problems and Fixes

Possible Solution

Unload the kernel module or prevent it from loading. The listed steps are for manual unloading and to
prevent the kernel module from loading.

• To unload the kernel module:

sudo rmmod dvb_usb_rtl28xxu rtl2832

This is a temporary solution, as the system will load the driver again the next time you remove and
then replace the USB device.
• To prevent the kernel module from loading, create a file in /etc/modprobe.d, with a .conf
extension (for example, "no-rtl.conf") and include this content:

blacklist dvb_usb_rtl28xxu
blacklist rtl2832
blacklist rtl2830

The exact method depends on your Linux® distribution. The example shown is for Arch Linux.

This solution is more convenient if you never plan to use the device for TV reception (though you
can always choose to remove the blacklist in the future). If you choose this method, you may have
to unload the driver first if it is already in use.
• To remove the blacklist file:

• Delete the blacklisting file: sudo rm -f /etc/modprobe.d/no-rtl.conf.


• Unplug and plug in the radio.

Note You can also unload and prevent the kernel module from loading by using RTL-SDR support
package installer.

On the MATLAB Home tab, in the Environment section, click Add-Ons > Manage Add-Ons. Select
the support package then click the Setup button, ( ).

Package Manager in Use


Problem

This error occurs when another package manager, such as Synaptic, is in use. The message you see
might be similar to the following:
Could not get lock /var/lib/dpkg/lock - open (11: Resource temporarily unavailable)
Unable to lock the administration directory (/var/lib/dpkg/), is another process using it?

Possible Solution

To install the support package, close all other package manager software running on your system.

1-13
1 Getting Started with Communications Toolbox Support Package for RTL-SDR Radio

Setup Warns "Xcode not Found" or "Xcode Command Line Tools not
Found"
Problem

Xcode software and Command Line Tools are required for setup and installation on Mac OS X
systems. If the installer cannot find the Xcode Command Line Tools, you will see the "Xcode
Command Line Tools not Found" warning.

Possible Solution

Follow these steps to install the Xcode software and Command Line Tools.

1 Click Cancel to exit the installation process.


2 Install the Xcode software.

Install Xcode Software

If you already have the Xcode software but need to install the Command Line Tools, you can skip
this step.

a Follow the instructions at https://developer.apple.com/xcode/downloads/.


b If you are running OS X version 10.9 or later, the Xcode installation comes with the
Command Line Tools. You can skip to the last step.
c If you are running OS X version 10.8 or earlier, you must install the Command Line Tools
also. Go to the next step.
3 Install the Xcode Command Line Tools.

Install Command Line Tools (OS X version 10.8 and earlier)

This applies to systems with OS X version 10.8 or earlier only; with OS X version 10.9 and later,
the Command Line Tools come with the Xcode software.

a Start Xcode.
b Select Xcode > Preferences.
c Select Downloads tab.
d Click install next to Command Line Tools.
4 Restart the hardware setup.

On the MATLAB Home tab, in the Environment section, click Add-Ons > Manage Add-Ons.
Select the support package then click the Setup button, ( ).

Note If you install the Command Line Tools and you still get the "Xcode Command Line Tools not
Found" warning, and you have more than one version of Xcode installed, you need to make sure that
you select the path to the Xcode version you intend to use with the support package when you install
the Command Line Tools.

1 In a terminal window, enter the following:

xcode-select --print-path

1-14
Common Problems and Fixes

This command displays the path to the Xcode version in use.


2 To change the path to the Xcode version you want to use, enter the following:

xcode-select --switch xcode_path

where xcode_path is the path to the Xcode version you want to use.

When you install the Command Line Tools, make sure that you start the version of Xcode that you
specified in this step.
3 Install Command Line Tools (OS X version 10.8 and earlier)

When you install the Command Line Tools, first make sure that you start the version of Xcode
that you specified in the previous step.

a Start Xcode.
b Select Xcode > Preferences.
c Select Downloads tab.
d Click install next to Command Line Tools.
4 Restart the installer.

On the MATLAB Home tab, in the Environment section, click Add-Ons > Manage Add-Ons.
Select the support package then click the Setup button, ( ).

No Radios Found
Problem

After installation or when calling the sdrinfo function, no radios can be found. This may be because
some USB 3 controllers are not compatible with RTL-SDR radio.

Possible Solution

Try a different port. Your hardware configuration may require you to plug the RTL-SDR device into a
USB 2 port.

Invalid MEX-file error


Problem

When attempting to use a MEX-file you created, an error message indicates you are missing the
libmwsdrrdriver.dll library. For example, you get a message similar to this one when attempting
to run foo:

>> foo

Invalid MEX-file 'foo.mex': Missing dependent shared


libraries:
'libmwsdrrdriver.dll' required by 'foo.mex'.

1-15
1 Getting Started with Communications Toolbox Support Package for RTL-SDR Radio

Possible Solution

At the MATLAB command prompt run:

sdrsetup
Found and setup Communications Toolbox Support Package for RTL-SDR Radio.

For more information, see sdrsetup.

Test connection fails and displays 'Error Code -12' message


Problem

This error occurs when a test connection fails during the hardware setup process. You might also see
this error message after using the sdrinfo command.

Error Code -12

Possible Solution

This error occurs due to a USB connectivity issue. Possible solutions include:

• If you are using Windows and are using Zadig software to install the driver, try selecting either the
RTL283UHIDIR or RTL2832U interfaces (if they are available) instead of "Bulk-In, Interface
(Interface 0)". When you select the WinUSB option on the right pane, you might get a warning that
a System File is going to be changed while installing the driver. By installing the SDR drivers
using Zadig software, you overwrite the default drivers for the device. Depending on how your
operating system is set up, you might receive this warning before the start of the installation.
• If you do not find RTL283UHIDIR or RTL2832U interfaces in the list, navigate to 'Options' and
make sure that you select 'List all Devices' and clear 'Ignore Hubs or Composite Parents' check
box.
• If you are using a USB 3.0 port, try plugging the RTL-SDR radio into a USB 2.0 port or try testing
the connection on another computer if possible.
• Unplug the RTL-SDR radio and verify that it disappears from the list. Replug and verify that it
again appears in the list.
• Enter these commands at the MATLAB command prompt:

rehash toolbox
rehash toolboxcache

Note If the hardware setup process does not start the Zadig software, you can start it manually by
using this command at the command prompt:

C:\ProgramData\MATLAB\SupportPackages\<version>\3P.instrset\zadig.instrset\...
... zadig\zadig-<version>.exe

1-16
Uninstall Support Packages

Uninstall Support Packages


To uninstall support packages:

• On the MATLAB Home tab, in the Environment section, click Add-Ons > Manage Add-Ons.
Select the support package then click the Options button, ( ).

See Also

Related Examples
• “Get and Manage Add-Ons”
• “Supported Hardware – Software-Defined Radio”

1-17
2

Radio Management

• “Check Radio Connection” on page 2-2


• “Query Radio Address” on page 2-4
• “Set Radio Sample Times” on page 2-6
• “Real-Time Operation” on page 2-8
• “Use Multiple Radios Attached to Host Computer” on page 2-9
• “Desired Versus Actual Parameter Values” on page 2-12
• “Supported Data Types” on page 2-13
2 Radio Management

Check Radio Connection

In this section...
“Block Connection to RTL-SDR” on page 2-2
“System Object Connection to RTL-SDR” on page 2-2

Block Connection to RTL-SDR


To verify that an RTL-SDR Receiver block is connected to RTL-SDR hardware, follow these steps.

1 Open the model that contains the RTL-SDR Receiver block for which you want to check the
connection.
2 Open the block mask by double-clicking the block. If the block is connected to the RTL-SDR
hardware, click Info to return this information from the radio. Values going to the RTL-SDR radio
are often quantized by the hardware. These values are the actual RTL-SDR device settings.

• RadioName
• RadioAddress
• RadioIsOpen
• TunerName
• Manufacturer
• Product
• SerialNumber
• GainValues
• RTLCrystalFrequency
• TunerCrystalFrequency
• SamplingMode
• OffsetTuning
• CenterFrequency
• SampleRate
• TunerGain
• FrequencyCorrection

If the block is not connected to the RTL-SDR hardware, click Info to return this message in the
RadioName field: 'Cannot find radio'.

Note A block can connect to only one receiver at a time on the same radio address.

System Object Connection to RTL-SDR


To verify that an RTL-SDR receiver System object is connected to RTL-SDR hardware, follow these
steps.

2-2
Check Radio Connection

1 Identify the radio address that is associated with the comm.SDRRTLReceiver System object for
which you want to check the connection. For this example, create a default RTL-SDR receiver
System object. The radio address for this System object is 0.

radio = comm.SDRRTLReceiver

radio =
comm.SDRRTLReceiver with properties:

RadioAddress: '0'
CenterFrequency: 102500000
EnableTunerAGC: true
SampleRate: 250000
OutputDataType: 'int16'
SamplesPerFrame: 1024
FrequencyCorrection: 0
EnableBurstMode: false
2 Report the radio information of all RTL-SDR hardware that is connected to the host computer by
using the sdrinfo function, specifying the radio address associated with the System object as
the function input..

hwinfo = sdrinfo('0')

If a radio is connected to the specified radio address, then the RTL-SDR hardware returns this
information.

hwinfo =
RadioName: 'NESDR'
RadioAddress: '0'
RadioIsOpen: 0
TunerName: 'E4000'
Manufacturer: 'NooElec'
Product: 'NESDR SMArTee X'
GainValues: [14×1 double]
RTLCrystalFrequency: 28800000
TunerCrystalFrequency: 28800000
SamplingMode: 'Quadrature'
OffsetTuning: 'Disabled'

Note A System object can connect to only one subdevice (receiver) at a time on the same radio
address. When you call the info object function, the RTL-SDR radio System object connects to a
subdevice and stays connected until you call the release object function.

See Also
Blocks
RTL-SDR Receiver

Objects
comm.SDRRTLReceiver

Functions
info | sdrinfo

2-3
2 Radio Management

Query Radio Address


In this section...
“Block Radio Address” on page 2-4
“System Object Radio Address” on page 2-4

Block Radio Address


If the RTL-SDR Receiver block is connected to an RTL-SDR radio, the Radio address parameter
shows the valid radio address. You cannot change the radio address using this parameter, but you can
query a different radio that is connected to a different USB port by changing the radio address. To
check the radio address of the connected RTL-SDR radio, follow these steps.

1 Open the model that contains the RTL-SDR Receiver block for which you want to query the radio
address.
2 Open the block mask by double-clicking the block.
3 Identify the radio address (the Radio address parameter value) of the RTL-SDR radio to which
the block is connected to in the Radio address field.

System Object Radio Address


To check the radio address of the connected RTL-SDR radio, follow these steps.

1 Identify the radio address that is associated with the comm.SDRRTLReceiver System object. For
this example, create a default RTL-SDR receiver System object.

radio = comm.SDRRTLReceiver

radio =
comm.SDRRTLReceiver with properties:

RadioAddress: '0'
CenterFrequency: 102500000
EnableTunerAGC: true
SampleRate: 250000
OutputDataType: 'int16'
SamplesPerFrame: 1024
FrequencyCorrection: 0
EnableBurstMode: false
2 Check the valid radio address by using the RadioAddress property. The radio address for this
System object is 0.

radioID = radio.RadioAddress

radioID = '0'

You can change the radio address by using the same property, but you must first configure the radio
to use a different port. For more information on how to configure multiple radios, see “Configure
Multiple RTL-SDR Radios” on page 1-9. For the previous example, change the radio address of the
RTL-SDR radio from 0 to 2.

radio.RadioAddress = '2'

2-4
Query Radio Address

radio =
comm.SDRRTLReceiver with properties:

RadioAddress: '2'
CenterFrequency: 102500000
EnableTunerAGC: true
SampleRate: 250000
OutputDataType: 'int16'
SamplesPerFrame: 1024
FrequencyCorrection: 0
EnableBurstMode: false

See Also
Blocks
RTL-SDR Receiver

Objects
comm.SDRRTLReceiver

2-5
2 Radio Management

Set Radio Sample Times


In this section...
“Block Radio Sample Times” on page 2-6
“System Object Sample Times” on page 2-6

Block Radio Sample Times


The RTL-SDR radio sample time in an RTL-SDR Receiver block is the Simulink sample time. The RTL-
SDR radio sample time is not related to the sample time of the data that the board receives over the
air. However, setting the sample time of the block to match the hardware sample time is good
practice.

To set the sample rate, specify the Sampling rate (Hz) parameter of the block. The sample time
specified by the RTL-SDR Receiver block is the time interval between successive output samples of
the block. If you turn on the sample time colors of the model (Format > Sample Time Display >
All), the sample time value at the output of the RTL-SDR Receiver block corresponds to the Simulink
sample time. This sample time is the time interval between block outputs. The Simulink sample time
is equal to the sample time specified in the block mask times the vector length at the output of the
block.

System Object Sample Times


The RTL-SDR receiver System object sample rate is the rate between successive samples of MATLAB
data (specifically the time interval between successive output samples of the System object). This
sample time is not related to the sample time of the data that the board receives over the air.
However, setting the System object sample time to match the hardware sample time is a good
practice.

To set the sample time of a System object to match the RTL-SDR radio sample time, follow these
steps.

1 Identify the current sample rate that is associated with the comm.SDRRTLReceiver System
object by viewing its SampleRate property. For this example, create a default RTL-SDR receiver
System object, displaying its property values. The default sample rate is 250,000 Hz.

radio = comm.SDRRTLReceiver

radio =
comm.SDRRTLReceiver with properties:

RadioAddress: '0'
CenterFrequency: 102500000
EnableTunerAGC: true
SampleRate: 250000
OutputDataType: 'int16'
SamplesPerFrame: 1024
FrequencyCorrection: 0
EnableBurstMode: false
2 Set the sample rate by setting the SampleRate property.

radio.SampleRate = 200000;

2-6
Set Radio Sample Times

radio =
comm.SDRRTLReceiver with properties:

RadioAddress: '0'
CenterFrequency: 102500000
EnableTunerAGC: true
SampleRate: 200000
OutputDataType: 'int16'
SamplesPerFrame: 1024
FrequencyCorrection: 0
EnableBurstMode: false

See Also
Blocks
RTL-SDR Receiver

Objects
comm.SDRRTLReceiver

2-7
2 Radio Management

Real-Time Operation
In this section...
“Block Lost Samples and Latency Outputs” on page 2-8
“System Object Lost Samples and Latency Outputs” on page 2-8

Block Lost Samples and Latency Outputs


The RTL-SDR Receiver block has optional output ports to report lost samples and latency.

• Select the Lost samples output port parameter to enable the lost port, which outputs 0 if the
block is processing data in real time (that is, if the block is keeping up with the RTL-SDR radio)
and a positive number otherwise.
• Select the Latency output port parameter to enable the late output port, which indicates the
latency during host-hardware data transfers in number of frames.

These output ports can be useful diagnostic tools for determining real-time operation of the blocks. If
your model is not running in real time, try the techniques in “Model Performance Optimization” on
page 3-2 to approach or achieve real time performance.

System Object Lost Samples and Latency Outputs


The RTL-SDR receiver System object has optional output arguments to report lost samples and
latency. To output lost samples and latency, follow these steps.

1 Identify the lost samples and latency outputs that is associated with the comm.SDRRTLReceiver
System object. For this example, create a default RTL-SDR receiver System object.

radio = comm.SDRRTLReceiver;
2 Report the number of lost samples. If your model runs in real time, the lost samples output
(lost) is 0, which indicates that no samples are lost.

[y,len,lost] = radio();
3 Report the latency of the received data in the frames. If the received frames of data have no
latency, the late output is less than or equal to 1. Even when your model runs in real time,
received signals can experience latency.

[y,len,lost,late] = radio();

These output arguments can be useful for determining real-time operation of the System object. If
your design is not running in real time, try the techniques described in “MATLAB Performance
Optimization” on page 3-4 to approach or achieve real-time performance.

See Also
Blocks
RTL-SDR Receiver

Objects
comm.SDRRTLReceiver

2-8
Use Multiple Radios Attached to Host Computer

Use Multiple Radios Attached to Host Computer

In this section...
“Assignment of USB Port Addresses” on page 2-9
“Multiple Radio Blocks” on page 2-10
“Multiple Radio System Objects” on page 2-10

Assignment of USB Port Addresses


The assignment of USB port addresses depends on how many devices are plugged into ports and
which ports they are plugged into. If a device is plugged into the first USB port, the address of the
device is 0. However, if a device is plugged into any port after the first one, the address of that device
depends on whether a device is plugged into any of the previous ports.

This diagram shows how the USB port addresses are assigned when devices are added and then
removed in first in, first out (FIFO) order.

This diagram shows how the USB port addresses are assigned when devices are added and then
removed from port 0. The radio address for the second RTL device changes based on whether the
first port has a device in it. To access a radio with the correct radio address, you must keep track of
the plugged-in devices in order.

2-9
2 Radio Management

Multiple Radio Blocks


When you have more than one RTL-SDR radio attached to your host computer, use an RTL-SDR
Receiver block for each radio. For each block, change the Radio address parameter to the USB port
address of the associated radio. After you change the radio address for each block, the hardware
information updates.

Multiple Radio System Objects


When you have more than one RTL-SDR radio attached to your host computer, use an RTL-SDR
receiver System object for each radio. Each time you create an RTL-SDR receiver System object, set
its RadioAddress property to the value of the USB port address of the associated radio.

For example, to set the RadioAddress property to the value of the USB port address of a second
radio, follow these steps.
1 Create an RTL-SDR receiver by using the comm.SDRRTLReceiver System object.
radio = comm.SDRRTLReceiver

radio =
comm.SDRRTLReceiver with properties:

RadioAddress: '0'
CenterFrequency: 102500000
EnableTunerAGC: true
SampleRate: 250000
OutputDataType: 'int16'
SamplesPerFrame: 1024
FrequencyCorrection: 0
EnableBurstMode: false
2 Set the RadioAddress property to the address of the second radio.
radio = comm.SDRRTLReceiver('RadioAddress','1')

radio =
comm.SDRRTLReceiver with properties:

RadioAddress: '1'
CenterFrequency: 102500000
EnableTunerAGC: true
SampleRate: 250000
OutputDataType: 'int16'
SamplesPerFrame: 1024
FrequencyCorrection: 0
EnableBurstMode: false

Note To configure your computer for multiple radios, see “Configure Multiple RTL-SDR Radios” on
page 1-9.

See Also
Blocks
RTL-SDR Receiver

2-10
Use Multiple Radios Attached to Host Computer

Objects
comm.SDRRTLReceiver

More About
• “Configure Multiple RTL-SDR Radios” on page 1-9

2-11
2 Radio Management

Desired Versus Actual Parameter Values


In this section...
“Desired Versus Actual Value in Receiver Block” on page 2-12
“Desired Versus Actual Value in Receiver System Object” on page 2-12

Desired Versus Actual Value in Receiver Block


For the RTL-SDR Receiver block, when you specify the parameter values to set the center frequency,
sample rate, and frequency correction, the block initially performs rudimentary checks to verify that
the values are scalar and real. So long as the specified values pass those rudimentary checks, the
values can be out of range for the RTL-SDR radio. In this case, the hardware makes its best effort to
set the specified value and reports the actual value on the block mask.

Desired Versus Actual Value in Receiver System Object


The comm.SDRRTLReceiver System object properties display the specified values for the center
frequency, sample rate, and frequency correction. However, due to quantization or range issues, the
actual values can differ from your desired values.

For example, create a comm.SDRRTLReceiver System object, and then specify the center frequency.

h = comm.SDRRTLReciver
h.CenterFrequency = 1.03e9

Get the actual center frequency that is set at the RTL-SDR radio by using the info object function.
The output r.CenterFrequency shows the actual center frequency.

r = info(h);
r.CenterFrequency

The System object sends the specified values to the RTL-SDR radio and then reads the actual values
back when you use the info object function.

See Also
Blocks
RTL-SDR Receiver

Objects
comm.SDRRTLReceiver

2-12
Supported Data Types

Supported Data Types


Port Supported Data Types
Input • Double-precision floating point
• Single-precision floating point
• 16-bit signed integers

See Also
Blocks
RTL-SDR Receiver

Objects
comm.SDRRTLReceiver

Related Examples
• “Radio Management”

2-13
3

Performance Optimization

• “Model Performance Optimization” on page 3-2


• “MATLAB Performance Optimization” on page 3-4
• “General Host Operations” on page 3-7
3 Performance Optimization

Model Performance Optimization


Performance improvements can help you achieve real-time execution. The following lists contain
performance improvements you can make to models that contain the RTL-SDR Receiver block.

Acceleration
Run your application in Accelerator or Rapid Accelerator mode instead of Normal mode. Be aware
that some scopes do not plot data when run in Rapid Accelerator mode.

When using accelerator or rapid accelerator mode, on the Model Configuration Parameters dialog
box, search for Compiler optimization level to Optimizations on (faster runs).

Model Tuning
• Use frame-based processing. With frame-based processing, the model processes multiple samples
during a single execution call to a block. Consider using frame sizes from roughly 100 to several
thousand.
• In Model Configuration Parameters > Data Import/Export, turn off all logging.
• The model must be single-rate. If the model requires resampling, then choose rational coefficients
that keep the model single-rate.
• Do not add any Buffer blocks to the model. If you want to create convenient frame sizes, do it in
your data sources. Using a Buffer block typically degrades performance.
• Avoid feedback loops. Typically, such loops imply scalar processing, which slows the model
considerably.
• Avoid using scopes. To visualize your data, send it to a workspace variable and post-process it.
• If your model has Constant blocks with values that do not change during simulation, make sure
that the sample time is set to inf (default).

Simulink Code Generation


• If you are generating code from the model, set the Solver setting to Fixed-step/discrete. Set
tasking mode to SingleTasking.
• To improve performance, you can generate a standalone executable for your Simulink model. The
generated code runs without Simulink in the loop. To perform any code generation, you must have
an appropriate compiler installed. See https://www.mathworks.com/support/compilers/ for
compilers supported in the current release.

You can generate generic real-time target (GRT) code if you have a Simulink Coder™ license. To
do so, set Model Configuration Parameters > Code Generation > System target file to
grt.tlc (Generic Real-Time Target).
• When you select the option to generate code for any target (not just GRT), clear the Model
Configuration Parameters > Hardware Implementation > Test hardware > Test hardware
is the same as production hardware check box. Then, set the Device type to MATLAB Host
Computer.
• You can create generated code with a smaller stack than the GRT code if you have an Embedded
Coder® license. To do so, set Model Configuration Parameters > Code Generation > System
target file to ert.tlc (Embedded Coder). Then, add the following lines to the Model

3-2
Model Performance Optimization

Configuration Parameters > Code Generation > Custom Code > Include custom C code in
generated: > Source file:

#include <stdio.h>
#include <stdlib.h>

See Also
RTL-SDR Receiver | comm.SDRRTLReceiver

Related Examples
• “Performance”

3-3
3 Performance Optimization

MATLAB Performance Optimization

Code Profiling
You can use the profile function to analyze code processing. After determining which portions of
code are consuming the most processing time, consider techniques such as vector-based processing
and MATLAB code generation to accelerate simulation run times.

Vector-Based Processing
To shorten the overall run time of MATLAB functions that include System objects use vector-based
processing for large vectors of data.

With vector-based processing, function call overhead is reduced because the program processes
multiple samples during a single execution call to a System object. Processing larger vectors of data,
specifically vectors with thousands of data points, in a single function call improves performance of
MATLAB functions by reducing the frequency of System object setup overhead.

MATLAB Code Generation


Accelerate your MATLAB algorithms by generating a MEX function using the function codegen.

RTL-SDR System Object Code Generation

This example outlines the steps to follow when generating a MEX file. When generating and running
code that uses an RTL-SDR System object, the considerations are similar to those made for any
MATLAB code generation. Write a function to serve as the main function for the code. Considering
these points:

• Define the System object inputs.


• If you will make multiple calls to the object, declare the object as persistent so that it retains
memory between calls. Add conditional logic to create and load the object into memory only once.
• Release each object from memory when it is no longer needed.

This MATLAB function serves as the main function for the code that codegen compiles into a MEX
function. In this example, a Boolean input is used as a release flag to release the object from memory.
function x = sdrrtlrx(releaseFlag)

persistent rx

if isempty(rx)
% The System object is created only if it isn't already in memory.
rx = comm.SDRRTLReceiver('OutputDataType', 'double');
end

if releaseFlag
% When finished, release the object and all resources used by the object.
release(rx)
x = complex(zeros(rx.SamplesPerFrame,1));
else
% Execute the RTL-SDR receiver System object that was created earlier.
x = rx();
end

Before performing code generation, execute the function from the command line.

3-4
MATLAB Performance Optimization

Note To successfully run the function you must connect the RTL-SDR hardware to your system. For
more information, see “Installation and Setup”.

• Executing sdrrtlrx(false) the first time creates the RTL-SDR receiver System object and
loads the object into memory.
• Subsequent executions of sdrrtlrx(false) run the RTL-SDR receiver System object that exists
in memory.
• Executing sdrrtlrx(true) releases the RTL-SDR receiver System object and all resources used
by the interface.

After confirming the function runs as expected in MATLAB, perform code generation, declaring the
input argument types:

codegen sdrrtlrx -args false

Executing this command produces a library of files in a codegen subdirectory that contains the
executable MEX file, along with all intermediate and supporting files. By default, codegen creates an
output MEX file with _mex appended to the function name. For more information, see codegen. Run
this codegen example, by appending _mex to the function name:

sdrrtlrx_mex(false)

RTL-SDR System Object Code Generation of an FM Broadcast Receiver

This example presents a function that configures objects to build an FM stereo receiver. The example
then shows how to use the codegen function to generate a MEX file version of the function to run.
function fmrx(duration, station)
% This function builds an FM stereo receiver using MATLAB(R) and Communications
% Toolbox(TM), and enables you to receive signals in real time using the
% RTL-SDR USB radio hardware and the Communications Toolbox Support Package
% for RTL-SDR Radio. Function inputs specify the duration in seconds to play the FM
% signal and the FM station to tune the radio to.

% Initialize run-time parameters.


centerFreq = station*1e6; % FM radio station
samplesPerFrame = 3840;
rfSampleRate = 240000;

freqDeviation = 75000;
filterTimeConst = 7.5e-5;

audioSampleRate = 48000;

radioTime = 0;
frontEndFrameTime = samplesPerFrame/rfSampleRate;

%%
% Create an RTL-SDR receiver System object.
fmReceiver = comm.SDRRTLReceiver('OutputDataType','double',...
'SampleRate',rfSampleRate,'SamplesPerFrame', samplesPerFrame,...
'CenterFrequency',centerFreq);
%%
% Create an FM broadcast receiver System object.
fmBroadcastDemod = comm.FMBroadcastDemodulator(...
'SampleRate', rfSampleRate,...
'FrequencyDeviation', freqDeviation, 'FilterTimeConstant', filterTimeConst,...
'AudioSampleRate', audioSampleRate, 'Stereo', true);
%%
% Create an audio device writer System Object(TM).
player = audioDeviceWriter('SampleRate',audioSampleRate);

%%
% Loop until timer expires, receiving and playing the specified FM station.
while radioTime < duration
%%
% Receive baseband samples from the specified FM station.

3-5
3 Performance Optimization

[rcv,~,lost,~] = fmReceiver();
%%
% Demodulate FM broadcast signals and play the decoded audio.
audioSig = fmBroadcastDemod(rcv);
player(audioSig);
%%
% Update radio time. If there were lost samples, add those too.
radioTime = radioTime + frontEndFrameTime + double(lost)/rfSampleRate;
end

release(fmReceiver)
release(fmBroadcastDemod)
release(player)

Before performing code generation, execute the function from the command line.

Note To successfully run the function you must connect the RTL-SDR hardware to your system. For
more information, see “Installation and Setup”.

Executing fmrx(10,98.5):

1 Creates System objects for the RTL-SDR receiver tuned to the specified station, the FM
broadcast receiver, and the audio device writer.
2 Loads the objects into memory.
3 Runs in a loop for the specified duration.
4 Releases the objects from memory.

After confirming the function runs as expected in MATLAB, perform code generation, declaring the
input argument types.

% Specify input parameters.


duration = 100;
station = 98.5;
% Perform code generation.
codegen fmrx -args {duration,station}

% Run the MEX file.


fmrx_mex(duration, station)

See Also

Related Examples
• “Performance”

3-6
General Host Operations

General Host Operations


Tune your computing environment to improve performance.

• Turn off antivirus and firewall software.


• Turn off all nonessential background processes on your computer.

See Also

Related Examples
• “Performance”

3-7
4

RTL-SDR Deployment on External


Hardware

• “Signal Monitoring and Parameter Tuning” on page 4-2


• “Run Model as Standalone Application” on page 4-5
4 RTL-SDR Deployment on External Hardware

Signal Monitoring and Parameter Tuning


Use Simulink Monitor Signals & Tune Parameters feature (also called External Mode) to connect your
Simulink block diagram to your application that runs the model on the target hardware. The block
diagram becomes a user interface to the real-time application. By changing parameters in the
Simulink blocks, you also change parameters in the real-time application.

To run the model as a standalone application, see “Run Model as Standalone Application” on page 4-
5.

Before starting this procedure:

• Connect your board to the network and to a power supply.

Note You must have an Internet connection from either the host connected to the target
hardware or from the target hardware itself. This connection is necessary in case the software
must update the firmware or drivers.

If your Raspberry Pi or BeagleBone Black hardware is not connected to an Ethernet network,


follow the instructions in the appropriate support package documentation:

• “Configure Network Settings of Raspberry Pi Hardware” (Simulink Support Package for


Raspberry Pi Hardware)
• “Get the IP Address of a BeagleBone Black Board” (Embedded Coder Support Package for
BeagleBone Black Hardware)
• Create or open a Simulink model.

Configure Model
1 In your model, set the simulation stop time to inf to run the simulation until you explicitly pause
or stop the model.
2 In the Configuration Parameters dialog box, select the Hardware Implementation pane.

4-2
Signal Monitoring and Parameter Tuning

a Set Hardware board to Raspberry Pi or BeagleBone Black.


b Review the other parameters on this pane.

• Raspberry Pi hardware:

• If you performed a firmware update, Board information is populated with the IP


address, user name, and password of your Raspberry Pi hardware. Make sure that the
IP address contains the correct address for your hardware. If it is not correct or not
present, see “Get IP Address of Raspberry Pi Hardware” (Simulink Support Package
for Raspberry Pi Hardware).
• Verify that the TCP/IP port parameter is set to the default value 17725. Simulink
uses this TCP/IP port to communicate with Raspberry Pi hardware.
• BeagleBone Black hardware:

Under Target Hardware Resources, verify that Device Address, Username, and
Password are correct for your board.
c To apply any changes and close the dialog box, click OK.

Signal Monitoring and Parameter Tuning


1 In the Hardware tab of the toolstrip, click Monitor & Tune.

The model is now running on the target hardware. A system command window opens that shows
the messages coming from the model running on the target hardware.
2 Change any tunable parameters and observe how the changes affect application.

4-3
4 RTL-SDR Deployment on External Hardware

3 In the model, click Stop in Simulink. The system command window opened in the previous step
indicates that the model has stopped running. You can close this window.

Note Play button on the Simulation, Debug and Modeling tabs will always restore the Simulation
Mode to whatever its value was before the simulation.

See Also

Related Examples
• “Run Model as Standalone Application” on page 4-5
• “Getting Started with Simulink Support Package for Raspberry Pi Hardware” (Simulink Support
Package for Raspberry Pi Hardware)

4-4
Run Model as Standalone Application

Run Model as Standalone Application


In this section...
“Configure Model” on page 4-5
“Build and Deploy Model” on page 4-6
“Run and Stop Model on Target Hardware” on page 4-7

You can prepare, configure, and run a model on your target hardware. If you want to be able to tune
parameters and observe application output, then see “Signal Monitoring and Parameter Tuning” on
page 4-2.

Before starting this procedure:

• Connect your board to the network and to a power supply.

Note You must have an Internet connection from either the host connected to the target
hardware or from the target hardware itself. This connection is necessary in case the software
must update the firmware or drivers.

If your target hardware is not connected to an Ethernet network, follow the instructions in the
appropriate support package documentation:

• “Configure Network Settings of Raspberry Pi Hardware” (Simulink Support Package for


Raspberry Pi Hardware)
• “Get the IP Address of a BeagleBone Black Board” (Embedded Coder Support Package for
BeagleBone Black Hardware)
• Create or open a Simulink model.

Running a new or updated model on the board:

• Automatically stops a running model with the same name.


• Does not stop running models that have other names.

Configure Model
1 In your model, set simulation the stop time to inf to run the simulation until you explicitly pause
or stop the model.
2 Select Tools > Run on Target Hardware. Then, select either Prepare to Run or Options.
3 In the Configuration Parameters dialog box, select the Hardware Implementation pane.

4-5
4 RTL-SDR Deployment on External Hardware

a Set Hardware board to Raspberry Pi or BeagleBone Black.


b Review the other parameters on this pane.

• Raspberry Pi hardware:

• If you performed a firmware update, Board information is populated with the IP


address, user name, and password of your Raspberry Pi hardware. Make sure that the
IP address contains the correct address for your hardware. If it is not correct or not
present, see “Get IP Address of Raspberry Pi Hardware” (Simulink Support Package
for Raspberry Pi Hardware).
• Verify that the TCP/IP port parameter is set to the default value 17725. Simulink
uses this TCP/IP port to communicate with Raspberry Pi hardware.
• BeagleBone Black hardware:

Under Target Hardware Resources, verify that Device Address, Username, and
Password are correct for your board.
c To apply any changes and close the dialog box, click OK.

Build and Deploy Model

In the Simulink toolbar, click Deploy to Hardware .

The model is now running on the external hardware. A system command window opens that shows
the messages coming from the model running on the target hardware.

4-6
Run Model as Standalone Application

Run and Stop Model on Target Hardware


The hardware support packages for Raspberry Pi and BeagleBone Black generate a Linux executable
for each Simulink model you run on the target hardware. To run and stop the model, you use the
System object methods that run and stop execution on the target hardware.

1 Create an object for the hardware.

For Raspberry Pi hardware, enter:

rpi = raspberrypi;

For BeagleBone Black hardware, enter:

bbone = beaglebone_black;

The command generates an object for communicating with the hardware from the MATLAB
command line.
2 To stop the model on the target hardware, at the MATLAB command line, call the object method
that stops execution on the target hardware.

For example, for Raspberry Pi hardware, enter:

stop(rpi,'Name_of_model')

For example, for BeagleBone Black hardware, enter:

stopModel(bbone,'Name_of_model')

The Name_of_model argument is the name of the model you deployed to the target hardware.
3 To run a previously built Simulink model on your target hardware, at the MATLAB command line,
call the object method that starts execution on the target hardware.

For example, for Raspberry Pi hardware, enter:

run(rpi,'Name_of_model')

For example, for BeagleBone Black hardware, enter:

runModel(bbone,'Name_of_model')

See Also

Related Examples
• “Signal Monitoring and Parameter Tuning” on page 4-2
• “Getting Started with Simulink Support Package for Raspberry Pi Hardware” (Simulink Support
Package for Raspberry Pi Hardware)

4-7
5

Blocks
5 Blocks

RTL-SDR Receiver
Receive data from RTL-SDR device

Libraries:
Communications Toolbox Support Package for RTL-SDR Radio

Description
The RTL-SDR Receiver block supports communication between Simulink and the RTL-SDR device,
enabling simulation and development for various software-defined radio (SDR) applications. The RTL-
SDR Receiver block is a Simulink source that receives data from an RTL-SDR device and outputs a
column vector signal of fixed length.

This diagram shows the conceptual overview of receiving radio signals in Simulink by using the
Communications Toolbox Support Package for RTL-SDR Radio. Simulink interacts with the RTL-SDR
Receiver block to receive signals from the radio.

When the host computer is not connected to the radio, you can still use the block to develop a model
that propagates sample-time and data-type information. To propagate this information, you must
update your model.

This icon shows all ports enabled, including optional ones.

5-2
RTL-SDR Receiver

Ports
Input

fc — Center frequency
positive scalar

Center frequency in Hz, specified as a positive scalar.


Data Types: double

gain — Receiver gain


scalar

Receiver gain in dB, specified as a scalar.


Data Types: double

Output

Data — Received data from RTL-SDR device


column vector of complex int16 values | column vector of complex single-precision values | column
vector of complex double-precision values

Received data from an RTL-SDR device, returned as one of these values.

• Column vector of complex int16 values — The complex values are the raw 16 bit I and Q samples
from the RTL-SDR device.
• Column vector of complex single-precision values — The complex values are scaled to the range of
[–1, 1].
• Column vector of complex double-precision values — The complex values are scaled to the range
of [–1, 1].

To specify the base type, use the Output data type parameter.
Data Types: int16 | single | double
Complex Number Support: Yes

lost — Number of lost samples


nonnegative integer

Number of lost samples, returned as a nonnegative integer. When the RTL-SDR device reports no lost
samples, lost is 0.

If your model runs in real time, lost is 0. You can use this output value as a diagnostic tool to
determine real-time execution of the block. For more information on real-time operation, see “Real-
Time Operation” on page 2-8.
Dependencies

To enable this port, select the Lost samples output port parameter.

late — Latency of received data in frames


nonnegative integer

5-3
5 Blocks

Latency of the received data in frames, returned as a nonnegative integer. When the received frames
of data have no latency, late is less than or equal to 1.

Even when your model runs in real time, received signals can experience latency. You can use this
output value as a diagnostic tool to determine real-time execution of the block. For more information
on real-time operation, see “Real-Time Operation” on page 2-8.
Dependencies

To enable this port, select the Latency output port parameter.

Parameters
Radio Connection

Radio address — USB address of RTL-SDR device


0 (default) | nonnegative integer

Specify the USB address of the RTL-SDR device with which you want to communicate as a
nonnegative integer. To update block parameters in the model that is associated with the device
specified by Radio address, use the Info parameter to update.

USB Port Address Assignment The assignment of USB port addresses can be counterintuitive. If
an RTL-SDR device is plugged into the first USB port, it is at address 0. However, if an RTL-SDR
device is plugged into any port after the first one, the address varies depending on whether a device
is plugged into any of the previous ports. This figure shows how the USB port addresses are assigned
when devices are added and then removed in first in, first out (FIFO) order.

This figure shows how the USB port addresses are assigned when devices are added and then
removed from port 0. The radio address for the second RTL-SDR device changes based on whether
the first port has an RTL-SDR device in it. To access a radio with the correct radio address, you must
keep track of the plugged-in devices in order.

5-4
RTL-SDR Receiver

Info — Update block parameters


button

Click this parameter to update block parameters in the model that is associated with the device
specified by the Radio address parameter. When you click Info, a dialog box opens that displays
information and parameter settings associated with the device. Use this parameter to check
connectivity between the block and the radio and to synchronize radio settings between them. If the
block is not connected to the radio device, click Info to return this message in the RadioName field:
'Cannot find radio'.

Radio Configuration

Source of center frequency — Center frequency source


Dialog (default) | Input port

Select the source of the center frequency.

• Dialog — Set the center frequency by using the Center frequency (Hz) parameter.
• Input port — Set the center frequency by using the fc input port.

Center frequency (Hz) — Center frequency


102.5e6 (default) | positive scalar

Specify the center frequency in Hz as a positive scalar. The valid range of this parameter depends on
the tuner chip of the RTL-SDR device. For a list of tuner chips and their frequency ranges, see [1].

Tunable: No
Dependencies

To enable this parameter, set the Source of center frequency parameter to Dialog.

Source of gain — Source of gain


Dialog (default) | Input port | AGC

Select the source of the gain.

• Dialog — Set the gain by using the Tuner gain (dB) parameter.
• Input port — Set the gain by using the gain input port.

5-5
5 Blocks

• AGC — The RTL-SDR device uses an internal automatic gain control (AGC) algorithm to optimize
the receiver gain setting.

Tuner gain (dB) — Tuner gain in dB


0 (default) | scalar

Tuner gain in dB, specified as a scalar.

Tunable: No
Dependencies

To enable this parameter, set the Source of gain parameter to Dialog.

Sampling rate (Hz) — ADC sample rate


250e3 (default) | positive scalar

Specify the analog-to-digital converter (ADC) sample rate in Hz, specified as a positive scalar. The
valid range of sample rates are [225, 300] kHz and [900, 3200] in kHz. If you set this parameter
greater than 2560 kHz, you might observe dropped samples. For more information about the
maximum reliable sample rate, see [1].

Tunable: No

Frequency correction (ppm) — Frequency correction


0 (default) | integer from –1e4 to 1e4

Specify the frequency correction in ppm as an integer from –1e4 to 1e4. This parameter corrects the
frequency shift in the received data due to local oscillator frequency offset or clock rate inaccuracy.

Tunable: Yes

Data transfer Configuration

Lost samples output port — Option to enable lost samples output port
off (default) | on

Select this parameter to enable the lost output port.

Latency output port — Option to enable latency output port


off (default) | on

Select this parameter to enable the late output port.

Output data type — Data type of output signal


int16 (default) | single | double

Select the data type of the output signal.

• double or single — The complex values are scaled to the range of [–1, 1].
• int16 — The complex values are the raw 16 bit I and Q samples from the RTL-SDR device.

Tunable: No

Samples per frame — Number of samples per frame


1024 (default) | positive integer

5-6
RTL-SDR Receiver

Specify the number of samples per frame as a positive integer.

Tunable: No

Enable burst mode — Option to enable burst mode


off (default) | on

To produce a set of contiguous frames without an overflow to the radio, select this parameter.
Enabling burst mode can help you simulate models that cannot run in real time.

When you select this parameter, specify the desired amount of contiguous data by using the Number
of frames in burst and Samples per frame parameters.

Number of frames in burst — Number of frames in burst


20 (default) | positive integer

Specify the number of frames in a burst as a positive integer.

Tunable: No
Dependencies

To enable this parameter, select the Enable burst mode parameter.

More About
Blocking Behavior

The RTL-SDR Receiver block waits until it receives the number of samples per frame specified by
Samples per frame before it returns processing control to the simulation.

Version History
Introduced in R2014a

References
[1] SDR (Software Defined Radio), https://osmocom.org/projects/sdr/wiki/rtl-sdr#Specifications

Extended Capabilities
C/C++ Code Generation
Generate C and C++ code using Simulink® Coder™.

See Also
Objects
comm.SDRRTLReceiver

Topics
“Real-Time Operation” on page 2-8

5-7
6

System Objects
6 System Objects

comm.SDRRTLReceiver
Package: comm

Receive data from RTL-SDR device

Description
The comm.SDRRTLReceiver System object supports communication between MATLAB and an RTL-
SDR device, enabling simulation and development of various software-defined radio (SDR)
applications. Although comm.SDRRTLReceiver receives data from an RTL-SDR device, the object
acts as a signal source that outputs a column vector signal of fixed length.

To receive data from an RTL-SDR device:

1 Create the comm.SDRRTLReceiver object and set its properties.


2 Call the object as if it were a function.

To learn more about how System objects work, see What Are System Objects?.

Creation

Syntax
rx = comm.SDRRTLReceiver
rx = comm.SDRRTLReceiver(RadioAddress)
rx = comm.SDRRTLReceiver( ___ ,Name,Value)

Description

rx = comm.SDRRTLReceiver creates a default RTL-SDR receiver System object.

rx = comm.SDRRTLReceiver(RadioAddress) sets the RadioAddress property to the USB


address of the connected RTL-SDR device.

rx = comm.SDRRTLReceiver( ___ ,Name,Value) sets “Properties” on page 6-2 using one or


more name-value arguments in addition to any argument combinations in previous syntaxes. For
example,'CenterFrequency',88.9e6 specifies a center frequency of 88.9 MHz.

Properties
Unless otherwise indicated, properties are nontunable, which means you cannot change their values
after calling the object. Objects lock when you call them, and the release function unlocks them.

If a property is tunable, you can change its value at any time.

For more information on changing property values, see System Design in MATLAB Using System
Objects.

6-2
comm.SDRRTLReceiver

RadioAddress — USB address of RTL-SDR device


'0' (default) | character vector | string scalar

USB address of the RTL-SDR device with which you want to communicate, specified as a character
vector or string scalar representing a nonnegative integer. To discover which radios are connected to
your computer, use the sdrinfo function.

USB Port Address Assignment The assignment of USB port addresses can be counterintuitive. If
an RTL-SDR device is plugged into the first USB port, it is at address 0. However, if an RTL-SDR
device is plugged into any port after the first one, the address varies depending on whether a device
is plugged into any of the previous ports. This figure shows how the USB port addresses are assigned
when devices are added and then removed in first in, first out (FIFO) order.

This figure shows how the USB port addresses are assigned when devices are added and then
removed from port 0. The radio address for the second RTL-SDR device changes based on whether
the first port has an RTL-SDR device in it. To access a radio with the correct radio address, you must
keep track of the plugged-in devices in order.

Data Types: char

CenterFrequency — Center frequency


102.5e6 (default) | positive scalar

6-3
6 System Objects

Center frequency in Hz, specified as a positive scalar. The valid range of this property depends on the
tuner chip of the RTL-SDR device. For a list of tuner chips and their frequency ranges, see [1].

Tunable: Yes
Data Types: double

EnableTunerAGC — Enable AGC of tuner


false or 0 (default) | true or 1

Enable automatic gain control (AGC) of the tuner, specified as one of these numeric or logical values.

• 0 (false) — Turn off AGC.


• 1 (true) — Turn on AGC.

Tunable: Yes
Data Types: logical | numeric

TunerGain — Tuner gain


0 (default) | scalar

Tuner gain in dB, specified as a scalar. The valid range of this property depends on the tuner chip of
the RTL-SDR device. To get valid gain values, use the info function.

Tunable: Yes
Dependencies

To enable this property, set the EnableTunerAGC property to false.


Data Types: double

SampleRate — ADC sample rate


250e3 (default) | positive scalar

Analog-to-digital converter (ADC) sample rate in Hz, specified as a positive scalar. The valid range of
sample rates are [225, 300] kHz and [900, 3200] in kHz. If you set the SampleRate property greater
than 2560 kHz, you might observe dropped samples. For more information about the maximum
reliable sample rate, see [1].
Data Types: double

OutputDataType — Data type of output


'int16' (default) | 'double' | 'single'

Data type of output, specified as one of these values.

• 'double' or 'single' — The complex values are scaled to the range of [–1, 1].
• 'int16' — The complex values are the raw 16 bit quadrature (I and Q) samples from the RTL-
SDR device.

Data Types: char | string

SamplesPerFrame — Number of samples per frame


1024 (default) | positive integer

Number of samples per frame, specified as a positive integer.

6-4
comm.SDRRTLReceiver

Data Types: double

FrequencyCorrection — Frequency correction


0 (default) | integer from –1e4 to 1e4

Frequency correction in ppm, specified as an integer from –1e4 to 1e4. This property value corrects
the frequency shift in the received data due to local oscillator frequency offset or clock rate
inaccuracy.

Tunable: Yes
Data Types: double

EnableBurstMode — Option for burst mode


false or 0 (default) | true or 1

Option for burst mode, specified as one of these numeric or logical values.

• 0 (false) — Disable burst mode.


• 1 (true) — Enable burst mode. To produce a set of contiguous frames without an overflow to the
RTL-SDR device, set this property to true. Enabling burst mode can help you simulate models
that cannot run in real time. When you enable burst mode, specify the desired amount of
contiguous data by using the NumFramesInBurst property and the SamplesPerFrame property.

Data Types: logical | numeric

NumFramesInBurst — Number of frames in burst


10 (default) | positive integer

Number of frames in a contiguous burst, specified as a positive integer.


Dependencies

To enable this property, set the EnableBurstMode property to true.


Data Types: double

Usage

Syntax
output = rx()
[output,len] = rx()
[output,len,lost] = rx()
[output,len,lost,late] = rx()

Description

output = rx() receives data from an RTL-SDR device associated with the comm.SDRRTLReceiver
System object, rx.

[output,len] = rx() returns len, which indicates whether the object receives valid data from
the RTL-SDR device.

[output,len,lost] = rx() returns lost, which indicates the number of lost samples.

6-5
6 System Objects

[output,len,lost,late] = rx() also returns late, which indicates the latency of the received
data in frames.

Output Arguments

output — Received data from RTL-SDR device


column vector of complex int16 values | column vector of complex single-precision values | column
vector of complex double-precision values

Received data from an RTL-SDR device, returned as one of these values.

• Column vector of complex int16 values — The complex values are the raw 16 bit I and Q samples
from the RTL-SDR device.
• Column vector of complex single-precision values — The complex values are scaled to the range of
[–1, 1].
• Column vector of complex double-precision values — The complex values are scaled to the range
of [–1, 1].

To specify the base type, use the OutputDataType property.


Data Types: int16 | single | double
Complex Number Support: Yes

len — Number of valid samples


nonnegative integer

Number of valid samples, returned as a nonnegative integer. When the RTL-SDR device returns no
valid samples, len is 0.

lost — Number of lost samples


nonnegative integer

Number of lost samples, returned as a nonnegative integer. When the RTL-SDR device reports no lost
samples, lost is 0. If your model runs in real time, lost is 0. You can use this output value as a
diagnostic tool to determine real-time execution of the object. For more information on real-time
operation, see “Real-Time Operation” on page 2-8.

late — Latency of received data in frames


nonnegative integer

Latency of the received data in frames, returned as a nonnegative integer. When the received frames
of data have no latency, late is less than or equal to 1. Even when your model runs in real time,
received signals can experience latency. You can use this output value as a diagnostic tool to
determine real-time execution of the object. For more information on real-time operation, see “Real-
Time Operation” on page 2-8.

Object Functions
To use an object function, specify the System object as the first input argument. For example, to
release system resources of a System object named obj, use this syntax:

release(obj)

6-6
comm.SDRRTLReceiver

Specific to comm.SDRRTLReceiver
info Characteristic information of RTL-SDR device

Common to All System Objects


step Run System object algorithm
release Release resources and allow changes to System object property values and input
characteristics
reset Reset internal states of System object

Examples

Receive Streaming RTL-SDR Data

Receive streaming data from an RTL-SDR device.

Create and initialize an RTL-SDR receiver object. Inspect the object properties.

rxsdr = comm.SDRRTLReceiver('0','CenterFrequency',88.9e6,'SampleRate',250000, ...


'SamplesPerFrame',2048,'EnableTunerAGC',true,'OutputDataType','double')

rxsdr =
comm.SDRRTLReceiver with properties:

RadioAddress: '0'
CenterFrequency: 88900000
EnableTunerAGC: true
SampleRate: 250000
OutputDataType: 'double'
SamplesPerFrame: 2048
FrequencyCorrection: 0
EnableBurstMode: false

radioInfo = info(rxsdr)

radioInfo =
The following values show radio settings, not the property
values of RTL-SDR receiver System object. For more information,
type 'help comm.SDRRTLReceiver'.

RadioName: 'Generic RTL2832U OEM'


RadioAddress: '0'
TunerName: 'R820T'
Manufacturer: 'Realtek'
Product: 'RTL2838UHIDIR'
GainValues: [0 0.9000 1.4000 2.7000 3.7000 7.7000 8.7000 12.5000 14.4000 15.7000 1
RTLCrystalFrequency: 28800000
TunerCrystalFrequency: 28800000
SamplingMode: 'Quadrature'
OffsetTuning: 'Disabled'
CenterFrequency: 88900000
SampleRate: 250000
FrequencyCorrection: 0

6-7
6 System Objects

Stream data from the device. Release the object when finished using it.

for p=1:1000
rxdata = rxsdr();
end
release(rxsdr)

Receive Streaming RTL-SDR Data on Two Frequencies

Receive streaming data from an RTL-SDR device at one frequency then change the frequency and
stream more data from the device.

Create and initialize an RTL-SDR receiver object. Inspect the object properties.

rxsdr = comm.SDRRTLReceiver('0','CenterFrequency',88.9e6,'SampleRate',250000, ...


'SamplesPerFrame',2048,'EnableTunerAGC',true,'OutputDataType','double')

rxsdr =
comm.SDRRTLReceiver with properties:

RadioAddress: '0'
CenterFrequency: 88900000
EnableTunerAGC: true
SampleRate: 250000
OutputDataType: 'double'
SamplesPerFrame: 2048
FrequencyCorrection: 0
EnableBurstMode: false

radioInfo = info(rxsdr)

radioInfo =
The following values show radio settings, not the property
values of RTL-SDR receiver System object. For more information,
type 'help comm.SDRRTLReceiver'.

RadioName: 'Generic RTL2832U OEM'


RadioAddress: '0'
TunerName: 'R820T'
Manufacturer: 'Realtek'
Product: 'RTL2838UHIDIR'
GainValues: [0 0.9000 1.4000 2.7000 3.7000 7.7000 8.7000 12.5000 14.4000 15.7000 1
RTLCrystalFrequency: 28800000
TunerCrystalFrequency: 28800000
SamplingMode: 'Quadrature'
OffsetTuning: 'Disabled'
CenterFrequency: 88900000
SampleRate: 250000
FrequencyCorrection: 0

Stream data from the device.

6-8
comm.SDRRTLReceiver

for p=1:1000
rxdata = rxsdr();
end

Change the tuner frequency and stream more data. The CenterFrequency property is tunable, so
you can change the frequency for the RTL-SDR without releasing the object.

rxsdr.CenterFrequency = 103.1e6;
radioInfo = info(rxsdr)

radioInfo =
The following values show radio settings, not the property
values of RTL-SDR receiver System object. For more information,
type 'help comm.SDRRTLReceiver'.

RadioName: 'Generic RTL2832U OEM'


RadioAddress: '0'
TunerName: 'R820T'
Manufacturer: 'Realtek'
Product: 'RTL2838UHIDIR'
GainValues: [0 0.9000 1.4000 2.7000 3.7000 7.7000 8.7000 12.5000 14.4000 15.7000 1
RTLCrystalFrequency: 28800000
TunerCrystalFrequency: 28800000
SamplingMode: 'Quadrature'
OffsetTuning: 'Disabled'
CenterFrequency: 103100000
SampleRate: 250000
FrequencyCorrection: 0

for p=1:1000
rxdata = rxsdr();
end

Release the object when you are finished working with it.

release(rxsdr)

Check RTL-SDR Frame Loss and Latency

Check for loss of receiver data samples and the latency of data received from an RTL-SDR device.

Create and initialize an RTL-SDR receiver object. Inspect the object properties.

rxsdr = comm.SDRRTLReceiver('0','CenterFrequency',102.5e6,'SampleRate',250000, ...


'SamplesPerFrame',2048,'EnableTunerAGC',true)

rxsdr =
comm.SDRRTLReceiver with properties:

RadioAddress: '0'
CenterFrequency: 102500000
EnableTunerAGC: true
SampleRate: 250000
OutputDataType: 'int16'
SamplesPerFrame: 2048

6-9
6 System Objects

FrequencyCorrection: 0
EnableBurstMode: false

Inject a dummy processing time into the system using the pause function. Stream signal data from
the device. Inspect the third and fourth return values to check for lost frames and for latency of the
received data. For efficiency, preallocate uint32 variables for lost and latency. When finished
working with the radio, release the object connected to it.

lost = uint32(zeros(100,1));
latency = uint32(zeros(100,1));
frameTime = rxsdr.SamplesPerFrame/rxsdr.SampleRate;
processingTime = frameTime * 4;
for p=1:100
[x, ~, lost(p), latency(p)] = rxsdr();
pause(processingTime);
end
release(rxsdr)

Generate plots to show data loss and latency in frames. The RTL-SDR receiver object has a buffer that
can hold 128 frames. As the plot indicates, when the cumulative latency reaches 128, data is lost
because RTL-SDR device buffer is overflowing.

subplot(211)
numLostFrames = lost/rxsdr.SamplesPerFrame;
ax = plotyy(1:100, latency, 1:100, numLostFrames);
grid on
xlabel('Frame Number')
ylabel(ax(1), 'Latency in Frames')
ylabel(ax(2), 'Lost Frames')
subplot(212)
plot(processingTime*ones(1,100))
hold on
plot(frameTime*ones(1,100))
grid on
xlabel('Frame Number')
ylabel('Time (s)')
legend('Processing time', 'Frame time')
hold off

6-10
comm.SDRRTLReceiver

Check RTL-SDR Data Latency with Varying Processing Time

Check the latency of RTL-SDR receiver data frames when the processing time varies as a sawtooth
pattern.

Create and initialize an RTL-SDR receiver object. Inspect the object properties.
rxsdr = comm.SDRRTLReceiver('0','CenterFrequency',102.5e6,'SampleRate',250000, ...
'SamplesPerFrame',2048,'EnableTunerAGC',true)

rxsdr =
comm.SDRRTLReceiver with properties:

RadioAddress: '0'
CenterFrequency: 102500000
EnableTunerAGC: true
SampleRate: 250000
OutputDataType: 'int16'
SamplesPerFrame: 2048
FrequencyCorrection: 0
EnableBurstMode: false

Simulate data processing time, using the pause function to inject a dummy processing time into the
system that emulates a sawtooth pattern. Stream signal data from the device. Inspect the fourth

6-11
6 System Objects

return value to check for latency of the received data. For efficiency, preallocate a uint32 variable
for latency. When finished working with the radio, release the object connected to it.

latency = uint32(zeros(100,1));
frameTime = rxsdr.SamplesPerFrame/rxsdr.SampleRate;
processingTimeStep = 0.1 * frameTime;
for p=1:100
[x, ~, ~, latency(p)] = rxsdr();
pause(processingTimeStep * mod(p,15));
end
release(rxsdr)

Generate plots to show received data latency in frames. As the plots indicate, the latency remains at
one frame until the processing time exceeds the frame time. The system recovers a few frames after
the processing time drops below the frame time.

subplot(211)
plot(latency)
grid on
xlabel('Frame Number')
ylabel('Latency in Frames')
subplot(212)
plot(processingTimeStep * mod(1:100,15))
hold on
plot(frameTime * ones(1,100))
grid on
xlabel('Frame Number')
ylabel('Time (s)')
legend('Processing time', 'Frame time')
hold off

6-12
comm.SDRRTLReceiver

More About
Blocking Behavior

Before the comm.SDRRTLReceiver System object returns processing control to the simulation, the
object waits unit it receives the number of samples per frame specified by the SamplesPerFrame
property.

Version History
Introduced in R2014a

References
[1] SDR (Software Defined Radio), https://osmocom.org/projects/sdr/wiki/rtl-sdr#Specifications

See Also
Blocks
RTL-SDR Receiver

Topics
“FM Broadcast Receiver” on page 8-23

6-13
6 System Objects

“Frequency Offset Calibration for Receivers” on page 8-27


“Real-Time Operation” on page 2-8

6-14
info

info
Package: comm

Characteristic information of RTL-SDR device

Syntax
infostruct = info(radio)

Description
infostruct = info(radio) returns the characteristic information for the specified RTL-SDR
device.

Examples

Receive Streaming RTL-SDR Data

Receive streaming data from an RTL-SDR device.

Create and initialize an RTL-SDR receiver object. Inspect the object properties.

rxsdr = comm.SDRRTLReceiver('0','CenterFrequency',88.9e6,'SampleRate',250000, ...


'SamplesPerFrame',2048,'EnableTunerAGC',true,'OutputDataType','double')

rxsdr =
comm.SDRRTLReceiver with properties:

RadioAddress: '0'
CenterFrequency: 88900000
EnableTunerAGC: true
SampleRate: 250000
OutputDataType: 'double'
SamplesPerFrame: 2048
FrequencyCorrection: 0
EnableBurstMode: false

radioInfo = info(rxsdr)

radioInfo =
The following values show radio settings, not the property
values of RTL-SDR receiver System object. For more information,
type 'help comm.SDRRTLReceiver'.

RadioName: 'Generic RTL2832U OEM'


RadioAddress: '0'
TunerName: 'R820T'
Manufacturer: 'Realtek'
Product: 'RTL2838UHIDIR'
GainValues: [0 0.9000 1.4000 2.7000 3.7000 7.7000 8.7000 12.5000 14.4000 15.7000 1

6-15
6 System Objects

RTLCrystalFrequency: 28800000
TunerCrystalFrequency: 28800000
SamplingMode: 'Quadrature'
OffsetTuning: 'Disabled'
CenterFrequency: 88900000
SampleRate: 250000
FrequencyCorrection: 0

Stream data from the device. Release the object when finished using it.
for p=1:1000
rxdata = rxsdr();
end
release(rxsdr)

Input Arguments
radio — RTL-SDR device
comm.SDRRTLReceiver System object

RTL-SDR device, specified as a comm.SDRRTLReceiver System object. This RTL-SDR device must be
connected to the host computer.

Output Arguments
infostruct — Information about RTL-SDR device
structure

Information about the RTL-SDR device, returned as a structure containing these fields. The returned
values show the radio settings, not property values of the RTL-SDR device System object specified by
the radio input.

RadioName — Device name


character vector

Device name, returned as a character vector.

RadioAddress — USB address of RTL-SDR device


character vector

USB address of the RTL-SDR device, returned as a character vector.

TunerName — Tuner chip name


character vector

Tuner chip name, returned as a character vector.

Manufacturer — Manufacturer name


character vector

Manufacturer name, returned as a character vector.

Product — Product name


character vector

6-16
info

Product name, returned as a character vector.

GainValues — Receiver gain values


vector of integers

Receiver gain values, returned as a vector of integers.

RTLCrystalFrequency — RTL crystal frequency


positive integer

RTL crystal frequency in Hz, returned as a positive integer.

TunerCrystalFrequency — Tuner crystal frequency


positive integer

Tuner crystal frequency in Hz, returned as a positive integer.

SamplingMode — Direct sampling mode


'Quadrature' | 'Direct I' | 'Direct Q'

Direct sampling mode, returned as 'Quadrature', 'Direct I', or 'Direct Q'. When the
function returns SamplingMode as 'Quadrature', direct sampling is disabled.

OffsetTuning — Offset tuning mode


'Disabled' | 'Enabled'

Offset tuning mode, returned as 'Disabled' or 'Enabled'.

CenterFrequency — Actual center frequency


positive integer

Actual center frequency in Hz, returned as a positive integer.

SampleRate — Actual sample rate


positive integer

Actual sample rate in samples per second, returned as a positive integer.

TunerGain — Actual AGC value


scalar

Actual automatic gain control (AGC) value in dB, returned as a scalar.

FrequencyCorrection — Actual frequency correction value


positive integer

Actual frequency correction value in ppm, returned as a positive integer.

Tips
• The actual radio computed value and your specified setting can differ. To confirm that the actual
radio computed value is close enough to your specified setting, use this info function with the
System object at the input radio.

6-17
6 System Objects

Version History
Introduced in R2014a

See Also
comm.SDRRTLReceiver

6-18
7

Functions
7 Functions

sdrinfo
RTL-SDR radio information

Syntax
hardwareInfo = sdrinfo
hardwareInfo = sdrinfo(devAddress)

Description
hardwareInfo = sdrinfo returns a cell array of structures containing information about the RTL-
SDR radios that are connected to the host computer. If the function does not find any RTL-SDR
radios, the output is an empty array.

hardwareInfo = sdrinfo(devAddress) returns information about the RTL-SDR radio with the
specified device address. The structure of information is specific to the type of attached radio. If you
do not specify a device address, the function attempts to find all connected RTL-SDR radios. If the
function finds an incompatible radio at the specified address, the function returns a warning.

Examples

Report RTL-SDR Radio Information

Use the sdrinfo function to report information about the RTL-SDR radio connected at radio address
'0'.
hwinfo = sdrinfo('0')

hwinfo =
RadioName: 'NESDR'
RadioAddress: '0'
RadioIsOpen: 0
TunerName: 'E4000'
Manufacturer: 'NooElec'
Product: 'NESDR SMArTee X'
GainValues: [14×1 double]
RTLCrystalFrequency: 28800000
TunerCrystalFrequency: 28800000
SamplingMode: 'Quadrature'
OffsetTuning: 'Disabled'

Input Arguments
devAddress — Device address of USB-connected RTL-SDR radio
character vector | string scalar

Device address of the USB-connected RTL-SDR radio, specified as a character vector or string scalar
containing a nonnegative integer.

7-2
sdrinfo

Example: '1' specifies USB address 1.


Data Types: char | string

Output Arguments
hardwareInfo — RTL-SDR radio information
structure

RTL-SDR radio information, returned as a structure containing these fields.

Field Description
RadioName Device name
RadioAddress USB address of the RTL-SDR radio
RadioIsOpen Flag for open devices
TunerName Tuner chip name
Manufacturer Manufacturer name
Product Product name
GainValues Gain values (in dB) supported by the tuner chip.
These values are displayed only when the
comm.SDRRTLReceiver System object property
EnableTunerAGC is set to 0 (false) or the RTL-
SDR Receiver block parameter Tuner Gain
source is set to Dialog or Property.
RTLCrystalFrequency RTL chip crystal oscillator frequency (in Hz)
TunerCrystalFrequency Tuner chip crystal oscillator frequency (in Hz)
SamplingMode Sampling mode, returned as one of these options.

• 'Quadrature'
• 'Direct I'
• 'Direct Q'
OffsetTuning Offset tuning mode, returned as one of the
options:

• 'Disabled'
• 'Enabled'

Note The sdrinfo function returns all valid radio settings as long as the comm.SDRRTLReceiver
System object or RTL-SDR Receiver block is unlocked. If the comm.SDRRTLReceiver System object
or RTL-SDR Receiver block is currently running, sdrinfo returns only the top three fields of the
hardwareInfo output argument: RadioName, RadioAddress, and RadioIsOpen.

Version History
Introduced in R2014a

7-3
7 Functions

See Also
Functions
sdrsetup

Objects
comm.SDRRTLReceiver

Blocks
RTL-SDR Receiver

7-4
sdrsetup

sdrsetup
Set up MATLAB to interact with RTL-SDR radios

Syntax
sdrsetup

Description
sdrsetup sets up the system PATH and LD_LIBRARY_PATH variables in the current MATLAB session
to use Communications Toolbox Support Package for RTL-SDR Radio features. Run this command at
the start of a new MATLAB session before using Communications Toolbox Support Package for RTL-
SDR Radio features. You can automate this step for future sessions by adding sdrsetup to your
startup.m file. For more information on how to create or modify a startup script, see “Startup
Options in MATLAB Startup File”.

Examples

Set Up MATLAB® Environment to Use RTL-SDR Radios

Modify the system PATH and LD_LIBRARY_PATH variables in the current MATLAB® session to use
Communications Toolbox Support Package for RTL-SDR Radio features.

sdrsetup

Found and setup Communications Toolbox Support Package for RTL-SDR Radio.

Version History
Introduced in R2014a

See Also
Functions
sdrinfo

Objects
comm.SDRRTLReceiver

Blocks
RTL-SDR Receiver

7-5
8

Examples
8 Examples

Airplane Tracking Using ADS-B Signals

This example shows how to track planes by processing automatic dependent surveillance-broadcast
(ADS-B) signals using MATLAB® and Communications Toolbox™. You can use captured signals or
receive signals in real time using an RTL-SDR radio, ADALM-PLUTO radio or Universal Software
Radio Peripheral (USRP™) radio. You can also visualize the tracked planes on a map using the
Mapping Toolbox™ software.

Required Hardware and Software

To run this example using captured signals, you need the following software:

• Communications Toolbox™

To receive signals in real time, you need one of these SDR devices and the corresponding support
package Add-On:

• An RTL-SDR radio and the Communications Toolbox Support Package for RTL-SDR Radio software
Add-On

• An ADALM-PLUTO radio and the Communications Toolbox Support Package for Analog Devices®
ADALM-PLUTO Radio software Add-On

• A USRP radio and the Communications Toolbox Support Package for USRP Radio software Add-On

For a full list of Communications Toolbox supported SDR platforms, see the Supported Hardware
section of Software Defined Radio (SDR) discovery page.

Introduction

ADS-B is a cooperative surveillance technology for tracking aircraft. This technology enables an
aircraft to periodically broadcast its position information such as altitude, GPS coordinates, and
heading, using the Mode-S signaling scheme.

Mode-S is a type of aviation transponder interrogation mode. When an aircraft receives an


interrogation request, it sends back the squawk code of the transponder. This is referred to as Mode
3A. Mode-S (Select) is another type of interrogation mode that is designed to help avoid interrogating
the transponder too often. More details about Mode-S can be found in [ 1 ]. This mode is widely
adopted in Europe and is being phased in for North America.

Mode-S signaling scheme uses squitter messages, which are defined as a non-solicited messages used
in aviation radio systems. Mode-S has these attributes:

• A transmit frequency of 1090 MHz


• Pulse Position Modulation (PPM)
• A data rate of 1 Mbit/s
• A short squitter length of 56 microseconds
• An extended squitter length of 112 microseconds

Short squitter messages contain these fields:

• Downlink Format (DF)

8-2
Airplane Tracking Using ADS-B Signals

• Capability (CA)
• Aircraft ID, which comprises of a unique 24-bit sequence
• CRC Checksum

Extended squitter (ADS-B) messages contain all the information in a short squitter and one of these
values:

• Altitude
• Position
• Heading
• Horizontal and Vertical Velocity

The signal format of Mode-S has a sync pulse that is 8 microseconds long followed by 56 or 112
microseconds of data, as this figure shows.

Receiver Structure

This block diagram summarizes the receiver code structure. The processing has four main parts:
signal source, physical layer, message parser, and data viewer.

Signal Source

You can specify one of these signal sources:

• ''Captured Signal'' - Over-the-air signals written to a file and sourced from a Baseband File
Reader object at 2.4 Msps
• ''RTL-SDR Radio'' - RTL-SDR radio at 2.4 Msps
• ''ADALM-PLUTO Radio'' - ADALM-PLUTO radio at 12 Msps
• ''USRP Radio'' - USRP radio at 20 Msps for all radios, except N310/N300 series that uses 2.4
Msps

8-3
8 Examples

If you set ''RTL-SDR'' or ''ADALM-PLUTO'' or ''USRP Radio'' as the signal source, the
example searches your computer for the radio an RTL-SDR radio at radio address '0' or an ADALM-
PLUTO radio at radio address 'usb:0' and uses it as the signal source.

The extended squitter message is 120 micro seconds long, so the signal source is configured to
process enough samples to contain 180 extended squitter messages simultaneously, and set
SamplesPerFrame of the signal property accordingly. The rest of the algorithm searches for Mode-S
packets in this frame of data and returns all correctly identified packets. This type of processing is
reffered to as batch processing. An alternative approach is to process one extended squitter message
at a time. This single packet processing approach incurs 180 times more overhead than the batch
processing, while it has 180 times less delay. Since the ADS-B receiver is delay tolerant, you use
batch processing in this example.

Physical Layer

The physical layer (PHY) processes the baseband samples from the signal source to produce packets
that contain the PHY layer header information and raw message bits. This diagram shows the
physical layer structure.

The RTL-SDR radio can use a sampling rate in the range [200e3, 2.8e6] Hz. When the source is an
RTL-SDR radio, the example uses a sampling rate of 2.4 MHz and interpolates by a factor of 5 to a
practical sampling rate of 12 MHz.

The ADALM-PLUTO radio can use a sampling rate in the range [520e3, 61.44e6] Hz. When the source
is an ADALM-PLUTO, the example samples the input directly at 12 MHz.

The USRP radios are capable of using different sampling rates. When the USRP radio is the source,
the example samples the input directly at 20 MHz sample rate for most of the radios. For the N310/
N300 radio the data is received at 2.4 MHz sample rate and interpolates by a factor of 5 to a practical
sampling rate of 12e6.

For example, if the data rate is 1 Mbit/s and the effective sampling rate is 12 MHz, the signal contains
12 samples per symbol. The receive processing chain uses the magnitude of the complex symbols.

The packet synchronizer works on subframes of data equivalent to two extended squitter packets,
that is, 1440 samples at 12 MHz or 120 micro seconds. This subframe length ensures that the
subframe contains whole extended squitter. The packet synchronizer first correlates the received
signal with the 8 microsecond preamble and finds the peak value. The synchronizer then validates the
synchronization point by checking if it matches the preamble sequence, [1 0 0 0 0 0 1 0 1 0 0 0 0 0 0],
where a value of 1 represents a high value and a value of 0 represents a low value.

The Mode-S PPM scheme defines two symbols. Each symbol has two chips, where one has a high
value and the other has a low value. If the first chip is high and the subsequent chip is low, the symbol

8-4
Airplane Tracking Using ADS-B Signals

is 1. Alternatively, if the first chip is low and the subsequent chip is high chip, then the symbol is 0.
The bit parser demodulates the received chips and creates a binary message. A CRC checker then
validates the binary message. The output of the bit parser is a vector of Mode-S physical layer header
packets that contain these fields:

• RawBits - Raw message bits


• CRCError - FALSE if CRC passes, TRUE if CRC fails
• Time - Time of reception in seconds, from the start of reception
• DF - Downlink format (packet type)
• CA - Capability

Message Parser

The message parser extracts data from the raw bits based on the packet type described in [ 2 ]. This
example can parse short squitter packets and extended squitter packets that contain airborne
velocity, identification, and airborne position data.

Data Viewer

The data viewer shows the received messages on a graphical user interface (GUI). For each packet
type, the data viewer shows the number of detected packets, the number of correctly decoded
packets, and the packet error rate (PER). As the radio captures data, the application lists information
decoded from these messages in a table.

Track Airplanes Using ADS-B Signals

The receiver prompts you for user input and initializes variables. After you set the input values call
the signal source, physical layer, message parser, and data viewer in a loop. The loop keeps track of
the radio time using the frame duration.

% The default configuration runs using captured data. You can set
% |cmdlineInput| to |1|, then run the example to optionally change these
% configuration settings:
% # Reception duration in seconds,
% # Signal source (captured data or RTL-SDR radio or ADALM-PLUTO radio or USRP radio),
% # Optional output methods (map and/or text file).

% For the option to change default settings, set |cmdlineInput| to 1.


cmdlineInput = 0;
if cmdlineInput
% Request user input from the command-line for application parameters
userInput = helperAdsbUserInput;
else
load('defaultinputsADSB.mat');
end

% Calculate ADS-B system parameters based on the user input


[adsbParam,sigSrc] = helperAdsbConfig(userInput);

% Create the data viewer object and configure based on user input
viewer = helperAdsbViewer('LogFileName',userInput.LogFilename, ...
'SignalSourceType',userInput.SignalSourceType);
if userInput.LogData
startDataLog(viewer);
end

8-5
8 Examples

if userInput.LaunchMap
startMapUpdate(viewer);
end

% Create message parser object


msgParser = helperAdsbRxMsgParser(adsbParam);

% Start the viewer and initialize radio time


start(viewer)
radioTime = 0;

% Main loop
while radioTime < userInput.Duration

if adsbParam.isSourceRadio
if adsbParam.isSourcePlutoSDR
[rcv,~,lostFlag] = sigSrc();
else
[rcv,~,lost] = sigSrc();
lostFlag = logical(lost);
end
else
rcv = sigSrc();
lostFlag = false;
end

% Process physical layer information (Physical Layer)


[pkt,pktCnt] = helperAdsbRxPhy(rcv,radioTime,adsbParam);

% Parse message bits (Message Parser)


[msg,msgCnt] = msgParser(pkt,pktCnt);

% View results packet contents (Data Viewer)


update(viewer,msg,msgCnt,lostFlag);

% Update radio time


radioTime = radioTime + adsbParam.FrameDuration;
end

% Stop the viewer and release the signal source


stop(viewer)
release(sigSrc)

8-6
Airplane Tracking Using ADS-B Signals

This figure shows the information about the detected airplanes.

8-7
8 Examples

You can also observe the airplanes on a map if you have a Mapping Toolbox license.

8-8
Airplane Tracking Using ADS-B Signals

Further Exploration

You can investigate ADS-B signals using the ADSBExampleApp app. Use this app to select the signal
source and change the duration. To launch the app, enter ADSBExampleApp in the MATLAB
Command Window.

References

1 International Civil Aviation Organization, Annex 10, Volume 4. Surveillance and Collision
Avoidance Systems.
2 Technical Provisions For Mode S Services and Extended Squitter (Doc 9871)

8-9
8 Examples

Ship Tracking Using AIS Signals

This example shows how to track ships by processing automatic identification system (AIS) signals.
You can use captured signals or receive signals in real time using an RTL-SDR radio, an ADALM-
PLUTO radio or a USRP™ Radio . You can also show the tracked ships on a map using the Mapping
Toolbox™.

Required Hardware and Software

To run this example using captured signals, you need the Communications Toolbox™.

To receive signals in real time, you also need one of these SDR devices and the corresponding
support package Add-On:

• An RTL-SDR radio and the Communications Toolbox Support Package for RTL-SDR Radio software
Add-On
• An ADALM-PLUTO radio and the Communications Toolbox Support Package for Analog Devices
ADALM-PLUTO Radio software Add-On
• A USRP radio and the corresponding Communications Toolbox Support Package for USRP Radio
software Add-On

For a full list of Communications Toolbox supported SDR platforms, refer to Supported Hardware
section of Software Defined Radio (SDR) discovery page.

Overview

In marine transportation, vessel traffic services use AIS as a component of the marine traffic
monitoring system. AIS performs these functions:

• Transmit vessel identifier, position, course, and speed.


• Receive and process specified interrogating calls.
• Operate continuously while sailing or at anchor.

AIS has these attributes:

• A transmit frequency in the range 156.025 MHz-162.025 MHz


• Gaussian frequency shift keying modulation
• A bit rate of 9600 bits/sec
• A transmit bandwidth-time product of 0.4
• A receive bandwidth-time product of 0.5
• A modulation index of 0.5

AIS transmission packets contain these fields:

• Training Sequence — 24-bit sequence of alternating zeros and ones (0101...)


• Start Flag — 8-bit sequence, 01111110
• Data — The data portion is 168 bits long in the default transmission packet
• Frame Check Sequence (FCS) — Uses the cyclic redundancy check (CRC) 16-bit polynomial to
calculate the checksum

8-10
Ship Tracking Using AIS Signals

• End Flag — Identical to the start flag


• Buffer — 24 bits long to account for bit stuffing (maximum 4 bits), distance delay (14 bits), and
synchronization jitter (6 bits)

This figure shows the AIS packet format

Receiver Structure

This block diagram shows the receiver code structure. The processing has three main parts: signal
source, physical layer and data viewer.

Signal Source

Specify the signal source as one of these values

• ''File'' — Uses the comm.BasebandFileReader object to read a file that contains a captured
signal.
• ''RTL-SDR'' — Uses an RTL-SDR radio to receive a live signal.
• ''ADALM-PLUTO'' — Uses a Pluto radio to receive a live signal.
• ''USRP'' — Uses a USRP radio to receive a live signal.

The example uses a signal symbol rate of 9600 Hz and 24 samples per symbol.

8-11
8 Examples

If you specify ''RTL-SDR'' as the signal source, the example searches your computer for an RTL-SDR
radio at the radio address '0' and uses that radio as the signal source.

If you specify ''ADALM-PLUTO'' as the signal source, the example searches your computer for a Pluto
radio at the radio address 'usb:0' and uses that radio as the signal source.

If you specify ''USRP'' as the signal source, the example searches your computer for a USRP radio at
the radio address you specify and uses that radio as the signal source.

Physical Layer

The physical layer (PHY) processes the baseband samples from the signal source to produce packets
that contain the ship position information and raw message bytes. This figure shows the PHY
processing components.

• Packet Search — Search for the strongest burst in the received signal by dividing into multiple
windows.
• DC Offset Removal — Remove DC offset from the detected signal.
• Frequency Compensation — Estimate and compensate for the carrier frequency offset.
• Matched Filtering — Perform filtering with a Gaussian pulse generated according to AIS
specifications.
• Synchronization and Demodulation — Perform timing synchronization by correlating the received
signal with the known preamble and demodulate to produce bits.
• AIS Bit Parser — Detect the Start Flag and End Flags, then perform CRC detection. If the CRC is
successful, then decodes the ship information.

AIS signal contains 64 specific message types. Ship position information is included in 11 of the
message types. In this example, you decode all of the 11 message types that contain ship position
information.

This example lists the ship position information including the ship ID, latitude, and longitude, as well
as the associated date and time in a table. For decoding additional information from the messages,
see [1 on page 8-15].

Data Viewer

8-12
Ship Tracking Using AIS Signals

The data viewer shows the received messages on a graphical user interface (GUI). As data is
captured, the application lists information that it decodes from these messages in a table.

Track Ships Using AIS Signals

The default configuration runs for a duration of 10 seconds and uses signal data from a captured data
file, and outputs to a text file. To provide input values from the command line, you must change
cmdlineInput to 1, then you will be prompted to enter the following information when you run the
example:
1 Reception duration in seconds,
2 Signal source (Captured data file or RTL-SDR radio or ADALM-PLUTO radio or USRP radio),
3 Optional output methods (map, text file, or both).
cmdlineInput = 0;
if cmdlineInput
% Request user input from the command-line for application parameters
userInput = helperAISUserInput;
else
load('defaultInputs.mat');
end
% Calculate AIS parameters based on the user input
[aisParam,sigSrc] = helperAISConfig(userInput);

% Create the data viewer object and configure based on user input
viewer = helperAISViewer('LogFileName',userInput.LogFilename, ...
'SignalSourceType',userInput.SignalSourceType);

% Launch map based on user input


if userInput.LaunchMap
startMapUpdate(viewer);
end

% Log data based on user input


if userInput.LogData
startDataLog(viewer);
end

% Start the viewer and initialize radio time


start(viewer)
radioTime = 0;

% Main loop for capturing and decoding the AIS samples


while radioTime < userInput.Duration
if aisParam.isSourceRadio
if aisParam.isSourceRTLSDRRadio % For RTL-SDR
[rcv,~,lost,~] = sigSrc();
lostFlag = logical(lost);
elseif aisParam.isSourcePlutoSDRRadio % For ADALM-PLUTO
[rcv,~,lostFlag] = sigSrc();
elseif aisParam.isSourceUSRPRadio % For USRP
[rcv,~,lostFlag] = sigSrc();
end
else % For baseband file
rcv = sigSrc();
lostFlag = uint32(0);
end

8-13
8 Examples

% Recover the information by decoding AIS samples


[info, pkt] = helperAISRxPhy(rcv,aisParam);

% View decoded information on viewer


update(viewer, info, pkt, lostFlag);

% Update radio time


radioTime = radioTime + aisParam.FrameDuration;
end

% Stop the viewer and release the signal source


stop(viewer)

release(sigSrc)

If you have the Mapping Toolbox, you can also observe AIS tracking of ships on a map.

8-14
Ship Tracking Using AIS Signals

Further Exploration

You can investigate AIS signals using the AISExampleApp. To launch the app, enter AISExampleApp
in the MATLAB® Command Window. Use the app interface to select the signal source and change the
duration.

You can explore the supporting functions and System objects for details of the physical layer
implementation.

• helperAISRxPhy.m
• helperAISRxPhyPacketSearch.m
• helperAISRxPhyFreqComp.m
• helperAISRxPhySyncDemod.m
• helperAISRxPhyBitParser.m

References

8-15
8 Examples

[1] Recommendation ITU-R M.1371-5. "Technical characteristics for an automatic identification


system using time division multiple access in the VHF maritime mobile frequency band",
International Telecommunication Union. https://www.itu.int/rec/R-REC-M.1371-5-201402-I/en

8-16
Automatic Meter Reading

Automatic Meter Reading

This example shows you how to use Communications Toolbox™ to read utility meters by processing
Standard Consumption Message (SCM) signals and Interval Data Message (IDM) signals which are
emitted by Encoder-Receiver-Transmitter (ERT) compatible meters. You can either use recorded data
from a file, or receive over-the-air signals in real time using an RTL-SDR or ADALM-PLUTO radio.

In Simulink®, you can explore the “Automatic Meter Reading in Simulink” example.

Required Hardware and Software

To run this example using recorded data from a file, you need Communications Toolbox™.

To receive signals in real time, you also need one of these SDR devices and the corresponding
software add-on:

• RTL-SDR radio and the Communications Toolbox Support Package for RTL-SDR Radio add-on

• ADALM-PLUTO radio and the Communications Toolbox Support Package for Analog Devices®
ADALM-PLUTO Radio add-on

For more information, see the Software Defined Radio (SDR) discovery page.

Background

Automatic Meter Reading (AMR) is a technology that autonomously collects the consumption and
status data from utility meters (such as electric, gas, or water meters) and delivers the data to utility
providers for billing or analysis purposes. The AMR system utilizes low power radio frequency (RF)
communication to transmit meter readings to a remote receiver. The RF transmission properties
include:

• Transmission frequency within range: 910-920 MHz


• Data rate: 32768 bps
• On-off keyed Manchester coded signaling

The SCM and IDM are two types of the conventional message types that the meters send out. The
SCM packets are used with a fixed length of 96 bits, whereas IDM packets are used with a fixed
length of 736 bits. These tables show the packet format of the SCM and IDM messages:

8-17
8 Examples

Meters capable of sending both SCM and IDM messages transmit them on the same channel with
separation of roughly 275 msec. Each meter transmits the SCM and IDM messages over multiple
frequencies using a hopping pattern. The actual transmission frequencies, the frequency hopping
pattern, and the time interval between transmissions are random to avoid interference from other
transmissions. For more information, see reference [ 1 ].

Run Example

When you run the example:

• The receiver initializes the simulation parameters and calculates the AMR parameters.
• A data viewer display shows the meter ID, consumption information, and commodity type.
• The simulation loop calls the signal source, physical layer, message parser, and data viewer.
• The processing loop keeps track of the radio time using the frame duration.
• The display updates for each data capture, showing unique meter IDs with the latest consumption
information.

Initialize Parameters

The default signal source is 'File', which runs the example using the recorded baseband signal file
amr_capture_01.bb. To run the example using your RTL or ADALM-PLUTO SDR, change the
setting for signalSource when you call the helperAMRInit.m file. Valid options for signalSource
are 'File', 'RTL-SDR', and 'ADALM-PLUTO'.
signalSource = 'File';
initParam = helperAMRInit(signalSource);

% Calculate AMR system parameters based on the initialized parameters


[amrParam,sigSrc] = helperAMRConfig(initParam);

% Create the data viewer object


viewer = helperAMRViewer('MeterID',initParam.MeterID, ...
'LogData',initParam.LogData, ...
'LogFilename',initParam.LogFilename, ...
'Fc',amrParam.CenterFrequency, ...
'SignalSourceType',initParam.SignalSourceType);

8-18
Automatic Meter Reading

start(viewer);
radioTime = 0; % Initialize the radio time

% Main Processing Loop


while radioTime < initParam.Duration
rcvdSignal = sigSrc();
amrBits = helperAMRRxPHY(rcvdSignal,amrParam);
amrMessages = helperAMRMessageParser(amrBits,amrParam);
update(viewer,amrMessages);
radioTime = radioTime + amrParam.FrameDuration;
end

stop(viewer); % Stop the viewer


release(sigSrc); % Release the signal source

Receiver Code Structure

The flow chart summarizes the receiver code structure. The processing has four main parts: Signal
Source, Physical Layer, Message Parser and Data Viewer.

Signal Source

8-19
8 Examples

This example can use three signal sources:

1 ''File'': Over-the-air signals written to a file and read using a Baseband File Reader object at 1.0
Msps
2 ''RTL-SDR'': RTL-SDR radio at a sample rate of 1.0 Msps
3 ''ADALM-PLUTO'': ADALM-PLUTO radio at a sample rate of 1.0 Msps

If you assign ''RTL-SDR'' or ''ADALM-PLUTO'' as the signal source, the example searches your
computer for the radio you specified, either an RTL-SDR radio at radio address '0' or an ADALM-
PLUTO radio at radio address 'usb:0' and uses it as the signal source.

Physical Layer

The baseband samples received from the signal source are processed by the physical layer (PHY) to
produce packets that contain the SCM or IDM information. This diagram shows the physical layer
receive processing.

The RTL-SDR radio is capable of using a sampling rate in the range of 225-300 kHz or 900-2560 kHz.
The ADALM-PLUTO radio is capable of using a sampling rate in the range of 520 kHz-61.44 MHz. A
sampling rate of 1.0 Msps is used to produce a sufficient number of samples per Manchester encoded
data bit. For each frequency in the hopping pattern, every AMR data packet is transmitted. The
frequency hopping allows for increased reliability over time. Since every packet is transmitted on
each frequency hop, it is sufficient to monitor only one frequency for this example. The radio is tuned
to a center frequency of 915 MHz for the entire simulation runtime.

The received complex samples are amplitude demodulated by extracting their magnitude. The on-off
keyed Manchester coding implies the bit selection block includes clock recovery. This block outputs
bit sequences (ignoring the idle times in the transmission) which are subsequently checked for the
known preamble. If the preamble matches, the bit sequence is further decoded, otherwise, it is
discarded and the next sequence is processed.

When the known SCM preamble is found for a bit sequence, the received message bits are decoded
using a shortened (255,239) BCH code which can correct up to two bit errors. In the case where the
known IDM preamble is found, the receiver performs a cyclic redundancy check (CRC) of the meter
serial number and of the whole packet starting at the Packet type (the 5th byte) to determine if the
packet is valid. Valid, corrected messages are passed onto the AMR message parser.

Message Parser

For a valid message, the bits are then parsed into the specific fields of the SCM or the IDM format.

Data Viewer

8-20
Automatic Meter Reading

The data viewer shows the decoded packets on a separate MATLAB® figure. For each successfully
decoded packet, the meter ID, commodity type, AMR packet type, consumption information and the
capture time is shown. As data is captured and decoded, the application lists the information decoded
from these messages in a tabular form. The table lists only the unique meter IDs with their latest
consumption information.

You can also change the meter ID and start text file logging using the data viewer.

• Meter ID - Change the meter ID from 0, which is the default value and is reserved for displaying
all detected meters, to a specific meter ID which you would like to be displayed.

• Log data to file - Save the decoded messages in a TXT file. You can use the saved data for post
processing.

Further Exploration

The data file accompanying the example has only one meter reading and has been captured at center
frequency of 915 MHz. Using RTL-SDR or ADALM-PLUTO, the example will display readings from
multiple meters when it is run for a longer period in a residential neighborhood.

You can further explore AMR signals using the AMRExampleApp user interface. This app allows you
to select the signal source and change the center frequency of the RTL-SDR or ADALM-PLUTO. This
link launchs the AMRExampleApp app shown here.

You can also explore the following functions for details of the physical layer, AMR message formats:

• helperAMRRxPHY.m
• helperAMRRxDiscreteEvent.m
• helperAMRRxBitParser.m
• helperAMRMessageParser.m

8-21
8 Examples

For a version of the example that works with multiple radios, see AMRMultipleRadios.m. The multiple
radio version allows you to examine the frequency hop patterns for a meter by setting different center
frequencies per radio device available. The script is set for two radios, but can be extended for any
number.

Selected Bibliography

1 Automatic meter reading, https://en.wikipedia.org/wiki/Encoder_receiver_transmitter, 2016.


2 Itron Electricity meters, https://www.itron.com/solutions/who-we-serve/electricity, 2017.

8-22
FM Broadcast Receiver

FM Broadcast Receiver

This example shows how to build an FM mono or stereo receiver using MATLAB® and
Communications Toolbox™. You can either use captured signals, or receive signals in real time using
the RTL-SDR Radio, ADALM-PLUTO Radio or USRP™ Radio.

Required Hardware and Software

To run this example using recorded data from a file, you need Communications Toolbox™.

To receive signals in real time, you also need one of these SDR devices and the corresponding
software add-on:

• RTL-SDR radio and the Communications Toolbox Support Package for RTL-SDR Radio add-on

• ADALM-PLUTO radio and the Communications Toolbox Support Package for Analog Devices®
ADALM-PLUTO Radio add-on

• USRP radio and the Communications Toolbox Support Package for USRP® Radio add-on

For more information, see the Software Defined Radio (SDR) discovery page.

Background

FM broadcasting uses frequency modulation (FM) to provide high-fidelity sound transmission over
broadcast radio channels. Pre-emphasis and de-emphasis filters are used to reduce the effect of noise
on high audio frequencies. Stereo encoding enables simultaneous transmission of both left and right
audio channels over the same FM channel [ 1 ].

Run the Example

To and run the example, you need to enter the following information:
1 Reception duration in seconds
2 Signal source (captured data, RTL-SDR radio, ADALM-PLUTO radio or USRP radio)
3 FM channel frequency

The example plays the received audio over your computer's speakers.

NOTE: This example utilizes a center frequency that is outside the default PlutoSDR tuning range. To
use your ADALM-PLUTO radio outside the qualified tuning range, at the MATLAB® command line,
run configurePlutoRadio (Communications Toolbox Support Package for Analog Devices ADALM-
Pluto Radio) using 'AD9364' as the input argument.

Receiver Structure

The FM Broadcast Demodulator Baseband System object™ converts the input sampling rate of the
228 kHz to 45.6 kHz, the sampling rate for your host computer's audio device. According to the FM
broadcast standard in the United States, the de-emphasis lowpass filter time constant is set to 75
microseconds. This example processes the received mono signals. The demodulator can also process
stereo signals.

To perform stereo decoding, the FM Broadcast Demodulator Baseband object uses a peaking filter
which picks out the 19 kHz pilot tone from which the 38 kHz carrier is created. Using the resulting

8-23
8 Examples

carrier signal, the FM Broadcast Demodulator Baseband block downconverts the L-R signal, centered
at 38 kHz, to baseband. Afterwards, the L-R and L+R signals pass through a 75 microsecond de-
emphasis filter . The FM Broadcast Demodulator Baseband block separates the L and R signals and
converts them to the 45.6 kHz audio signal.

Example Code

The receiver asks for user input and initializes variables. Then, it calls the signal source and FM
broadcast receiver in a loop. The loop also keeps track of the radio time using the frame duration and
lost samples reported by the signal source.

The latency output of the signal source is an indication of when the samples were actually received
and can be used to determine how close to real time the receiver is running. A latency value of 1 and
a lost samples value of 0 indicates that the system is running in real time. A latency value of greater
than one indicates that the receiver was not able to process the samples in real time. Latency is
reported in terms of the number of frames. It can be between 1 and 128. If latency is greater than
128, then samples are lost.
%For the option to change default settings, set |cmdlineInput| to 1.
cmdlineInput = 0;
if cmdlineInput
% Request user input from the command-line for application parameters
userInput = helperFMUserInput;
else
load('defaultinputsFM.mat');
end

% Calculate FM system parameters based on the user input


[fmRxParams,sigSrc] = helperFMConfig(userInput);

% Create FM broadcast receiver object and configure based on user input


fmBroadcastDemod = comm.FMBroadcastDemodulator(...
'SampleRate', fmRxParams.FrontEndSampleRate, ...
'FrequencyDeviation', fmRxParams.FrequencyDeviation, ...
'FilterTimeConstant', fmRxParams.FilterTimeConstant, ...
'AudioSampleRate', fmRxParams.AudioSampleRate, ...
'Stereo', false);

% Create audio player


player = audioDeviceWriter('SampleRate',fmRxParams.AudioSampleRate);

% Initialize radio time


radioTime = 0;

% Main loop
while radioTime < userInput.Duration
% Receive baseband samples (Signal Source)
if fmRxParams.isSourceRadio
if fmRxParams.isSourcePlutoSDR
rcv = sigSrc();
lost = 0;
late = 1;
elseif fmRxParams.isSourceUsrpRadio
rcv= sigSrc();
lost = 0;
else
[rcv,~,lost,late] = sigSrc();

8-24
FM Broadcast Receiver

end
else
rcv = sigSrc();
lost = 0;
late = 1;
end

% Demodulate FM broadcast signals and play the decoded audio


audioSig = fmBroadcastDemod(rcv);
player(audioSig);

% Update radio time. If there were lost samples, add those too.
radioTime = radioTime + fmRxParams.FrontEndFrameTime + ...
double(lost)/fmRxParams.FrontEndSampleRate;
end

% Release the audio and the signal source


release(sigSrc)
release(fmBroadcastDemod)
release(player)

Further Exploration

To further explore the example, you can vary the center frequency of the RTL-SDR radio, ADALM-
PLUTO radio or USRP radio and listen to other radio stations.

You can set the Stereo property of the FM demodulator object to true to process the signals in stereo
fashion and compare the sound quality.

You can explore following function for details of the system parameters:

• helperFMConfig.m

You can further explore the FM signals using FMReceiverExampleApp user interface. This app allows
you to select the signal source and change the center frequency of the RTL-SDR radio, ADALM-
PLUTO radio or USRP radio. To launch the app, type FMReceiverExampleApp in the MATLAB
Command Window. This user interface is shown in the following figure

8-25
8 Examples

Selected Bibliography

1 https://en.wikipedia.org/wiki/FM_broadcasting

8-26
Frequency Offset Calibration for Receivers

Frequency Offset Calibration for Receivers

This example shows how to measure and calibrate for the frequency offset between a transmitter and
a receiver at the receiver using MATLAB® and Communications Toolbox™. You can either use
captured signals or receive signals in real time using the Communications Toolbox Support Package
for RTL-SDR Radio. The receiver monitors the received signal, calculates the frequency offset
between the transmitter and the receiver and displays it in the MATLAB® command window.

Required Hardware and Software

To run this example using captured signals, you need the Communications Toolbox™.

To receive signals in real time, you also need an RTL-SDR radio and the corresponding
Communications Toolbox Support Package for RTL-SDR Radio support package Add-On.

For a full list of Communications Toolbox supported SDR platforms, refer to Supported Hardware
section of Software Defined Radio (SDR) discovery page.

If you choose to receive signals in real time using a radio, you need to tune to a known broadcast
pilot tone or provide a signal source with a known center frequency to establish a baseline. If you do
not have a signal generator available, you can use a low-cost Family Radio Service walkie-talkie as a
source. Note that the signal source must be narrowband, with a sine wave being an ideal source.

Background

All radio receivers exhibit a frequency offset as compared to the transmitter. In some cases, the
frequency offset may be more than the receiver algorithm can handle. Therefore, you may need to
calibrate your receiver to minimize the frequency offset.

The example provides the following information about the communication link:

• The quantitative value of the frequency offset in Hz and PPM


• A graphical view of the qualitative SNR level of the received signal

If you have a transmitter, you can use it to generate a narrowband signal, such as a tone.

If you do not have a transmitter, you may be able to use a broadcast signal. For example, in USA, the
ATSC digital TV signals include a narrowband pilot tone on the RF carrier. The pilot tone is usually at
a nominal frequency of 309.440 kHz above the bottom edge of the channel. If such a signal is present
in your area, you can set the expected center frequency value to the frequency of the tone. This
example uses the pilot tone of channel 29, which is at approximately 560e6 + 309.440e3 Hz. For a list
of channel number and frequency values, see North American television frequencies.

If you are using an RTL-SDR radio as the receiver, specify the displayed PPM correction value as the
FrequencyCorrection property of the RTL-SDR Receiver System object™ to compensate for the
frequency offset. Be sure to use the sign of the offset in your specification. Once you've done that, the
spectrum displayed by the receiver's spectrum analyzer System object should have its maximum
amplitude at roughly 0 Hz.

Run the Example

Begin transmitting with your known signal source. If you are in the USA, you can set the expected
center frequency to the pilot tone of a near by digital TV transmitter.

8-27
8 Examples

The FrequencyOffsetCalibrationForReceiversExample script displays the spectrum of the


received signal on a frequency range of -200 kHz to 200 kHz and prints the estimated frequency
offset in Hz and PPM in the command window. In the case shown below, the frequency of the
maximum received signal power is about -35 kHz.

Example Code

The receiver asks for user input and initializes variables. Then it calls the signal source, DC blocker,
coarse tone frequency offset estimator, and spectrum analyzer in a loop. The loop also keeps track of
the radio time using the frame duration.
% Request user input from command-line for application parameters
userInput = helperFrequencyCalibrationUserInput;

% Calculate system parameters based on the user input


[fcParam,sigSrc] = helperFrequencyCalibrationConfig(userInput);

% Create a DC blocker system object to remove the DC component of the


% received signal and increase accuracy of the frequency offset estimation.
dcBlocker = dsp.DCBlocker('Algorithm', 'Subtract mean');

% Create a coarse frequency offset estimation System Object to calculate


% the offset. The system object performs an FFT on its input signal and
% finds the frequency of maximum power. This quantity is the frequency
% offset.
CFO = comm.CoarseFrequencyCompensator( ...
'FrequencyResolution', 25, ...
'SampleRate', fcParam.FrontEndSampleRate);

% Create a spectrum analyzer scope to visualize the signal spectrum


scope = spectrumAnalyzer(...
'Name', 'Actual Frequency Offset',...
'Title', 'Actual Frequency Offset', ...
'SpectrumType', 'Power',...
'FrequencySpan', 'Full', ...
'SampleRate', fcParam.FrontEndSampleRate, ...
'YLimits', [-40,10],...
'SpectralAverages', 50, ...
'FrequencySpan', 'Start and stop frequencies', ...
'StartFrequency', -200e3, ...
'StopFrequency', 200e3,...
'Position', figposition([50 30 30 40]));

Stream Processing
msgLength = 0;
radioTime = 0;
secondCounter = 1;
while radioTime < userInput.Duration
rxSig = sigSrc();
rxSig = dcBlocker(rxSig);
[~, offset] = CFO(rxSig);
freqCorrection = (-offset / fcParam.ExpectedFrequency) * fcParam.FrontEndSampleRate;

% Visualize spectrum and print results


scope(rxSig);
if radioTime > secondCounter
fprintf(repmat('\b', 1, msgLength));

8-28
Frequency Offset Calibration for Receivers

msg = sprintf(['Frequency offset = %f Hz,\n' ...


'Frequency correction value (Hz) = %f \n' ...
'Frequency correction value (PPM) = %f \n'], ...
offset, -offset, freqCorrection);
fprintf(msg);
msgLength = numel(msg);
secondCounter = secondCounter + 1;
end

% Update radio time


radioTime = radioTime + fcParam.FrameDuration;
end

% Release all System objects


release(sigSrc);
release(dcBlocker);
release(CFO);

Frequency offset = -35808.562500 Hz,


Frequency correction value (Hz) = 35808.562500
Frequency correction value (PPM) = 63.908546

8-29
8 Examples

Conclusion

In this example, you used Communications Toolbox™ System objects to build a receiver that
calculates the relative frequency offset between a transmitter and a receiver.

8-30
FRS/GMRS Walkie-Talkie Receiver

FRS/GMRS Walkie-Talkie Receiver

This example shows how to build a walkie-talkie receiver using MATLAB® and Communications
Toolbox™. The specific radio standard this example follows is FRS/GMRS (Family Radio Service /
General Mobile Radio Service) with CTCSS (Continuous Tone-Coded Squelch System). You can use
simulated signals, captured signals, or received signals from a commercial walkie-talkie using the
Communications Toolbox Support Package for RTL-SDR Radio.

This example is designed to work with USA standards for FRS/GMRS operation. The technical
specifications for these standards can be found in the reference list below. Operation in other
countries may or may not work.

Required Hardware and Software

To run this example using captured signals, you need the following software:

• Communications Toolbox

To receive signals in real time, you also need the following hardware:

• RTL-SDR radio
• Walkie-talkie

and the following software

• Communications Toolbox Support Package for RTL-SDR Radio

For a full list of Communications Toolbox supported SDR platforms, refer to the "MATLAB and
Simulink Hardware Support for SDR" section of Software-Defined Radio (SDR).

Background

Walkie-talkies provide a subscription-free method of communicating over short distances. Although


their popularity has been diminished by the rise of cell phones, walkie-talkies are still useful when
lack of reception or high per-minute charges hinders cell phone use.

Modern walkie-talkies operate on the FRS/GMRS standards. Both standards use frequency
modulation (FM) at 462 or 467 MHz, which is in the UHF (Ultra High Frequency) band.

Run the Example

Click the 'Open Script' button to open and run the example. You need to enter the following
information:

1 Reception duration in seconds


2 Signal source (simulated signal, captured signal or RTL-SDR radio)
3 Channel number (1-14)
4 CTCSS code (1-38, 0 no CTCSS filtering)
5 Detection threshold for received signal

The example plays the received audio over your computer's speakers.

8-31
8 Examples

Receiver Structure

The following block diagram summarizes the receiver code structure. The processing has four main
parts: Signal Source, Channel Selector, FM Demodulator, and CTCSS processing.

Signal Source

This example can use three signal sources:

1 ''Simulated Signal'': Simulated FRS/GMRS signal at 240e3 samples/sec


2 ''Captured Signal'': Over-the-air signals written to a file and sourced from a baseband file reader
object at 240e3 samples/sec
3 ''RTL-SDR Radio'': RTL-SDR radio at 240e3 samples/sec

If you choose ''RTL-SDR Radio'' as the signal source, this application will search your computer for
RTL-SDR radios and ask you to choose one of them as the signal source.

Channel Selector

The receiver removes the DC component and applies a variable gain to the received signal to obtain
an approximately known amplitude signal with reduced interference. The receiver then applies a low
pass channel separation filter to reduce the signals from adjacent channels. The gap between
adjacent channels is 25 kHz, which means the baseband bandwidth is, at most, 12.5 kHz. Thus, we
choose the cutoff frequency to be 10 kHz.

Next, a channel selector computes the average power of the filtered signal. If it is greater than a
threshold (set to a default of 10%), the channel selector determines that the received signal is from
the correct channel and allows the signal to pass through. In the case of an out-of-band signal,
although the channel separation filter reduces its magnitude, it is still FM modulated and the
modulating signal will be present after FM demodulation. To completely reject such a signal, the
channel selector outputs all zeros.

FM Demodulator

This example uses the FM Demodulator Baseband System object™ whose sample rate and maximum
frequency deviation are set to 240 kHz and 2.5 kHz, respectively.

CTCSS

First, a decimation filter converts the sampling rate from 240 kHz to 8 kHz. This rate is one of the
native sampling rates of your host computer's output audio device. Then, the CTCSS decoder
computes the power at each CTCSS tone frequency using the Goertzel algorithm and outputs the
code with the largest power. The Goertzel algorithm provides an efficient method to compute the

8-32
FRS/GMRS Walkie-Talkie Receiver

frequency components at predetermined frequencies, that is, the tone code frequencies used by FRS/
GMRS.

The script compares the estimated received code with the preselected code. If the two codes match,
the signals are passed to the audio device. When the preselected code is zero, it indicates no squelch
system is used and the decision block passes the signal at the channel to the audio device no matter
which code is used.

Finally, a high pass filter with a cutoff frequency of 260 Hz filters out the CTCSS tones, which have a
maximum frequency of 250 Hz. Use an audioDeviceWriter System object™ to play the received
signals through your computer's speakers. If you do not hear any sound, select another device using
the DeviceName property of the audio device writer object, audioPlayer.

Example Code

The receiver asks for user input and initializes variables. Then it calls the signal source, channel
selector, FM demodulator, and CTCSS processor in a loop. The loop also keeps track of the radio time
using the frame duration and lost samples reported by the signal source.

The latency output of the signal source is an indication of when the samples were actually received
and can be used to determine how close to real time the receiver is running. A latency value of 1 and
a lost samples value of 0 indicates that the system is running in real-time. A latency value of greater
than one indicates that the receiver was not able to process the samples in real time. Latency is
reported in terms of the number of frames. It can be between 1 and 128. If latency is greater than
128, then samples are lost.

% Request user input from the command-line for application parameters


userInput = helperFRSReceiverUserInput;

% Calculate FRS receiver parameters based on the user input


[frsRxParams,sigSrc] = helperFRSReceiverConfig(userInput);

% Create channel selector components


dcBlocker = dsp.DCBlocker('Algorithm', 'Subtract mean');
agc = comm.AGC;
channelFilter = frsRxParams.ChannelFilter;

% Create FM demodulator
fmDemod = comm.FMDemodulator(...
'SampleRate', frsRxParams.FrontEndSampleRate, ...
'FrequencyDeviation', frsRxParams.FrequencyDeviation);

% Create CTCSS and audio output components


decimator = dsp.FIRDecimator(...
frsRxParams.DecimationFactor, ...
frsRxParams.DecimationNumerator);
decoder = helperFRSCTCSSDecoder( ...
'MinimumBlockLength', frsRxParams.CTCSSDecodeBlockLength, ...
'SampleRate', frsRxParams.AudioSampleRate);
audioFilter = frsRxParams.AudioFilter;
audioPlayer = audioDeviceWriter(frsRxParams.AudioSampleRate);

% Initialize radio time


radioTime = 0;

% Main loop

8-33
8 Examples

while radioTime < userInput.Duration


% Receive baseband samples (Signal Source)
if frsRxParams.isSourceRadio
[rcv,~,lost,late] = sigSrc();
else
rcv = sigSrc();
lost = 0;
late = 1;
end

% Channel selector
rcv = dcBlocker(rcv);
outAGC = agc(rcv);
outChanFilt = channelFilter(outAGC);
rxAmp = mean(abs(outChanFilt));
if rxAmp > frsRxParams.DetectionThreshold
x = outChanFilt;
else
x = complex(single(zeros(frsRxParams.FrontEndSamplesPerFrame, 1)));
end

% FM demodulator
y = fmDemod(x);

% CTCSS decoder and audio output


outRC = decimator(y);
rcvdCode = decoder(outRC);
if (rcvdCode == frsRxParams.CTCSSCode) || (frsRxParams.CTCSSCode == 0)
rcvdSig = outRC;
else
rcvdSig = single(zeros(frsRxParams.AudioFrameLength, 1));
end
audioSig = audioFilter(rcvdSig);
audioPlayer(audioSig);

% Update radio time. If there were lost samples, add those too.
radioTime = radioTime + frsRxParams.FrontEndFrameTime + ...
double(lost)/frsRxParams.FrontEndSampleRate;
end

% Release the resources


release(fmDemod)
release(audioPlayer)
release(sigSrc)

Further Exploration

The CTCSS decoding computes the DFT (Discrete Fourier Transform) of the incoming signal using
the Goertzel algorithm and computes the power at the tone frequencies. Because the tone
frequencies are very close to each other (only 3-4 Hz apart) the block length of the DFT should be
large enough to provide enough resolution for the frequency analysis. However, long block lengths
cause decoding delay. For example, a block length of 16384 will cause 2 seconds of delay because the
CTCSS decoder operates at an 8 kHz sampling rate. This creates a trade-off between detection
performance and processing latency. The optimal block length may depend on the quality of the
transmitter and receiver, the distance between the transmitter and receiver, and other factors. You
are encouraged to change the block length in the initialization function by navigating to the
helperFRSReceiverConfig function and changing the value of the CTCSSDecodeBlockLength field.

8-34
FRS/GMRS Walkie-Talkie Receiver

This will enable you to observe the trade-off and find the optimal value for your transmitter/receiver
pair.

You can explore following functions and System objects for details of the physical layer
implementation:

• helperFRSReceiverConfig.m
• helperFRSCTCSSDecoder.m
• helperFRSSignalGenerator.m

References

• Family Radio Service


• General Mobile Radio Service
• Continuous Tone-Coded Squelch System
• Goertzel Algorithm

8-35
8 Examples

RDS/RBDS and RadioText Plus (RT+) FM Receiver

This example shows how to extract program or song information from FM radio stations using the
RDS or RBDS standard and, optionally, the RadioText Plus (RT+) standard. You can use a captured
signal, or receive signals over-the-air in real time using an RTL-SDR radio, an ADALM-PLUTO radio,
or a USRP B200/B210 radio.

Required Hardware and Software

To run this example using recorded data from a file, you need Communications Toolbox™.

To receive signals in real time, you also need one of these SDR devices and the corresponding
software add-on:

• RTL-SDR radio and the Communications Toolbox Support Package for RTL-SDR Radio add-on
• ADALM-PLUTO radio and the Communications Toolbox Support Package for Analog Devices®
ADALM-PLUTO Radio add-on
• USRP radio and the Communications Toolbox Support Package for USRP Radio add-on

For more information, see the Software Defined Radio (SDR) discovery page.

Background

RBDS and RDS are very similar standards specifying how to supplement FM radio signals with
additional information. RBDS is used in North America, while RDS was originally used in Europe and
evolved to an international standard. RBDS and RDS comprise 3 layers:

• Physical Layer (Layer 1)


• Data-link Layer (Layer 2)
• Session and presentation Layer (Layer 3)

Physical Layer (Layer 1)

The RBDSPhyDecoder helper receives the captured signal from a file or the live signal from the radio
and performs these steps:

• FM demodulation: Once the FM signal is demodulated, the RDS/RBDS signal resides at the 57
kHz +/- 2.4 kHz band. Be aware that the RDS/RBDS signal is transmitted with relatively low
power, so it is not always visible in the FM spectrum as shown in this figure.

8-36
RDS/RBDS and RadioText Plus (RT+) FM Receiver

FM signals contain a pilot tone at 19 kHz, which can be used as a phase and frequency reference for
coherent demodulation of the RDS/RBDS signal at 57 kHz and the stereo audio at 38 kHz. Pilot tones
at 38 kHz and 57 kHz can be generated by doubling and tripling the frequency of the 19 kHz pilot
tone [ 2 ] on page 8-45.

Processing steps for coherent demodulation of the RDS/RBDS signal are:

• Bandpass filtering: The PHY receiver conducts bandpass filtering at 19 kHz and 57 kHz, to
isolate the pilot tone and the RDS/RBDS signal, respectively.
• Frequency tripling: Raise the complex representation of the 19 kHz pilot tone to the 3rd power
to triple its frequency and obtain a 57 kHz pilot tone.
• AM Demodulation: RDS and RBDS symbols are generated at an 1187.5 Hz rate and are AM-
modulated to a 57 kHz carrier. The 57 kHz RDS/RBDS signal can be coherently demodulated with
a 57 kHz carrier that is locked in frequency and phase. Typically, the frequency-tripled 19 kHz
pilot tone suffices for coherent demodulation. The next figures show the 19 kHz and 57 kHz pilot
tones, the 57 kHz RDS/RBDS signal, and the AM-demodulated baseband RDS/RBDS signal.

8-37
8 Examples

At the same time, there exist several FM stations whose 57 kHz RDS/RBDS signal exhibits a time-
varying phase offset from the 19 kHz pilot tone and its frequency-tripled version. The PHY receiver
contains a Costas loop to compensate for such time-varying phase offsets.

• Costas loop: The Costas loop performs 2 orthogonal AM demodulations, one demodulation with a
57 kHz sine and another with a 57 kHz cosine. The sampling rate of the received signal is
carefully chosen as 228 kHz, which provides 4 samples per 57 kHz cycle. Therefore, a one sample
delay of the 57 kHz pilot tone results to a one quarter wavelength phase offset, and allows us to
generate a cosine wave from a sine wave. The sine-demodulated signal corresponds to the
coherent demodulation output. The cosine-demodulated signal is used for detection of phase error.
The products of the 57 kHz RDS/RBDS signal with the sine/cosine waves are low-pass filtered with
the filter specified in Sec. 1.7 of [ 1 ] on page 8-45. The product of the two filter outputs is an
error signal. The larger it is, the more the 19 kHz pilot tone is delayed to behave more like the
cosine-based demodulator.
• Clock extraction: To perform biphase symbol decoding, a clock matching the RDS/RBDS symbol
rate of 1187.5 Hz is extracted from the 19 kHz pilot tone. Note, 1187.5 Hz x 16 = 19 kHz. To
account for frequency offsets, frequency division is used to extract the clock from the 19 kHz pilot
tone. Since the frequency division operation provides multiple correct answers, the baseband
RDS/RBDS signal serves as training data that aid in the determination of the desired output.

8-38
RDS/RBDS and RadioText Plus (RT+) FM Receiver

• Biphase symbol decoder: RDS and RBDS use bi-phase-level (bi- ϕ -L) coding, which is commonly
known as Manchester coding. In each clock cycle, the RDS/RBDS symbol takes two opposite
amplitude values, either a positive followed by a negative, or a negative followed by a positive.
The biphase symbol decoder negates the second amplitude level, so that each symbol holds the
same amplitude level throughout the entire clock cycle. The new clock-wide amplitude level
corresponds to the symbol's bit representation. These plots correspond to the waveforms #1-6 in
Figure 2 of [ 1 ] on page 8-45.

To obtain each symbol's bit value, the waveform is integrated over each clock cycle, and the outcome
is compared to zero (slicer).

8-39
8 Examples

• Differential decoding: Finally, the bits are differentially decoded to revert the differential
encoding at the transmitter.

Data-link Layer (Layer 2)

Layer 2 is implemented using the RBDSDataLinkDecoder helper. This layer is responsible for
synchronization and error correction.

The bit output of the PHY layer is logically organized in 104-bit groups comprising four 26-bit blocks.
Each block contains a 16-bit information word and 10 parity bits (see Figure 8 in [ 1 ] on page 8-45).
A distinct 10-bit offset word is modulo-2 added to the parity bits of each block.

• Synchronization: Initially, block and group boundaries are sought exhaustively using a sliding
window of 104 bits. For each 104-bit window, the 4 offset words are sought at the last 10 bits of
each 26-bit block. An offset word is identified if no bit errors are detected by the
RBDSErrorDetection helper. Once the offset words are identified, group-level synchronization is

8-40
RDS/RBDS and RadioText Plus (RT+) FM Receiver

attained and the exhaustive sliding-window processing stops. Subsequently, the next 104 bits will
be treated as the next group.

If future groups contain bit errors and the offset words cannot be identified at their expected
position, synchronization may be lost. In this case, Layer 2 first examines the possibility of 1-bit
synchronization slips, exploiting the fact that the first information word (16 bits) is always the same
for all bit groups. If the first information word is found dislocated by 1 bit (either leftward or
rightward), synchronization is retained and the group boundaries are adjusted accordingly. If bit
errors persist for 25 group receptions and at the same time synchronization cannot be reestablished
using such leftward/rightward 1-bit shifts, then synchronization is lost and Layer 2 re-enters the
exhaustive, sliding-window-based search for synchronization.

• Error correction: The RDS/RBDS error correction code is a (26, 16) cyclic code shortened from
(341, 331). The RBDSErrorCorrection helper uses the shift-register scheme described in Annex
B of [ 1 ] on page 8-45.

Session and Presentation Layer (Layer 3)

Layer 2 removes the parity/offset bits, therefore Layer 3 receives groups of 64-bits, comprising four
16-bit blocks. There exist up to 32 different group types, each labeled with a number from 0 to 15 and
the letter 'A' or 'B', for example, 0B, 2A, 3A. The format of each group can be fixed or it can be
abstract if this group is allocated for an Open Data Application (ODA, see list in [ 3 ] on page 8-45).

Layer 3 is implemented using the RBDSSessionDecoder helper. This object supports decoding of the
0A, 0B, 2A, 2B, 3A, 4A, 10A fixed-format group types.

• 0A and 0B convey an 8-character string, which typically changes in a scrolling-text fashion.


• 2A and 2B convey longer 64- or 32-character strings.
• 3A registers ODAs and specifies their dedicated abstract-format group type.
• 4A conveys the system time.
• 10A further categorizes the program type, such as 'Football' for 'Sports' program type.

For ODAs, the RDS/RBDS receiver supports decoding of RadioText Plus (RT+). This ODA can break
down the long 32- or 64-character string from group types 2A or 2B into two specific content types
(for example, artist and song).

Registering ODA Implementations: RadioText Plus (RT+)

The RDS/RBDS receiver is extensible. ODA implementations can be specified using the
registerODA' function of the RBDSSessionDecoder helper. This function accepts the hexadecimal
ID of the ODA (ODA IDs can be found in [ 3 ] on page 8-45), and handles to the functions that
process the main ODA group type, as well as the ODA-specific part of the 3A group type. For example,
the session decoder RBDSSessionDecoder object can be extended for RadioText Plus (RT+) using
this code:
rtID = '4BD7'; % hexadecimal ID of RadioText Plus (RT+)
registerODA(sessionDecoder, rtID, @RadioTextPlusMainGroup,
@RadioTextPlus3A);

Run the Example Code

Use the helperRBDSInit helper function to set RDS/RBDS system parameters. The commented
code lines shows alternate settings to run the example from captured data or various SDRs. Use the
helperRBDSConfig helper function to configure the RDS/RBDS system.

8-41
8 Examples

userInput = helperRBDSInit();
userInput.Duration = 10.8;
% userInput.SignalSource = 'File';
% userInput.SignalFilename = 'rbds_capture.bb';
% userInput.SignalSource = 'RTL-SDR';
% userInput.CenterFrequency = 98.5e6;
% userInput.SignalSource = 'ADALM-PLUTO';
% userInput.CenterFrequency = 98.5e6;
% userInput.SignalSource = 'USRP';
% userInput.CenterFrequency = 98.5e6;

[rbdsParam, sigSrc] = helperRBDSConfig(userInput);

Create and configure an FM broadcast receiver System object™ with the RDS/RBDS parameters.

fmBroadcastDemod = comm.FMBroadcastDemodulator(...
'SampleRate',228e3, ...
'FrequencyDeviation',rbdsParam.FrequencyDeviation, ...
'FilterTimeConstant',rbdsParam.FilterTimeConstant, ...
'AudioSampleRate',rbdsParam.AudioSampleRate, ...
'Stereo',true);

% Create audio player


player = audioDeviceWriter('SampleRate',rbdsParam.AudioSampleRate);

% Layer 2 object
datalinkDecoder = RBDSDataLinkDecoder();

% Layer 3 object
sessionDecoder = RBDSSessionDecoder();
% register processing implementation for RadioText Plus (RT+) ODA:
rtID = '4BD7';
registerODA( ...
sessionDecoder,rtID,@RadioTextPlusMainGroup,@RadioTextPlus3A);

% Create the data viewer object


viewer = helperRBDSViewer();

% Start the viewer and initialize radio time


start(viewer)
radioTime = 0;
% Main loop
while radioTime < rbdsParam.Duration
% Receive baseband samples (Signal Source)
rcv = sigSrc();

% Demodulate FM broadcast signals and play the decoded audio


audioSig = fmBroadcastDemod(rcv);
player(audioSig);

% Process physical layer (Layer 1)


bitsPHY = RBDSPhyDecoder(rcv, rbdsParam);

% Process data-link layer (Layer 2)


[enabled,iw1,iw2,iw3,iw4] = datalinkDecoder(bitsPHY);

% Process session and presentation layer (Layer 3)


outStruct = sessionDecoder(enabled,iw1,iw2,iw3,iw4);

8-42
RDS/RBDS and RadioText Plus (RT+) FM Receiver

% View results packet contents (Data Viewer)


update(viewer, outStruct);

% Update radio time


radioTime = radioTime + rbdsParam.FrameDuration;
end

% Stop the viewer and release the signal source and audio writer
stop(viewer);

release(sigSrc);
release(player);

8-43
8 Examples

Viewing Results

This window shows the processed RDS/RBDS data.

• Basic RDS/RBDS information:


• The first field contains the program type, which is conveyed by the second information word of all
group types. If 10A group types are received, the first field also provides further characterization,
such as, Sports \ Football.
• The second field contains the 8-character text conveyed by 0A/0B groups. The displayed text
wraps if the transmitted character string exceeds eight characters.
• The third field contains the longer 32/64-character text conveyed by 2A/2B group types.
• RadioText Plus (RT+): This section is populated if any 3A groups indicate that the RadioText
Plus (RT+) ODA uses an abstract-format group type, such as 11A. Upon reception of this abstract
group type, the 32/64-character text conveyed by groups 2A/2B will be split to two substrings. The
two labels will be updated to characterize the substrings (such as Artist and Song).
• Group type receptions: The tables provide a histogram displaying which group types have been
received from a station and with what frequency. As a result, users may want to look at the logged
data for further information that is not depicted in the graphical viewer (specifically, system time
in 4A, alternate frequencies in 0A etc.).
• Open data applications (ODA): If any 3A group types are received, this ODA list displays the
name and the dedicated group type for each ODA received.

Further Exploration

You can further explore RDS/RBDS signals using the RBDSExampleApp app. The RBDSExampleApp
app allows you to:

• Select the source of the signal (capture file or RTL-SDR, ADALM-PLUTO or USRP).
• Specify the station frequency (for RTL-SDR, ADALM-PLUTO or USRP).
• Run Layers 1 and 2 of the RDS/RBDS receiver though generated C code. These are the most time-
consuming parts of the RDS/RBDS chain and generating code can help you achieve real-time
processing.
• Disable audio playback.
• Open scopes, such as a Spectrum Analyzer and Time Scopes, that analyze the received signal and
illustrate the decoding process. Enabling scopes requires extra computational effort and may
preclude real-time decoding. In this case, RDS/RBDS decoding may only be successful for
captured signals loaded from a file.
• Log RBDS fields from other group types by selecting Log data to file.

You can explore the RBDS implementation, initialization, and configuration in these functions and
System objects:

• RBDSPhyDecoder
• RBDSCostasLoop
• RBDSDataLinkDecoder
• RBDSSessionDecoder
• helperRBDSInit
• helperRBDSConfig

8-44
RDS/RBDS and RadioText Plus (RT+) FM Receiver

References

1. National Radio Systems Committee, United States RBDS standard, April 1998

2. Der, Lawrence. "Frequency Modulation (FM) Tutorial". Silicon Laboratories Inc.

3. National Radio Systems Committee, List of ODA Applications in RDS

4. RadioText Plus (RT+) Specification

5. Joseph P. Hoffbeck, "Teaching Communication Systems with Simulink® and the USRP", ASEE
Annual Conference, San Antonio, TX, June 2012

8-45
8 Examples

Airplane Tracking Using ADS-B Signals with Raspberry Pi and


RTL-SDR

This example shows you how to create a remote sensing station that tracks planes using a Raspberry
Pi™ and RTL-SDR radio. You will learn how to deploy a Simulink® model that processes Automatic
Dependent Surveillance-Broadcast (ADS-B) signals and sends the demodulated data to a host PC
using UDP packets for visualization.

Required Hardware and Software

To run this example, you need the following hardware:

• RTL-SDR radio
• Raspberry Pi

and the following software

• Simulink
• Communications Toolbox™
• Communications Toolbox Support Package for RTL-SDR Radio
• Simulink Support Package for Raspberry Pi Hardware
• Optionally, Mapping Toolbox™ (to track planes on a map)

For a full list of Communications Toolbox supported SDR platforms, refer to Supported Hardware
section of Software Defined Radio (SDR) discovery page.

Introduction

For an introduction on implementing a ADS-B receiver in Simulink, refer to the “Airplane Tracking
Using ADS-B Signals in Simulink” example, pictured below. We also recommend completing “Getting
Started with MATLAB Support Package for Raspberry Pi Hardware” (MATLAB Support Package for
Raspberry Pi Hardware) example.

modelName = 'ADSBSimulinkExample';
open_system(modelName);
set_param(modelName, 'SimulationCommand', 'update');

8-46
Airplane Tracking Using ADS-B Signals with Raspberry Pi and RTL-SDR

Remote ADS-B Receiver with Raspberry Pi

You can set up a remote sensing station for airplane tracking using the Raspberry Pi hardware with
an RTL-SDR radio attached to it. You can run the PHY Layer block of the ADS-B receiver on the
Raspberry Pi and send the received data over the Internet using UDP packets. You can receive these
UDP packets on your local computer and run the Message Parser and Data Viewer blocks to
visualize the results. The following is the modified remote ADS-B receiver model that runs on
Raspberry Pi.

close_system(modelName,0)
modelName = 'ADSBRaspberryPiSimulinkExample';
open_system(modelName);
set_param(modelName, 'SimulationCommand', 'update');

8-47
8 Examples

Run ADS-B Receiver Model on Raspberry Pi Hardware

Follow the following steps to run the ADS-B receiver model on the Raspberry Pi hardware.

1. Attach an RTL-SDR radio to one of the USB ports of the Raspberry Pi hardware

2. Open the Tracking Airplanes Using ADS-B Signals with Raspberry Pi - Sensor model

3. Double-click on the UDP Send block. Open the block mask and enter the IP address of your
host computer in the Remote IP address edit box. For example, if the IP address of your host
computer is 10.10.10.1, enter '10.10.10.1' in the block mask. Do not change the Remote IP port
parameter. Click OK to save and close the block mask.

4. In your Simulink model, click the Deploy To Hardware button on the toolbar.

5. The model running on Raspberry Pi hardware will start sending UDP packets to port 25000 of your
host computer.

Run ADS-B Aggregator Model on the Host Computer

Follow the following steps to run the host model that receives the UDP packets sent by the model
running on Raspberry Pi hardware.

1. Open the Tracking Airplanes Using ADS-B Signals - Aggregator. This model has a UDP Receive
block that is configured to receive UDP packets sent by the model running on Raspberry Pi hardware.
Double-click on the UDP Receive block mask. Note that the Local IP port is set to 25000, and the
output data type is set to "uint8".

2. Click the Play button to start the model.

close_system(modelName,0)
modelName = 'ADSBAggregatorSimulinkExample';
open_system(modelName);
set_param(modelName, 'SimulationCommand', 'update');

8-48
Airplane Tracking Using ADS-B Signals with Raspberry Pi and RTL-SDR

The following figures illustrate how the application tracks and lists flight details and displays them on
a map.

8-49
8 Examples

8-50
Airplane Tracking Using ADS-B Signals with Raspberry Pi and RTL-SDR

Stop the Model Running on Raspberry Pi Hardware

When you want to stop the model running on Raspberry Pi, execute the following on MATLAB®
command line.

rPi = raspberrypi;
stop(rPi,'ADSBRaspberryPiSimulinkExample');

Troubleshooting

If you cannot receive any data on the host model, make sure that the Raspberry Pi and your host
computer are on the same local area network. In other words, make sure that the first three numbers
of the IP addresses are the same.

Also, make sure that your Internet security software allows the transmission and reception of UDP
packets on port 25000.

close_system(modelName,0)

8-51
8 Examples

Airplane Tracking Using ADS-B Signals in Simulink

This example shows how to track planes by processing automatic dependent surveillance-broadcast
(ADS-B) signals using Simulink® and Communications Toolbox™. You can use captured and saved
signals, or receive signals in real time using an RTL-SDR radio, an ADALM-PLUTO radio or a
Universal Software Radio Peripheral (USRP™) radio. You can also visualize the tracked planes on a
map, if you have the Mapping Toolbox™ software.

Required Hardware and Software

To run this example using captured signals, you need Simulink® and Communications Toolbox™
software.

To receive signals in real time, you also need one of these SDR devices and the corresponding
software add-on:

• An RTL-SDR radio and Communications Toolbox Support Package for RTL-SDR Radio add-on
• An ADALM-PLUTO radio and Communications Toolbox Support Package for Analog Devices®
ADALM-PLUTO Radio add-on
• A USRP radio and the corresponding Communications Toolbox Support Package for USRP Radio
Add-On

For a full list of Communications Toolbox supported SDR platforms, refer to Supported Hardware
section of Software Defined Radio (SDR) discovery page.

Introduction

For an introduction on the Mode-S signaling scheme and ADS-B technology for tracking aircraft, refer
to the “Airplane Tracking Using ADS-B Signals” MATLAB® example.

Receiver Structure

This diagram summarizes the receiver code structure. The processing has four main parts: signal
source, physical layer, message parser, and data viewer.

8-52
Airplane Tracking Using ADS-B Signals in Simulink

Signal Source

You can specify one of these signal sources:

• ''Captured Signal'' - Over-the-air signals written to a file and sourced using a baseband file
reader block at 2.4 Msps
• ''RTL-SDR Radio'' - RTL-SDR radio at 2.4 Msps
• ''ADALM-PLUTO'' - ADALM-PLUTO radio at a sample rate of 12 Msps
• ''USRP Radio'' - USRP radio at a sample rate of 20 Msps for all radios except N310/N300
radio, that uses 2.4 Msps sample rate

The extended squitter message is 120 micro seconds long, so the signal source is configured to
process enough samples to contain 180 extended squitter messages simultaneously, and set
SamplesPerFrame of the signal property accordingly. The rest of the algorithm searches for Mode-S
packets in this frame of data and outputs all correctly identified packets. This type of processing is
reffered to as batch processing. An alternative approach is to process one extended squitter message
at a time. This single packet processing approach incurs 180 times more overhead than the batch
processing, while it has 180 times less delay. Since the ADS-B receiver is delay tolerant, you use
batch processing in this example.

Physical Layer

8-53
8 Examples

The physical layer (PHY) processes the baseband samples from the signal source are processed by
the to produce packets that contain the PHY layer header information and the raw message bits. This
diagram shows the physical layer structure.

The RTL-SDR radio can use a sampling rate in the range [200e3, 2.8e6] Hz. When the source is an
RTL-SDR radio, the example uses a sampling rate of 2.4 MHz and interpolates by a factor of 5 to a
practical sampling rate of 12 MHz.

The ADALM-PLUTO radio can use a sampling rate in the range [520e3, 61.44e6] Hz. When the source
is an ADALM-PLUTO radio, the example samples the input directly at 12 MHz.

The USRP radios are capable of using different sampling rates. When the source is a USRP radio, the
example samples the input directly at 20 MHz. For the N310/N300 radio the data is received at 2.4
MHz sample rate and interpolates by a factor of 5 to a practical sampling rate of 12e6.

For example, if the data rate is 1 Mbit/s and the effective sampling rate is 12 MHz, the signal contains
12 samples per symbol. The receive processing chain uses the magnitude of the complex symbols.

The packet synchronizer works on subframes of data that is equivalent to two extended squitter
packets, i.e. 1440 samples at 12 MHz or 120 micro seconds. This subframe length ensures that the
subframe contains the whole extended squitter. Packet synchronizer first correlates the received
signal with the 8 microsecond preamble and finds the peak value. The synchronizer then validates the
found synchronization point by checking if it confirms to the preamble sequence, [1 0 0 0 0 0 1 0 1 0
0 0 0 0 0], where a value of 1 represents a high value and a value of 0 represents a low value.

The Mode-S PPM scheme defines two symbols. Each symbol has two chips, where one has a high
value and the other has a low value. If the first chip is high and the subsequent chip is low, then the
symbol is 1. Alternatively, if the first chip is low and subsequent chip is high, then the symbol is 0.
The bit parser demodulates the received chips and creates a binary message. The CRC checker
validates the binary message. The output of bit parser is a vector of Mode-S physical layer header
packets that contains these fields:

• RawBits - Raw message bits


• CRCError - FALSE if CRC passes, TRUE if CRC fails
• Time - Time of reception in seconds, from the start of reception
• DF - Downlink format (packet type)
• CA - Capability

Message Parser

8-54
Airplane Tracking Using ADS-B Signals in Simulink

The message parser extracts the raw bits based on the packet type as described in [ 2 ]. This example
can parse short squitter packets and extended squitter packets that contain airborne velocity,
identification, and airborne position data.

Data Viewer

The data viewer shows the received messages on a graphical user interface (GUI). For each packet
type, the data viewer shows the number of detected packets, the number of correctly decoded
packets and the packet error rate (PER). As the radio captures data, the application lists information
decoded from these messages in a table.

Launch Map and Log Data

You can also launch the map and start text file logging using the two slider switches(Launch Map and
Log Data).

• Log Data* - When Log Data is On, it Saves the captured data in a TXT file. You can use the saved
data for later for post processing.

• Launch Map - When Launch Map is On, map will be launched where the tracked flights can be
viewed. NOTE: You must have a valid license for the Mapping Toolbox if you want to use this
feature.

These figures illustrate how the application tracks and lists flight details and displays them on a map.

8-55
8 Examples

8-56
Airplane Tracking Using ADS-B Signals in Simulink

References

1 International Civil Aviation Organization, Annex 10, Volume 4. Surveillance and Collision
Avoidance Systems.
2 Technical Provisions For Mode S Services and Extended Squitter (Doc 9871)

8-57
8 Examples

Automatic Meter Reading in Simulink

This example shows you how to use Simulink® and Communications Toolbox™ to read utility meters
by processing Standard Consumption Message (SCM) or Interval Data Message (IDM) signals
emitted by meters. You can either use recorded data from a file, or receive over-the-air signals in real
time using the RTL-SDR Radio or ADALM-PLUTO Radio.

Required Hardware and Software

To run this example using recorded data from a file, you need Simulink® and Communications
Toolbox™ software.

To receive signals in real time, you also need one of the following SDR devices and the corresponding
software add-on:

• RTL-SDR radio and Communications Toolbox Support Package for RTL-SDR Radio add-on

• ADALM-PLUTO radio and Communications Toolbox Support Package for Analog Devices®
ADALM-PLUTO Radio add-on

For a full list of Communications Toolbox supported SDR platforms, refer to Supported Hardware
section of the Software Defined Radio (SDR) discovery page.

Introduction

For an introduction to the SCM/IDM signaling scheme and AMR technology for reading utility meters,
refer to the “Automatic Meter Reading” example in MATLAB®.

Receiver Model Structure

The following block diagram summarizes the receiver structure. The processing has four main parts:
Signal Source, Physical Layer, Message Parser, and Data Viewer.

8-58
Automatic Meter Reading in Simulink

Signal Source

This example can use three signal sources:

1 ''File'': Over-the-air signals written to a file and read using a Baseband File Reader block at 1.0
Msps
2 ''RTL-SDR Radio'': RTL-SDR radio at a sample rate of 1.0 Msps
3 ''ADALM-PLUTO Radio'': ADALM-PLUTO radio at a sample rate of 1.0 Msps

If you assign ''RTL-SDR'' or ''ADALM-PLUTO'' as the signal source, the example searches your
computer for the radio you specified, either an RTL-SDR radio at radio address '0' or an ADALM-
PLUTO radio at radio address 'usb:0' and uses the radio as the signal source.

Physical Layer

The baseband samples received from the signal source are processed by the physical layer (PHY) to
produce packets that contain the SCM or IDM information. This diagram shows the physical layer
receive processing.

The RTL-SDR radio is capable of using a sampling rate in the range of 225-300 kHz or 900-2560 kHz
and ADALM-PLUTO radio is capable of using a sampling rate in the range of 520 kHz-61.44 MHz. A
sampling rate of 1.0 Msps is used to produce a sufficient number of samples per Manchester encoded
data bit. For each frequency in the hopping pattern, every AMR data packet is transmitted. The
frequency hopping allows for increased reliability over time. Since every packet is transmitted on
each frequency hop, it is sufficient to monitor only one frequency for this example. The radio is tuned
to a center frequency of 915 MHz for the entire simulation runtime.

The received complex samples are amplitude demodulated by extracting their magnitude. The on-off
keyed Manchester coding implies that the bit selection block includes clock recovery. The output of
this block is bit sequences (ignoring the idle times in the transmission) which are subsequently
checked for the known preamble. If the preamble matches, the bit sequence is further decoded,
otherwise, it is discarded and the next sequence is processed.

When the known SCM preamble is found for a bit sequence, the received message bits are decoded
using a shortened (255,239) BCH code which can correct up to two bit errors. In the case where the
known IDM preamble is found, the receiver performs a cyclic redundancy check (CRC) of the meter
serial number and of the whole packet starting at the Packet type (the 5th byte) to determine if the
packet is valid. Valid, corrected messages are passed onto the AMR Message parser.

Message Parser

For a valid message, the bits are then parsed into the specific fields of either the IDM or SCM format.
This example can parse both the SCM format and the IDM format.

8-59
8 Examples

Data Viewer

The data viewer shows the decoded SCM or IDM messages on a user interface. For each successfully
decoded SCM/IDM, the commodity type, meter ID, consumption information and the capture time is
shown. As data is captured and decoded, the application lists the information decoded from these
messages in a tabular form. The table lists only the unique meter IDs with their latest consumption
information.

You can also change the meter ID and start text file logging using the user interface.

• Meter ID - The default value, 0, is reserved for displaying all detected meters. You can enter the
ID of a specific meter to display readings from only that meter ID.

• Log data to file - Save the decoded messages in a TXT file. You can use the saved data for post
processing.

This figures shows the meter readings displayed in the user interface.

Further Exploration

The data file accompanying the example has only one meter reading and has been captured at center
frequency of 915 MHz. Using RTL-SDR or ADALM-PLUTO radio, the example will display readings
from multiple meters when it is run for a longer period in a residential neighborhood.

You can further explore AMR signals using the AMRSimulinkExampleApp app. The app allows you to
set the run duration, select the signal source, change the center frequency of the radio, and run to
log meter readings.

8-60
Automatic Meter Reading in Simulink

Selected Bibliography

1 Automatic meter reading, https://en.wikipedia.org/wiki/Encoder_receiver_transmitter, 2016.


2 Itron Electricity meters, https://www.itron.com/solutions/who-we-serve/electricity, 2017.

8-61
8 Examples

FM Reception with RTL-SDR Radio on Raspberry Pi Hardware


with Simulink

This example shows how to build an FM mono receiver using a Raspberry Pi™ and RTL-SDR radio.
You will learn how to deploy a Simulink® model that processes FM broadcast signals and play the
audio through the Raspberry Pi's speaker.

Required Hardware and Software

To run this example, you need the following hardware:

• RTL-SDR radio
• Raspberry Pi

and the following software

• Simulink
• Communications Toolbox™
• Communications Toolbox Support Package for RTL-SDR Radio
• Simulink Support Package for Raspberry Pi Hardware

For a full list of Communications Toolbox supported SDR platforms, refer to Supported Hardware
section of Software Defined Radio (SDR) discovery page.

Introduction

Simulink Support Package for Raspberry Pi Hardware enables you to create and run Simulink models
on Raspberry Pi hardware. Communications Toolbox Support Package for RTL-SDR Radio enables you
to receive radio signals from the RTL-SDR radio. You can use these two support packages together to
receive and process RF signals on the Raspberry Pi hardware using Simulink software. In this
example, you will learn how to run an FM receiver model as a standalone application on the
Raspberry Pi hardware.

For an introduction on implementing an FM broadcast receiver in Simulink, refer to the “FM


Broadcast Receiver in Simulink” example. We also recommend completing “Getting Started with
MATLAB Support Package for Raspberry Pi Hardware” (MATLAB Support Package for Raspberry Pi
Hardware) example.

FM Receiver

The following shows the FM receiver model. The model uses the RTL-SDR Receiver block to
receive radio signals and sends them to the FM Broadcast Demodulator Baseband block. The
FM demodulator block demodulates the received signal and generates mono audio. The mono signals
are sent to the ALSA Audio Playback block optimized for the Raspberry Pi hardware.

8-62
FM Reception with RTL-SDR Radio on Raspberry Pi Hardware with Simulink

Configure and Run the Model as a Standalone Application

The following steps show you how to configure the model to run on the Raspberry Pi hardware.

1. If your Raspberry Pi hardware is not connected to an Ethernet network, follow the instructions in
“Configure Network Settings of Raspberry Pi Hardware” (Simulink Support Package for Raspberry Pi
Hardware).

2. In the model, set simulation stop time to 'inf' to run the simulation until you explicitly pause or stop
the model.

3. In the Simulink model, click Tools > Run on Target Hardware> Options....

4. When the Configuration Parameters page opens up, set the Target hardware parameter to
Raspberry Pi. Review the other parameters on that page. If you performed a Firmware Update, Board
information will be automatically populated with the IP address, user name and password of your
Raspberry Pi hardware. Also, notice the TCP/IP port edit box under Signal monitoring and
parameter tuning. The default value of TCP/IP port is 17725. Simulink uses this TCP/IP port to
communicate with Raspberry Pi hardware. Leave the TCP/IP port parameter at its default value. Click
OK when you are done.

8-63
8 Examples

5. In the Simulink model, click the Deploy to Hardware button on the toolbar or press Ctrl+B.

6. The model will now run on the Raspberry Pi hardware. A system command window will open that
shows the messages coming from the model running on Raspberry Pi hardware.

7. Connect speakers to the audio output of the Raspberry Pi hardware to listen to the radio.

8. Stop the model running on the Raspberry Pi hardware by executing the following on the
MATLAB® command line

h = raspberrypi;
stopModel(h,'FMReceiverRaspberryPiSimulinkExample');

8-64
FM Reception with RTL-SDR Radio on Raspberry Pi Hardware with Simulink

Running and Stopping the Model on Raspberry Pi Hardware

Simulink Support Package for Raspberry Pi Hardware generates a Linux® executable for each
Simulink model you run on the Raspberry Pi hardware.

1. To run/stop a Simulink model, you use the run and stop methods of the raspberrypi communication
object. First, create a communication object to the Raspberry Pi hardware:

rpi = raspberrypi;

This command generates a Raspberry Pi object that is your gateway to communicating with your
Raspberry Pi hardware from MATLAB command line.

2. Execute the following on the MATLAB command line to stop the Simulink model you ran in
previous section:

stopModel(rpi, 'FMReceiverRaspberryPiSimulinkExample')

3. To run a previously built Simulink model on your board, you use runModel method. In order to run
the FMReceiverRaspberryPiSimulinkExample model, execute the following on the MATLAB command
line:

runModel(rpi, 'FMReceiverRaspberryPiSimulinkExample')

Summary

This example introduced the workflow for receiving radio signals with an RTL-SDR radio and
processing the received signals using a Simulink model running on Raspberry Pi hardware.

8-65
8 Examples

FM Broadcast Receiver in Simulink

This example shows how to build an FM mono or stereo receiver using Simulink® and
Communications Toolbox™. You can either use captured signals, or receive signals in real time using
the RTL-SDR, ADALM-PLUTO or USRP radio.

Required Hardware and Software

To run this example using captured signals, you need the following software:

• Simulink
• Communications Toolbox™

To receive signals in real time, you also need one of the following hardware:

• RTL-SDR radio and the corresponding software Communications Toolbox Support Package for
RTL-SDR Radio

• ADALM-PLUTO radio and the corresponding software Communications Toolbox Support Package
for ADALM-PLUTO Radio

• USRP radio and the corresponding software Communications Toolbox Support Package for USRP
Radio

For a full list of Communications Toolbox supported SDR platforms, refer to Supported Hardware
section of Software Defined Radio (SDR).

Introduction

For an introduction to the FM broadcasting technology and demodulation of these signals, refer to
the “FM Broadcast Receiver” example.

Running the Example

To run the example using captured signals, select the FM Broadcast Captured Signal block as
the source using the Signal Source Selector block. Then click the run button.

To run the example using the RTL-SDR radio, ADALM-PLUTO radio or USRP radio as the source,
select the corresponding RTL-SDR Receiver, ADALM-PLUTO Radio Receiver or USRP Radio
Receiver block as the source using the Signal Source Selector block. Double-click the Center
Frequency (MHz) block and select the value to the center frequency to a broadcast FM radio
station near you.

If you hear some dropouts or delay in the sound, run the model in Accelerator mode. From the model
menu, select Simulation->Accelerator, then click the run button. If you still experience dropouts or
delay in Accelerator mode, try running the model in Rapid Accelerator mode.

Receiver Structure

The receiver structure in this block diagram represents the FMReceiverSimulinkExample.slx model
used in this example. The processing has three main parts: signal source, FM broadcast
demodulation, and audio output.

8-66
FM Broadcast Receiver in Simulink

Signal Source

This example can use three signal sources:

1 ''Captured Signal'': Over-the-air signals written to a file and sourced using a Baseband File
Reader block at 228e3 samples per second.
2 ''RTL-SDR Radio'': RTL-SDR radio running at 200e3 samples per second. Set the center
frequency to a broadcast FM radio station near you.
3 ''ADALM-PLUTO Radio Receiver'': ADALM-PLUTO radio running at 200e3 samples per second.
Set the center frequency to a broadcast FM radio station near you.
4 ''USRP Radio Receiver'': USRP radio running at 200e3 samples per second. Set the center
frequency to a broadcast FM radio station near you.

FM Broadcast Demodulation

The baseband samples received from the signal source are processed by the FM Broadcast
Demodulation Baseband block. This block converts the input sampling rate of 228 kHz to 45.6
kHz, the sampling rate for your host computer's audio device. According to the FM broadcast

8-67
8 Examples

standard in the United States, the de-emphasis lowpass filter time constant is set to 75 microseconds.
This example processes received mono signals. The demodulator can also process stereo signals.

To perform stereo decoding, the FM Broadcast Demodulator Baseband object uses a peaking filter
which picks out the 19 kHz pilot tone from which the 38 kHz carrier is created. Using the resulting
carrier signal, the FM Broadcast Demodulator Baseband block downconverts the L-R signal, centered
at 38 kHz, to baseband. Afterwards, the L-R and L+R signals pass through a 75 microsecond de-
emphasis filter. The FM Broadcast Demodulator Baseband block separates the L and R signals and
converts them to the 45.6 kHz audio signal.

Audio Device Writer

Play the demodulated audio signals through your computer's speakers using the Audio Device
Writer block.

Further Exploration

To further explore the example, you can vary the center frequency of the RTL-SDR radio, ADALM-
PLUTO radio or USRP radio and listen to other radio stations using the Center Frequency (MHz)
block.

You can set the Stereo property of the FM Broadcast Demodulator Baseband block to true to
process the signals in stereo fashion and compare the sound quality.

Selected Bibliography

https://en.wikipedia.org/wiki/FM_broadcasting

8-68
Frequency Offset Calibration for Receivers in Simulink

Frequency Offset Calibration for Receivers in Simulink

This example shows how to measure and calibrate for transmitter/receiver frequency offset at the
receiver using Simulink® and Communications Toolbox™. You can either use captured signals or
receive signals in real time using the Communications Toolbox Support Package for RTL-SDR Radio.
The receiver monitors the received signal, calculates and display the transmitter/receiver frequency
offset.

Required Hardware and Software

To run this example using captured signals, you need the following software:

• Simulink
• Communications Toolbox™

To receive signals in real time, you also need the following hardware:

• RTL-SDR radio

and the following software

• Communications Toolbox Support Package for RTL-SDR Radio

For a full list of Communications Toolbox supported SDR platforms, refer to Supported Hardware
section of Software Defined Radio (SDR) discovery page.

Introduction

For an introduction on the frequency offset calibration for receivers, refer to the “Frequency Offset
Calibration for Receivers” example.

Running the Example

To run the example using captured signals, select the Frequency Offset Captured Signal block
as the source using the Signal Source Selector block. Then click the run button. The model
processes signals that were captured with an RTL-SDR radio at a center frequency of 560309440 Hz.
This value corresponds to the pilot tone of channel 29 of digital TV signals in the USA.

To run the example using the RTL-SDR radio as the source, select the RTL-SDR Receiver block as
the source using the Signal Source Selector block. Double-click the Expected Center
Frequency block and set to the expected tone frequency. Begin transmitting with your known signal
source. If you are in the USA, you can set the expected center frequency to the pilot tone of a near by
digital TV transmitter. For a list of channel number and frequency values, see North American
television frequencies. Then click the run button.

If you use the RTL-SDR radio as the source, to compensate for a transmitter/receiver frequency
offset, specify the displayed PPM correction value as the Frequency correction (ppm) parameter of
the RTL-SDR Receiver block. Be sure to use the sign of the offset in your specification. The spectrum
displayed by the Spectrum Analyzer block should then have its maximum at 0 Hz.

Structure of the Example

The following figure shows the receiver model:

8-69
8 Examples

8-70
Frequency Offset Calibration for Receivers in Simulink

The following figure shows the detailed structure of the Receiver subsystem:

• The Find Peak Frequency block - uses an FFT to find the frequency with the maximum power in
the received signal.
• The Spectrum Analyzer block - computes and displays the power spectral density of the received
signal.

Find Peak Frequency

The Find Peak Frequency subsystem finds the frequency with the maximum power in the received
signal, which equals the frequency offset. The following diagram shows the subsystem. In this
subsystem, the Periodogram block returns the PSD estimate of the received signal. The Probe block
finds the frame size and the frame sample time. With this information, this subsystem finds the index

8-71
8 Examples

of the maximum amplitude across the frequency band and converts the index to the frequency value
according to

Foffset = IndexofMaxAmplitude * FrameSize / (FFTLength * FrameSampleTime)

The MATLAB function findpeakfreq.m performs this conversion.

Spectrum Analyzer

The following figure shows the output of the Spectrum Analyzer on a frequency range of -200 kHz to
200 kHz. In the case shown below, the frequency with the maximum power of the received signal is
about -35 kHz.

8-72
Frequency Offset Calibration for Receivers in Simulink

8-73
8 Examples

FRS/GMRS Receiver in Simulink

This example shows how to implement a walkie-talkie receiver using Simulink® and Communications
Toolbox™. The specific radio standard that this example follows is FRS/GMRS (Family Radio Service /
General Mobile Radio Service) with CTCSS (Continuous Tone-Coded Squelch System). You can use
simulated signals, captured signals, or received signals from a commercial walkie-talkie using the
Communications Toolbox Support Package for RTL-SDR Radio.

This example is designed to work with USA standards for FRS/GMRS operation. The technical
specifications for these standards can be found in the reference list below. Operation in other
countries may or may not work.

Required Hardware and Software

To run this example using captured signals, you need the following software:

• Simulink
• Communications Toolbox™

To receive signals in real time, you also need the following hardware:

• RTL-SDR radio
• Walkie-talkie

and the following software

• Communications Toolbox Support Package for RTL-SDR Radio

For a full list of Communications Toolbox supported SDR platforms, refer to the "MATLAB and
Simulink Hardware Support for SDR" section of Software-Defined Radio (SDR).

Introduction

For an introduction on FRS/GMRS technology and demodulation of these signals, refer to the “FRS/
GMRS Walkie-Talkie Receiver” example.

Running the Example

To run the example using simulated signals, select the FRS/GMRS Signal Generator block as the
source using the Signal Source Selector block. Double click the FRS/GMRS Signal
Generator block to select the CTCSS code and source type as one of 'Single tone', 'Chirp', or
'Audio'. Then click the run button.

To run the example using captured signals, select the FRS/GMRS Captured Signal block as the
source using the Signal Source Selector block. Then click the run button.

To run the example using the RTL-SDR radio as the source, select the RTL-SDR Receiver block as
the source using the Signal Source Selector block. Then click the run button. Turn on your
walkie-talkie, set the channel to be one of the 14 channels (numbered 1 to 14) and the private code to
be either one of the 38 private codes (numbered 1 to 38) or 0, in which case no squelch system is
used and all received messages are accepted. Note that the private codes above 38 are digital codes
and are not implemented in this example.

8-74
FRS/GMRS Receiver in Simulink

Double-click the Channel Number block and select the same channel number as the walkie-talkie.
Double-click the CTCSS Code block and set the CTCSS Code to the private code you set in the
walkie-talkie. Run the model, and see if you can hear your voice come out of the computer speakers.
If not, try adjusting the Detection Threshold block value downward slightly. You can change the
channel and private code without stopping and restarting the model.

If you hear some dropouts or delay in the sound, run the model in Accelerator mode. From the model
menu, select Simulation->Accelerator, then click the run button. If you still experience dropouts or
delay in Accelerator mode, try running the model in Rapid Accelerator mode.

The "Signal Spectrum" shows the spectrum of the received signal at the input of the Channel
Selector block. You can observe how the spectrum changes as you speak into your walkie-talkie.

Receiver Structure

The following block diagram summarizes the receiver structure. The processing has four main parts:
Signal Source, Channel Selector, FM Demodulator, and CTCSS processing.

8-75
8 Examples

Signal Source

This example can use three signal sources:

1 ''Simulated Signal'': Simulated FRS/GMRS signal at 240e3 samples/sec


2 ''Captured Signal'': Over-the-air signals written to a file and sourced using a baseband file reader
block at 240e3 samples/sec
3 ''RTL-SDR Radio'': RTL-SDR radio at 240e3 samples/sec. Use a walkie-talkie as a transmitter. Set
the channel number to the channel number of your walkie-talkie.

Channel Selector

The receiver removes the DC component and applies a variable gain to the received signal to obtain
an approximately known amplitude signal with reduced interference. The receiver then applies a low
pass channel separation filter to reduce the signals from adjacent channels. The gap between
adjacent channels is 25 kHz, which means the baseband bandwidth is, at most, 12.5 kHz. Thus, we
choose the cutoff frequency to be 10 kHz.

Next, a channel selector computes the average power of the filtered signal. If it is greater than a
threshold (set to a default of 10%), the channel selector determines that the received signal is from

8-76
FRS/GMRS Receiver in Simulink

the correct channel and allows the signal to pass through. In the case of an out-of-band signal,
although the channel separation filter reduces its magnitude, it is still FM modulated and the
modulating signal will be present after FM demodulation. To completely reject such a signal, the
channel selector outputs all zeros.

FM Demodulator

This example uses the FM Demodulator Baseband block whose sample rate and maximum
frequency deviation are set to 240 kHz and 2.5 kHz, respectively.

CTCSS

First, a decimation filter converts the sampling rate from 240 kHz to 8 kHz. This rate is one of the
native sampling rates of your host computer's output audio device. Then, the CTCSS decoder
computes the power at each CTCSS tone frequency using the Goertzel algorithm and outputs the
code with the largest power. The Goertzel algorithm provides an efficient method to compute the
frequency components at predetermined frequencies, that is, the tone code frequencies used by FRS/
GMRS.

The model compares the estimated received code with the preselected code and then sends the signal
to the audio device if the two codes match. When the preselected code is zero, it indicates no squelch
system is used and the decision block passes the signal at the channel to the audio device no matter
which code is used.

Finally, a high pass filter with a cutoff frequency of 260 Hz filters out the CTCSS tones, which have a
maximum frequency of 250 Hz. Use an Audio Device Writer block to play the received signals
through your computer's speakers. If you do not hear any sound, please select another device using
the DeviceName parameter of the Audio Device Writer block.

Audio Output

Before the audio device, a high pass filter with a cutoff frequency of 260 Hz is used to filter out the
CTCSS tones (which have a maximum frequency of 250 Hz) so that they are not heard.

The Audio Device Writer block is set up by default to output to the current audio device in your
system preferences.

Exploring the Example

The CTCSS decoding computes the DTFT (Discrete-Time Fourier Transform) of the incoming signal
using the Goertzel algorithm and computes the power at the tone frequencies. Because the tone
frequencies are very close to each other (only 3-4 Hz apart) the block length of the DTFT should be
large enough to provide enough resolution for the frequency analysis. However, long block lengths
cause decoding delay. For example, a block length of 16384 will cause 2 seconds of delay, since the
CTCSS decoder operates at an 8 kHz sampling rate. This creates a tradeoff between detection
performance and processing latency. The optimal block length may depend on the quality of the
transmitter and receiver, the distance between the transmitter and receiver, and other factors. You
are encouraged to change the block length in the initialization function by navigating to the
helperFRSReceiverConfig function and changing the value of the CTCSSDecodeBlockLength field.
This will enable you to observe the tradeoff and find the optimal value for your transmitter/receiver
pair.

When the FRS/GMRS Signal Generator is selected as the source, you can change the CTCSS
tone amplitude parameter of this block and observe how this affects the signal spectrum.

8-77
8 Examples

Appendix

The following script is used in this example:

• helperFRSReceiverConfig.m

References

• Family Radio Service


• General Mobile Radio Service
• Continuous Tone-Coded Squelch System
• Goertzel Algorithm

8-78
RDS/RBDS and RadioText Plus (RT+) FM Receiver in Simulink

RDS/RBDS and RadioText Plus (RT+) FM Receiver in Simulink

This example shows how to extract program or song information from FM radio stations using the
RDS or RBDS standard and, optionally, the RadioText Plus (RT+) standard. You can use a captured
signal, or receive signals over-the-air in real time using an RTL-SDR radio, an ADALM-PLUTO radio,
or a USRP B200/B210 radio.

Required Hardware and Software

To run this example using captured signals, you need Simulink® and Communications Toolbox™
software.

To receive signals in real time, you also need one of these SDR devices and the corresponding
software add-on:

• RTL-SDR radio and Communications Toolbox Support Package for RTL-SDR Radio add-on

• ADALM-PLUTO radio and Communications Toolbox Support Package for ADALM-PLUTO Radio
add-on

• USRP radio and Communications Toolbox Support Package for USRP Radio add-on

For a full list of Communications Toolbox supported SDR platforms, refer to Supported Hardware
section of the Software Defined Radio (SDR) discovery page.

Background

RBDS and RDS are very similar standards specifying how to supplement FM radio signals with
additional information. RBDS is used in North America, while RDS was originally used in Europe and
evolved to an international standard. RBDS and RDS comprise 3 layers:

• Physical layer (Layer 1)


• Data-link layer (Layer 2)
• Session and presentation layer (Layer 3)

The RBDSSimulinkExample model in this diagram receives FM signals either from a captured file or
over the air. The model plays the audio signal and displays the RBDS information.

8-79
8 Examples

Physical Layer (Layer 1)

The physical layer subsystem receives the captured signal from a file or the live signal from the radio
and performs these steps:

• FM demodulation: Once the FM signal is demodulated, the RDS/RBDS signal resides at the 57
kHz +/- 2.4 kHz band. Be aware that the RDS/RBDS signal is transmitted with relatively low
power, so it is not always visible in the FM spectrum as shown in this figure.

8-80
RDS/RBDS and RadioText Plus (RT+) FM Receiver in Simulink

FM signals contain a pilot tone at 19 kHz, which can be used as a phase and frequency reference for
coherent demodulation of the RDS/RBDS signal at 57 kHz and the stereo audio at 38 kHz. Pilot tones
at 38 kHz and 57 kHz can be generated by doubling and tripling the frequency of the 19 kHz pilot
tone [ 2 ].

Processing steps for coherent demodulation of the RDS/RBDS signal are:

• Bandpass filtering: The PHY receiver conducts bandpass filtering at 19 kHz and 57 kHz, to
isolate the pilot tone and the RDS/RBDS signal, respectively.

• Frequency tripling: Raise the complex representation of the 19 kHz pilot tone to the 3rd power
to triple its frequency and obtain a 57 kHz pilot tone.

• AM Demodulation: RDS and RBDS symbols are generated at an 1187.5 Hz rate and are AM-
modulated to a 57 kHz carrier. The 57 kHz RDS/RBDS signal can be coherently demodulated with
a 57 kHz carrier that is locked in frequency and phase. Typically, the frequency-tripled 19 kHz
pilot tone suffices for coherent demodulation. The next figures show the 19 kHz and 57 kHz pilot
tones, the 57 kHz RDS/RBDS signal, and the AM-demodulated baseband RDS/RBDS signal.

8-81
8 Examples

At the same time, there exist several FM stations whose 57 kHz RDS/RBDS signal exhibits a time-
varying phase offset from the 19 kHz pilot tone and its frequency-tripled version. The PHY receiver
contains a Costas loop to compensate for such time-varying phase offsets.

• Costas loop: The Costas loop performs 2 orthogonal AM demodulations, one demodulation with a
57 kHz sine and another with a 57 kHz cosine. The sampling rate of the received signal is
carefully chosen as 228 kHz, which provides 4 samples per 57 kHz cycle. Therefore, a one sample
delay of the 57 kHz pilot tone results to a one quarter wavelength phase offset, and allows us to
generate a cosine wave from a sine wave. The sine-demodulated signal corresponds to the
coherent demodulation output. The cosine-demodulated signal is used for detection of phase error.
The products of the 57 kHz RDS/RBDS signal with the sine/cosine waves are low-pass filtered with
the filter specified in Sec. 1.7 of [ 1 ]. The product of the two filter outputs is an error signal. The
larger it is, the more the 19 kHz pilot tone is delayed to behave more like the cosine-based
demodulator.

8-82
RDS/RBDS and RadioText Plus (RT+) FM Receiver in Simulink

• Clock extraction: To perform biphase symbol decoding, a clock matching the RDS/RBDS symbol
rate of 1187.5 Hz is extracted from the 19 kHz pilot tone. Note, 1187.5 Hz x 16 = 19 kHz. To
account for frequency offsets, frequency division is used to extract the clock from the 19 kHz pilot
tone. Since the frequency division operation provides multiple correct answers, the baseband
RDS/RBDS signal serves as training data that aid in the determination of the desired output.

• Biphase symbol decoder: RDS and RBDS use bi-phase-level (bi- -L) coding, which is commonly
known as Manchester coding. In each clock cycle, the RDS/RBDS symbol takes two opposite
amplitude values, either a positive followed by a negative, or a negative followed by a positive.
The biphase symbol decoder negates the second amplitude level, so that each symbol holds the
same amplitude level throughout the entire clock cycle. The new clock-wide amplitude level
corresponds to the symbol's bit representation. These screenshots correspond to the waveforms
#1-6 in Figure 2 of [ 1 ].

8-83
8 Examples

To obtain each symbol's bit value, the waveform is integrated over each clock cycle, and the outcome
is compared to zero (slicer).

8-84
RDS/RBDS and RadioText Plus (RT+) FM Receiver in Simulink

• Differential decoding: Finally, the bits are differentially decoded to revert the differential
encoding at the transmitter.

Data-link Layer (Layer 2)

Layer 2 is implemented using the RBDSDataLinkDecoder System block. This layer is responsible for
synchronization and error correction.

The bit output of the PHY layer is logically organized in 104-bit groups comprising four 26-bit blocks.
Each block contains a 16-bit information word and 10 parity bits (see Figure 8 in [ 1 ]). A distinct 10-
bit offset word is modulo-2 added to the parity bits of each block.

• Synchronization: Initially, block and group boundaries are sought exhaustively using a sliding
window of 104 bits. For each 104-bit window, the 4 offset words are sought at the last 10 bits of
each 26-bit block. An offset word is identified if no bit errors are detected in the
RBDSErrorDetection System block. Once the offset words are identified, group-level

8-85
8 Examples

synchronization is attained and the exhaustive sliding-window processing stops. Subsequently, the
next 104 bits will be treated as the next group.

If future groups contain bit errors and the offset words cannot be identified at their expected
position, synchronization may be lost. In this case, Layer 2 first examines the possibility of 1-bit
synchronization slips, exploiting the fact that the first information word (16 bits) is always the same
for all bit groups. If the first information word is found dislocated by 1 bit (either leftward or
rightward), synchronization is retained and the group boundaries are adjusted accordingly. If bit
errors persist for 25 group receptions and at the same time synchronization cannot be reestablished
using such leftward/rightward 1-bit shifts, then synchronization is lost and Layer 2 re-enters the
exhaustive, sliding-window-based search for synchronization.

• Error correction: The RDS and RBDS error correction code is a (26, 16) cyclic code shortened
from (341, 331). The RBDSErrorCorrection System block uses the shift-register scheme described
in Annex B of [ 1 ].

Session and Presentation Layer (Layer 3)

Layer 2 removes the parity/offset bits, therefore Layer 3 receives groups of 64-bits, comprising four
16-bit blocks. There exist up to 32 different group types, each labeled with a number from 0 to 15 and
the letter 'A' or 'B', for example, 0B, 2A, 3A. The format of each group can be fixed or it can be
abstract if this group is allocated for an Open Data Application (ODA, see list in [ 3 ]).

Layer 3 is implemented using the RBDSSessionDecoder System block. This block supports decoding
of the 0A, 0B, 2A, 2B, 3A, 4A, 10A fixed-format group types.

• 0A and 0B convey an 8-character string, which typically changes in a scrolling-text fashion.


• 2A and 2B convey longer 64- or 32-character strings.
• 3A registers ODAs and specifies their dedicated abstract-format group type.
• 4A conveys the system time.
• 10A further categorizes the program type, such as 'Football' for 'Sports' program type).

For ODAs, the RDS/RBDS receiver supports decoding of RadioText Plus (RT+) [ 4 ]. This ODA can
break down the long 32 or 64-character string from group types 2A and 2B into two specific content
types (for example, artist and song).

Viewing Results

This screenshot illustrates the graphical display of the processed RDS/RBDS data:

Win32; Microsoft Visual C++ version 14.2; Boost_107800; UHD_4.2.0.0-vendor

---------- see libuhd version information above this line ----------

8-86
RDS/RBDS and RadioText Plus (RT+) FM Receiver in Simulink

• Basic RDS/RBDS information:

1 The first field corresponds to the program type, which is conveyed by the second information
word of all group types. If 10A group types are received, the first field provides further
characterization, such as Sports \ Football.
2 The second field illustrates the 8-character text conveyed by 0A/0B groups.
3 The third field illustrates the longer 32/64-character text conveyed by 2A/2B group types.

• RadioText Plus (RT+): This section is used if any 3A groups indicate that the RadioText Plus (RT
+) ODA [ 4 ] uses a certain abstract-format group type, such as 11A. Then, upon receptions of this
abstract group type, the 32/64-character text conveyed by groups 2A/2B will be split to two
substrings. Moreover, the two labels will be updated to characterize the substrings, such as Artist
and Song).

8-87
8 Examples

• Group type receptions: The tables act as a histogram illustrating which group types have been
received from a station and with what frequency. As a result, users may want to look at the logged
data for further information not depicted in the graphical viewer. For example, system time in 4A,
alternate frequencies in 0A, or others.

• Open data applications (ODA): If any 3A group types are received, then the list of encountered
ODAs is updated with the ODA name and their dedicated group type.

Moreover, you can enable the 'Log data to file' checkbox in order to log further fields from all group
types.

Selected Bibliography

1 National Radio Systems Committee, United States RBDS standard, April 1998
2 Der, Lawrence. "Frequency Modulation (FM) Tutorial". Silicon Laboratories Inc.
3 National Radio Systems Committee, List of ODA Applications in RDS
4 RadioText Plus (RT+) Specification
5 Joseph P. Hoffbeck, "Teaching Communication Systems with Simulink® and the USRP", ASEE
Annual Conference, San Antonio, TX, June 2012

8-88
Spectrum Analysis of Signals

Spectrum Analysis of Signals

This example shows downstream spectrum analysis of signals using MATLAB®, Communications
Toolbox™ and DSP System Toolbox™. You can either use captured signals, or receive signals in real
time using the RTL-SDR Radio, ADALM-PLUTO Radio or USRP™ Radio. You can change the radio's
center frequency to tune the radio to a band where a signal is present. You can then use the spectrum
analyzer to view and make measurements on the received spectrum.

For Simulink(R) implementation of this example, refer “Spectrum Analysis of Signals in Simulink”.

Required Hardware and Software

To run this example using captured signals, you need the following software:

Communications Toolbox

DSP System Toolbox

To receive signals in real time, you also need one of the following hardware:

• RTL-SDR radio and the corresponding software Communications Toolbox Support Package for
RTL-SDR Radio
• ADALM-PLUTO radio and the corresponding software Communications Toolbox Support Package
for ADALM-PLUTO Radio
• USRP radio and the corresponding software Communications Toolbox Support Package for USRP
Radio

For a full list of Communications Toolbox supported SDR platforms, refer to the "MATLAB and
Simulink Hardware Support for SDR" section of Software-Defined Radio (SDR).

Example Code

The receiver asks for user input and initializes variables. Then, it calls the signal source and FM
broadcast receiver in a loop. The loop also keeps track of the radio time using the frame duration and
lost samples reported by the signal source.

For the option to change default settings, set |cmdlineInput| to 1.

cmdlineInput = ;
if cmdlineInput
% Request user input from the command-line for application parameters
userInput = helperSpectralAnalysisUserInput;
% Set initial parameters
[SAParams, sigSrc] = helperSpectralAnalysisConfig(userInput);
else
% Set initial parameters
load defaultInputSpecAnalysis.mat
[SAParams, sigSrc] = helperSpectralAnalysisConfig;
end

Setup

Create spectrumAnalyzer object and configure based on user input

8-89
8 Examples

hSpectrum = spectrumAnalyzer(...
'Name', 'Passband Spectrum',...
'Title', 'Passband Spectrum', ...
'Method', 'Welch', ...
'SpectrumType', 'Power density', ...
'FrequencySpan', 'Full', ...
'SampleRate', SAParams.FrontEndSampleRate, ...
'SpectralAverages', 50, ...
'FrequencyOffset', SAParams.CenterFrequency, ...
'YLimits', [-120 10], ...
'YLabel', 'Magnitude-squared, dB', ...
'Position', figposition([50 30 30 40]));

Stream processing

View the spectrum. While the spectrum analyzer is running, you can measure peaks, occupied
bandwidth, and other properties of the signal.

% Initialize radio time


radioTime = 0;

% Main loop
while radioTime < userInput.Duration
% Receive baseband samples (Signal Source)
if SAParams.isSourceRadio
if SAParams.isSourcePlutoSDR
rcv = sigSrc();
lost = 0;
late = 1;
elseif SAParams.isSourceUsrpRadio
rcv= sigSrc();
lost = 0;
else
[rcv,~,lost,late] = sigSrc();
end
else
rcv = sigSrc();
lost = 0;
late = 1;
end

rcv = rcv - mean(rcv); % Remove DC component.


step(hSpectrum, rcv);

% Update radio time. If there were lost samples, add those too.
radioTime = radioTime + SAParams.FrontEndFrameTime + ...
double(lost)/SAParams.FrontEndSampleRate;
end

% Release all System objects


release(sigSrc);
release(hSpectrum);

8-90
Spectrum Analysis of Signals

Conclusion

In this example, you used Communications Toolbox™ System objects to analyze the spectrum of a
received signal.

8-91
8 Examples

Spectrum Analysis of Signals in Simulink

This example shows you how to use Simulink® and Communications Toolbox™ to perform spectrum
analysis of the downstream signals. You can tune the radio to a band where a signal is present by
changing the center frequency. You can then use the spectrum analyzer to view and make
measurements on the received spectrum. You can either use recorded data from a file, or receive
over-the-air signals in real time using an RTL-SDR radio, ADALM-PLUTO radio, or USRP™ radio.

The “Spectrum Analysis of Signals” example provides a MATLAB® implementation of this example.

Overview

The spectralAnalysis model performs an FFT-based spectrum analysis at complex baseband, and
provides:

• A view of the spur-free dynamic range of the receiver


• A view of the qualitative SNR level of the received signal

Structure of the Example

This figure shows the spectralAnalysis model:

Spectrum Analyzer

This figure shows the output of the Spectrum Analyzer for a data signal recorded in the
spectrum_capture.bb file. The spectrum shows data captured over the FM radio band, specifically
over the frequency range of -88 MHz to 108 MHz.

8-92
Spectrum Analysis of Signals in Simulink

Running the Example

When you run the example, you can measure signal characteristics such as peaks, occupied
bandwidth, adjacent channel power ratio, harmonic and intermodulation levels, and spur-free
dynamic range.

8-93

You might also like