QPSK Transmitter with ADALM-PLUTO Radio
This example shows how to design a QPSK transmitter using an ADALM-PLUTO radio. The QPSK transmitter modulates and transmits indexed "Hello world" messages at a specified center frequency and a bit rate of 0.4 Mbps. In this example, the transmitter generates a message using ASCII characters, converts these characters to bits, and appends a Barker code at the beginning for receiver frame synchronization. This data is then QPSK modulated and filtered with a square root raised cosine filter. The filtered QPSK symbols can be transmitted over the air using the software-defined radio.
The example requires two MATLAB sessions, one for the transmitter and one for the receiver. You can demodulate the transmitted message using the QPSK Receiver with ADALM-PLUTO Radio example.
Introduction
This example has the following motivation:
To implement a real world QPSK transmitter using using ADALM-PLUTO Radio System objects.
To illustrate the use of key Communications Toolbox™ System objects for QPSK system design.
Initialize Transmitter Parameters
The plutoradioqpsktransmitter_init
script initializes the simulation parameters and generates the structure prmQPSKTransmitter
.
% Transmitter parameter structure prmQPSKTransmitter = plutoradioqpsktransmitter_init; % Specify Radio ID prmQPSKTransmitter.Address = 'usb:0'
prmQPSKTransmitter = struct with fields:
Rsym: 200000
ModulationOrder: 4
Interpolation: 2
Decimation: 1
Tsym: 5.0000e-06
Fs: 400000
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.0281
RolloffFactor: 0.5000
ScramblerBase: 2
ScramblerPolynomial: [1 1 1 0 1]
ScramblerInitialConditions: [0 0 0 0]
RaisedCosineFilterSpan: 10
MessageBits: [11200×1 double]
PlutoCenterFrequency: 915000000
PlutoGain: 0
PlutoFrontEndSampleRate: 400000
PlutoFrameLength: 11226
StopTime: 1000
Address: 'usb:0'
Code Architecture
The function runPlutoradioQPSKTransmitter
implements the QPSK transmitter System object, QPSKTransmitter
, and ADALM-PLUTO radio System object, comm.SDRTxPluto
.
QPSK Transmitter
The QPSKTransmitter
includes a bit generator, QPSK modulator and raised cosine transmit filter System objects. The bit generator object generates the data frames, starting with a Barker code. The QPSK transmitter sends the Barker code with both the in-phase and quadrature components of the QPSK modulated symbols by repeating the Barker code bits twice and then modulating them with the QPSK modulator.
The payload, consisting of the remaining bits, includes 100 'Hello world ###'
messages. Here, '###'
represents a binary sequence incrementing from '000' to '099'. You can adjust the number of messages in the transmitter initialization file. Corresponding adjustments are necessary in the receiver initialization file to ensure proper decoding.
For timing recovery, the system scrambles the payload to ensure an even distribution of zeros and ones. The QPSK modulator uses Gray coding and then modulates the scrambled bits. The raised cosine transmit filter system object upsamples the modulated symbols by a factor of two and applies a roll-off factor of 0.5. Finally, the raised cosine filter output rate is set to 0.4 M samples per second with a symbol rate of 0.2 M symbols per second.
Transmit the QPSK signal
Run the example to start transmitting the QPSK signal.
runPlutoradioQPSKTransmitter(prmQPSKTransmitter);
Transmission has started ## Establishing connection to hardware. This process can take several seconds. Transmission has ended
If the message is not properly decoded by the receiver object, you can vary the gain of the source signals in the comm.SDRTxPluto
and comm.SDRRxPluto
System objects by changing the SimParams.PlutoGain value in the transmitter initialization file and in the receiver initialization file.
Also, a large relative frequency offset between the transmit and receive radios can prevent the receiver functions from properly decoding the message. If that happens, you can determine the offset by running the models in Frequency Offset Calibration with ADALM-PLUTO Radio in Simulink example then applying that offset to the center frequency of the comm.SDRRxPluto
System object.
Supporting Functions
This example uses the following script and helper functions: