Main Content

QPSK Transmitter with USRP™ Hardware

This example shows how to use the Universal Software Radio Peripheral™ (USRP) device using SDRu (Software Defined Radio USRP) System objects to implement a QPSK transmitter. The USRP device in this system will keep transmitting indexed "Hello world" messages at its specified center frequency and at bit rate of 5Mbps in non-codegen path, 10Mbps in codegen path and 2 Mbps if it is HDL compatible. You can demodulate the transmitted message using the QPSK Receiver with USRP™ Hardware example with an additional USRP device.

Please refer to the Setup and Configuration section of Guided USRP Radio Support Package Hardware Setup for details on configuring your host computer to work with the SDRu Transmitter System object.

Implementations

This example describes the MATLAB® implementation of a QPSK transmitter with USRP hardware. There is another implementation of this example that uses Simulink®.

QPSKTransmitterWithUSRPHardwareExample.m

Simulink implementation using blocks: sdruqpsktx.slx.

You can also explore a simulation only QPSK Transmitter and Receiver example without SDR hardware that models a general wireless communication system using an AWGN channel and simulated channel impairments at QPSK Transmitter and Receiver.

Introduction

This example has the following motivation:

  • To implement a real QPSK-based transmission-reception environment in MATLAB using SDRu System objects.

  • To illustrate the use of key Communications Toolbox™ System objects for QPSK system design.

In this example, the transmitter generates a message using ASCII characters, converts the characters to bits, and prepends a Barker code for receiver frame synchronization. This data is then modulated using QPSK and filtered with a square root raised cosine filter. The filtered QPSK symbols can be transmitted over the air using the SDRu transmitter System object and the USRP hardware.

Discover Radio

Discover radio(s) connected to your computer. This example uses the first USRP radio found using the findsdru function. Check if the radio is available and record the radio type. If no available radios are found, the example uses a default configuration for the system.

connectedRadios = findsdru;
if strncmp(connectedRadios(1).Status, 'Success', 7)
  platform = connectedRadios(1).Platform;
  switch connectedRadios(1).Platform
    case {'B200','B210'}
      address = connectedRadios(1).SerialNum;
    case {'N200/N210/USRP2','X300','X310','N300','N310','N320/N321'}
      address = connectedRadios(1).IPAddress;
  end
else
  address = '192.168.10.2';
  platform = 'N200/N210/USRP2';
end
Checking radio connections...

Initialization

sdruqpsktransmitter_init.m script initializes the simulation parameters and generates the structure prmQPSKTransmitter.

compileIt  = false; % true if code is to be compiled for accelerated execution
useCodegen = false; % true to run the latest generated mex file
isHDLCompatible = false; % if HDL compatible, code will not be optimized in performance

% Transmitter parameter structure
prmQPSKTransmitter = sdruqpsktransmitter_init(platform, useCodegen, isHDLCompatible)
prmQPSKTransmitter.Platform = platform;
prmQPSKTransmitter.Address = address;
prmQPSKTransmitter = 

  struct with fields:

                          Rsym: 2500000
               ModulationOrder: 4
                 Interpolation: 2
                    Decimation: 1
                          Tsym: 4.0000e-07
                            Fs: 5000000
                    BarkerCode: [1 1 1 1 1 -1 -1 1 1 -1 1 -1 1]
                  BarkerLength: 13
                  HeaderLength: 26
                       Message: 'Hello world'
                 MessageLength: 16
               NumberOfMessage: 100
                 PayloadLength: 11200
                     FrameSize: 5613
                     FrameTime: 0.0022
                 RolloffFactor: 0.5000
                 ScramblerBase: 2
           ScramblerPolynomial: [1 1 1 0 1]
    ScramblerInitialConditions: [0 0 0 0]
        RaisedCosineFilterSpan: 10
                   MessageBits: [11200×1 double]
               MasterClockRate: 20000000
           USRPCenterFrequency: 915000000
                      USRPGain: 25
        USRPFrontEndSampleRate: 5000000
       USRPInterpolationFactor: 4
               USRPFrameLength: 11226
                 USRPFrameTime: 0.0022
                      StopTime: 1000

To achieve a successful transmission, ensure that the specified center frequency of the SDRu Transmitter is within the acceptable range of your USRP daughterboard.

Also, by using the compileIt and useCodegen flags, you can interact with the code to explore different execution options. Set the MATLAB variable compileIt to true in order to generate C code; this can be accomplished by using the codegen command provided by the MATLAB Coder™ product. The codegen command compiles MATLAB® functions to a C-based static or dynamic library, executable, or MEX file, producing code for accelerated execution. The generated executable runs several times faster than the original MATLAB code. Set useCodegen to true to run the executable generated by codegen instead of the MATLAB code.

Code Architecture

The function runSDRuQPSKTransmitter implements the QPSK transmitter using two System objects, QPSKTransmitter and comm.SDRuTransmitter.

QPSK Transmitter

The transmitter includes the Bit Generation, QPSK Modulator and Raised Cosine Transmit Filter objects. The Bit Generation object generates the data frames. The Barker code is sent on both in-phase and quadrature components of the QPSK modulated symbols. This is achieved by repeating the Barker code bits twice before modulating them with the QPSK modulator.

The remaining bits are the payload. The payload contains 100 'Hello world ###' messages, where '###' is an increasing sequence of '000', '001', ... '099' in binary forms. The number of messages is tunable via the initialization file, namely transmitter initialization file. Please make corresponding changes in the receiver initialization file, receiver initialization file. The payload is then scrambled to guarantee a balanced distribution of zeros and ones for the timing recovery operation in the receiver object. The scrambled bits are modulated by the QPSK Modulator (with Gray mapping). The Raised Cosine Transmit Filter upsamples the modulated symbols by two, and has roll-off factor of 0.5. The output rate of the Raised Cosine Filter is set to be 400k samples per second with a symbol rate of 200k symbols per second. If MATLAB Coder™ is enabled, the output symbol rate is 500k symbols per second. Please match the symbol rate of the transmitter model and the receiver model correspondingly.

SDRu Transmitter

The host computer communicates with the USRP radio using the SDRu transmitter System object. The CenterFrequency, Gain, and InterpolationFactor arguments are set by the parameter variable prmQPSKTransmitter.

Execution

Before running the script, first turn on the USRP radio and connect it to the computer. As already mentioned, you can check the correct data transmission by running the QPSK Receiver with USRP Hardware example while running the transmitter script.

if compileIt
    codegen('runSDRuQPSKTransmitter', '-args', {coder.Constant(prmQPSKTransmitter)}); %#ok<UNRCH>
end
if useCodegen
   clear runSDRuQPSKTransmitter_mex %#ok<UNRCH>
   runSDRuQPSKTransmitter_mex(prmQPSKTransmitter);
else
   runSDRuQPSKTransmitter(prmQPSKTransmitter);
end

The gain behavior of different USRP daughter boards varies considerably. Thus, the gain setting in the transmitter and receiver defined in this example may not be well suited for your daughter boards. If the message is not properly decoded by the receiver object, you can vary the gain of the source signals in the SDRu Transmitter and SDRu Receiver System objects by changing the SimParams.USRPGain value in the transmitter initialization file and in the receiver initialization file.

Also, a large relative frequency offset between the transmit and receive USRP radios can prevent the receiver functions from properly decoding the message. If that happens, you can determine the offset by sending a tone at a known frequency from the transmitter to the receiver, then measuring the offset between the transmitted and received frequency, then applying that offset to the center frequency of the SDRu Receiver System object.

Appendix

This example uses the following script and helper functions: