Main Content

qammod

Quadrature amplitude modulation (QAM)

Description

Y = qammod(X,M) modulates input signal X by using QAM with the specified modulation order M.

example

Y = qammod(X,M,symOrder) specifies the symbol order.

example

Y = qammod(___,Name=Value) specifies options using name-value arguments in addition to any of the input argument combinations from previous syntaxes. For example, InputType=bit sets the type of input signal to bits.

example

Examples

collapse all

Modulate data using QAM and display the result in a scatter plot.

Set the modulation order to 16 and create a data vector containing each of the possible symbols.

M = 16;
x = (0:M-1)';

Modulate the data using the qammod function.

y = qammod(x,M);

Display the modulated signal constellation using the scatterplot function.

scatterplot(y)

Figure Scatter Plot contains an axes object. The axes object with title Scatter plot, xlabel In-Phase, ylabel Quadrature contains a line object which displays its values using only markers. This object represents Channel 1.

Set the modulation order to 256, and display the scatter plot of the modulated signal.

M = 256;
x = (0:M-1)';
y = qammod(x,M);
scatterplot(y)

Figure Scatter Plot contains an axes object. The axes object with title Scatter plot, xlabel In-Phase, ylabel Quadrature contains a line object which displays its values using only markers. This object represents Channel 1.

Modulate random data symbols using QAM. Normalize the modulator output so that it has an average signal power of 1 W.

Set the modulation order and generate random data.

M = 64;
x = randi([0 M-1],1000,1);

Modulate the data. Use the 'UnitAveragePower' name-value argument to set the output signal to have an average power of 1 W.

y = qammod(x,M,UnitAveragePower=true);

Confirm that the signal has unit average power.

avgPower = mean(abs(y).^2)
avgPower = 
1.0070

Plot the resulting constellation.

scatterplot(y)
title('64-QAM, Average Power = 1 W')

Figure Scatter Plot contains an axes object. The axes object with title 64-QAM, Average Power = 1 W, xlabel In-Phase, ylabel Quadrature contains a line object which displays its values using only markers. This object represents Channel 1.

Plot QAM constellations for Gray, binary, and custom symbol mappings.

Set the modulation order, and create a data sequence that includes a complete set of symbols for the modulation scheme.

M = 16;
d = 0:M-1;

Modulate the data, and plot its constellation. The default symbol mapping uses Gray-coded ordering. The ordering of the points is not sequential.

y = qammod(d,M,PlotConstellation=true);

Figure contains an axes object. The axes object with title 16-QAM, Gray Mapping, UnitAveragePower=false, xlabel In-phase Amplitude, ylabel Quadrature Amplitude contains 19 objects of type line, text. One or more of the lines displays its values using only markers

Repeat the modulation process with binary symbol mapping. The symbol mapping follows a binary-coded order and is sequential.

z = qammod(d,M,'bin',PlotConstellation=true);

Figure contains an axes object. The axes object with title 16-QAM, Binary Mapping, UnitAveragePower=false, xlabel In-phase Amplitude, ylabel Quadrature Amplitude contains 19 objects of type line, text. One or more of the lines displays its values using only markers

Create a custom symbol mapping.

smap = randperm(M)-1;

Modulate and plot the constellation.

w = qammod(d,M,smap,PlotConstellation=true);

Figure contains an axes object. The axes object with title 16-QAM, Custom Mapping, UnitAveragePower=false, xlabel In-phase Amplitude, ylabel Quadrature Amplitude contains 19 objects of type line, text. One or more of the lines displays its values using only markers

Modulate a sequence of bits using 64-QAM. Pass the signal through a noisy channel. Display the resultant constellation diagram.

Set the modulation order, and determine the number of bits per symbol.

M = 64;
k = log2(M);

Create a binary data sequence. When using binary inputs, the number of rows in the input must be an integer multiple of the number of bits per symbol.

data = randi([0 1],1000*k,1);

Modulate the signal using bit inputs, and set it to have unit average power.

txSig = qammod(data,M, ...
    InputType='bit', ...
    UnitAveragePower=true);

Pass the signal through a noisy channel.

rxSig = awgn(txSig,25);

Plot the constellation diagram.

cd = comm.ConstellationDiagram(ShowReferenceConstellation=false);
cd(rxSig)

Demodulate a fixed-point QAM signal and verify that the data is recovered correctly.

Set the modulation order as 64, and determine the number of bits per symbol.

M = 64;
bitsPerSym = log2(M);

Generate random bits. When operating in bit mode, the length of the input data must be an integer multiple of the number of bits per symbol.

x = randi([0 1],10*bitsPerSym,1);

Modulate the input data using a binary symbol mapping. Set the modulator to output fixed-point data. The numeric data type is signed with a 16-bit word length and a 10-bit fraction length.

y = qammod(x,M,'bin', ...
    InputType='bit', ...
    OutputDataType=numerictype(1,16,10));

Demodulate the 64-QAM signal. Verify that the demodulated data matches the input data.

z = qamdemod(y,M,'bin',OutputType='bit');
s = isequal(x,double(z))
s = logical
   1

Apply average power normalization for hard decision output when using qammod and qamdemod functions by using the helperAvgPow2MinD utility function. Scale the constellation to the normalized average power, and then plot the reference and scaled constellations.

Compute the minimum distance for symbols based on specified average power and modulation order.

M = 64;
avgPwr = 2;
minD = helperAvgPow2MinD(avgPwr,M);

Modulate a signal composed of random integers in the range [0, M - 1], scale the modulated symbols.

x = randi([0,M-1],1000,1);
y = qammod(x,M);
yTx = (minD/2) .* y;

Verify signal average power approximately equals the specified average power, avgPow.

sigPwr = mean(abs(yTx).^2)
sigPwr = 
2.0141
avgPwr
avgPwr = 
2

Assign the transmitted signal to the receive signal without applying any RF or channel impairments. With no impairments to distort the received signal, the demodulated matches the original signal. Demodulate symbols using hard decisions, and confirm correct signal demodulation.

yRx = yTx;
z = qamdemod(yRx*2/minD,M);
checkDemodIsEqual = isequal(x,z)
checkDemodIsEqual = logical
   1

refC = qammod([0:M-1]',M);

Show constellation

maxAx = ceil(max(abs(refC)));
cd = comm.ConstellationDiagram(2, ...
    'ShowReferenceConstellation',0, ...
    'ShowLegend',true, ...
    'XLimits',[-(maxAx) maxAx],'YLimits',[-(maxAx) maxAx], ...
    'ChannelNames', ...
    {'y','yTx'});
cd(y,yTx)

Apply peak power normalization for hard decision output when using qammod and qamdemod functions by using the helperPeakPow2MinD utility function. Scale the constellation to the normalized peak power, and then plot the reference and scaled constellations.

Compute the minimum distance for symbols based on specified peak power and modulation order.

M = 16;
pkPwr = 30;
minD = helperPeakPow2MinD(pkPwr,M);

Modulate a signal composed of random integers in the range [0, M - 1], scale the modulated symbols.

x = randi([0,M-1],1000,1);
y = qammod(x,M);
yTx = (minD/2) .* y;

Verify signal peak power approximately equals the specified peak power, pkPow.

sigPwr = max(abs(yTx).^2)
sigPwr = 
30
pkPwr
pkPwr = 
30

Assign the transmitted signal to the receive signal without applying any RF or channel impairments. With no impairments to distort the received signal, the demodulated matches the original signal. Demodulate symbols using hard decisions, and confirm correct signal demodulation.

yRx = yTx;
z = qamdemod(yRx*2/minD,M);
checkDemodIsEqual = isequal(x,z)
checkDemodIsEqual = logical
   1

refC = qammod([0:M-1]',M);

Show constellation

maxAx = ceil(max(abs(refC)));
cd = comm.ConstellationDiagram(2, ...
    'ShowReferenceConstellation',0, ...
    'ShowLegend',true, ...
    'XLimits',[-(maxAx) maxAx],'YLimits',[-(maxAx) maxAx], ...
    'ChannelNames', ...
    {'y','yTx'});
cd(y,yTx)

Input Arguments

collapse all

Input signal, specified as a scalar, vector, matrix, or array. The elements of this input signal must be binary values or integers in the range [0, (M – 1)], where M is the modulation order.

Note

To process input signal as binary elements, specify InputType='bit'. For binary inputs, the number of rows must be an integer multiple of log2(M). Groups of log2(M) bits are mapped onto a symbol, with the first bit representing the MSB and the last bit representing the LSB.

Data Types: double | single | fi(S,WL,0) | int8 | int16 | uint8 | uint16

Modulation order, specified as an positive integer power of two. The modulation order specifies the number of points in the signal constellation.

Data Types: double | single | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

Symbol order, specified as 'gray', 'bin', or a vector.

  • 'gray' — Use Gray-coded ordering. For more information, see Gray Code.

  • 'bin' — Use binary-coded ordering.

  • Vector — Use custom symbol ordering

Vectors must use unique elements in the range [0, (M – 1)]. The first element corresponds to the upper-left point of the constellation, with subsequent elements running down column-wise from left to right.

Example: [0 3 1 2]

Data Types: string | char | double | single | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

Name-Value Arguments

Specify optional pairs of arguments as Name1=Value1,...,NameN=ValueN, where Name is the argument name and Value is the corresponding value. Name-value arguments must appear after other arguments, but the order of the pairs does not matter.

Before R2021a, use commas to separate each name and value, and enclose Name in quotes.

Example: y = qammod(x,M,symOrder,'InputType','bit')

Input type, specified as 'integer' or 'bit'.

  • If you specify 'integer', the input signal must consist of integers in the range [0, (M – 1)].

  • If you specify 'bit', the input signal must contain binary values, and the number of rows must be an integer multiple of log2(M).

Unit average power flag, specified as a numeric or logical 0 (false) or 1 (true).

  • When this flag is 1 (true), the function scales the constellation to the average power of one watt referenced to 1 ohm.

  • When this flag is 0 (false), the function scales the constellation so that the QAM constellation points are separated by a minimum distance of two.

Output data type, specified as 'double', 'single', or a numerictype object. For more information on constructing these objects, see numerictype (Fixed-Point Designer). This argument determines the data type of the output modulated symbols and the data type used for intermediate computations. Output the fixed-point type as a signed, unscaled numerictype object in MATLAB® simulation, and as a signed, scaled numerictype object during C code or MEX generation.

  • If you do not specify this argument and the input is data type double or a built-in integer, the output data type is double.

  • If the input is data type single, the output data type is single.

  • If the input is fixed-point, this argument must be specified.

Option to plot constellation, specified as a numeric or logical 0 (false) or 1 (true). To plot the QAM constellation, specify PlotConstellation=true.

Output Arguments

collapse all

Modulated signal, returned as a complex scalar, vector, matrix, or array of numeric values.

  • For integer inputs, output Y has the same dimensions as input signal X.

  • For bit inputs, the number of rows in Y is the number of rows in X divided by log2(M).

For more information on the output data type, see OutputDataType.

Data Types: double | single | fi | int8 | int16 | uint8 | uint16

More About

collapse all

Gray Code

A Gray code, also known as a reflected binary code, is a system where the bit patterns in adjacent constellation points differ by only one bit.

Extended Capabilities

C/C++ Code Generation
Generate C and C++ code using MATLAB® Coder™.

Version History

Introduced before R2006a

expand all