Main Content

genqammod

General quadrature amplitude modulation (QAM)

Description

Y = genqammod(X,const) returns the complex envelope of the QAM for message signal X. Input const specifies the signal mapping for the modulation.

example

Y = genqammod(X,const,InputType=inType) additionally specifies the input type of the message signal.

Examples

collapse all

Transmit and receive data using a nonrectangular 16-ary constellation in the presence of Gaussian noise. Show the scatter plot of the noisy constellation and estimate the symbol error rate (SER) for two different SNRs.

Create a 16-QAM constellation based on the V.29 standard for telephone-line modems.

c = [-5 -5i 5 5i -3 -3-3i -3i 3-3i 3 3+3i 3i -3+3i -1 -1i 1 1i];
sigpower = pow2db(mean(abs(c).^2));
M = length(c);

Generate random symbols.

data = randi([0 M-1],2000,1);

Modulate the data by using the genqammod function. General QAM modulation is necessary because the custom constellation is not rectangular.

modData = genqammod(data,c);

Pass the signal through an AWGN channel with a 20 dB SNR.

rxSig = awgn(modData,20,sigpower);

Display a scatter plot of the received signal and the reference constellation c.

h = scatterplot(rxSig);
hold on
scatterplot(c,[],[],'r*',h)
grid
hold off

Constellation diagram scatter plot of the reference signal and the modulated signal passed through an awgn channel.

Demodulate the received signal by using the genqamdemod function. Determine the number of symbol errors and the SER.

demodData = genqamdemod(rxSig,c);
[numErrors,ser] = symerr(data,demodData)
numErrors = 
4
ser = 
0.0020

Repeat the transmission and demodulation process with an AWGN channel with a 10 dB SNR. Determine the SER for the reduced SNR. As expected, the performance degrades when the SNR is decreased.

rxSig = awgn(modData,10,sigpower);
demodData = genqamdemod(rxSig,c);
[numErrors,ser] = symerr(data,demodData)
numErrors = 
457
ser = 
0.2285

Create the points that describe a hexagonal constellation.

inphase = [1/2 1 1 1/2 1/2 2 2 5/2];
quadr = [0 1 -1 2 -2 1 -1 0];
inphase = [inphase;-inphase]; inphase = inphase(:);
quadr = [quadr;quadr]; quadr = quadr(:);
const = inphase + 1i*quadr;

Plot the constellation.

h = scatterplot(const);

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.

Generate input data symbols. Modulate the symbols using this constellation.

x = [3 8 5 10 7];
y = genqammod(x,const);

Demodulate the modulated signal, y.

z = genqamdemod(y,const);

Plot the modulated signal in same figure.

hold on;
scatterplot(y,1,0,'ro',h);
legend('Constellation','Modulated signal');
hold off;

Figure Scatter Plot contains an axes object. The axes object with title Scatter plot, xlabel In-Phase, ylabel Quadrature contains 2 objects of type line. One or more of the lines displays its values using only markers These objects represent Constellation, Modulated signal.

Determine the number of symbol errors between the demodulated data to the original sequence.

numErrs = symerr(x,z)
numErrs = 
0

Input Arguments

collapse all

Message signal, specified as a scalar, vector, matrix, 3-D array, 4-D array, dlarray (Deep Learning Toolbox) object, or gpuArray object. For more information, see Array Support. The message signal must be binary values or consist of integers in the range [0,length(const) – 1]. If X is a matrix with multiple rows, the function processes the columns independently.

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

Signal mapping, specified as a complex vector, dlarray (Deep Learning Toolbox) object, or gpuArray object .

Data Types: double | single | fi | int8 | int16 | uint8 | uint16
Complex Number Support: Yes

Input type, specified as one of these options.

  • "integer" — The message signal is an integer in the range [0, M-1], where M is the length of the constellation.

  • "bit" — The message signal is binary, containing values of 0 and 1. In this case, the number of rows must be an integer multiple of log2(M). The function maps a group of log2(M) bits onto a symbol, with the first bit representing the most significant bit (MSB) and the last bit representing the lowest significant bit (LSB).

Output Arguments

collapse all

Complex envelope, returned as a scalar, vector, matrix, 3-D array, 4-D array, dlarray object, or gpuArray object.

y is a gpuArray object if either x or const is a gpuArray object. y is a dlarray object if either x or const is a dlarray object.

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).

Data Types: double | single | fi | int8 | int16 | uint8 | uint16
Complex Number Support: Yes

More About

collapse all

Extended Capabilities

expand all

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

Version History

Introduced before R2006a

expand all