MATLAB Code for Constellation Diagram of QAM configurations such as 4, 8, 16, 32, 64, 128, and 256-QAM
Overview of QAM
One of the best-performing modulation techniques is QAM [↗]. Here, we modulate the symbols by varying the carrier signal's amplitude and phase in response to the variation in the message signal (or voltage variation). So, we may say that QAM is a combination of phase and amplitude modulation.
Additionally, it performs better than ASK or PSK [↗]. In fact, any constellation for any type of modulation, signal set (or, symbols) is structured in a way that prevents them from interacting further by being distinct by phase, amplitude, or frequency.
MATLAB Script (for 4-QAM)
This is an example of 4-QAM. Here constellation size is 4 or total number of symbols/signals is 4. We map the decimal value of the input symbols (00, 01, 10, 11) to complex coordinates.
% This code is written by SalimWirelss.Com
clc;clear all;close all;
M = 4; % Number of levels
k = log2(M); % Bits per symbol
rng(10) % seed
N = 10000; % Number of bits
InputBits = randi([0 1],1,N);
InputSymbol_matrix = reshape(InputBits,length(InputBits)/k,k);
InputSymbols_decimal = bi2de(InputSymbol_matrix);
for n= 1:N/k
if InputSymbols_decimal(n)==0
QAM(n)= complex(1,1);
elseif InputSymbols_decimal(n)==1
QAM(n)= complex(-1,1);
elseif InputSymbols_decimal(n)==2
QAM(n)= complex(1,-1);
else
QAM(n)= complex(-1,-1);
end
end
% Transmission over AWGN
snrdB = 10;
Y=awgn(QAM,snrdB);
% Threshold Detection
for n= 1:N/k
if (real(Y(n))>0 && imag(Y(n))>0)
Z(n)=complex(1,1);
elseif (real(Y(n))>0 && imag(Y(n))<0 complex="" elseif="" imag="" n="" real="" z="">0)
Z(n)=complex(-1,1);
else
Z(n)=complex(-1,-1);
end
end
figure(1); scatter(real(QAM), imag(QAM)); xlim([-3, 3]); ylim([-3, 3]); title('Transmitted');
figure(2); scatter(real(Y), imag(Y)); xlim([-3, 3]); ylim([-3, 3]); title('Received');0>
Another MATLAB Code (for 16-QAM)
A custom implementation for 16-QAM modulation and demodulation including normalization to unit average power.
% The code is developed by SalimWireless.Com
clc; clear; close all;
M = 16;
numSymbols = 10000;
data = randi([0 M-1], numSymbols, 1);
modData = qammod_custom(data, M);
snrdB = 15;
Y = awgn(modData,snrdB);
figure;
subplot(2,1,1); scatter(real(modData), imag(modData), 'o'); grid on;
title('Constellation Diagram (16-QAM)');
subplot(2,1,2); scatter(real(Y), imag(Y), 'o'); grid on;
title('Received Noisy Signal');
% Custom Functions
function modData = qammod_custom(data, M)
constellation = [-3-3i, -3-1i, -1-3i, -1-1i, -3+3i, -3+1i, -1+3i, -1+1i, ...
+3-3i, +3-1i, +1-3i, +1-1i, +3+3i, +3+1i, +1+3i, +1+1i];
constellation = constellation / sqrt(mean(abs(constellation).^2));
modData = constellation(data + 1);
end
MATLAB for M-ary QAM (General)
This code supports multiple configurations such as 4, 8, 16, 32, 64, 128, and 256-QAM using MATLAB's built-in functions.
% The code is developed by SalimWireless.com
M = 32; % Order of QAM
N = 1000; % Symbols
SNR = 10;
dataSymbols = randi([0 M-1], N, 1);
txSignal = qammod(dataSymbols, M);
rxSignal = awgn(txSignal, SNR, 'measured');
demodulatedSymbols = qamdemod(rxSignal, M);
SER = sum(dataSymbols ~= demodulatedSymbols) / N;
disp(['Symbol Error Rate: ', num2str(SER)]);
figure;
subplot(2, 1, 1); plot(real(txSignal), imag(txSignal), 'o'); title('Transmitted');
subplot(2, 1, 2); plot(real(rxSignal), imag(rxSignal), 'o'); title('Received');
BER vs SNR Analysis
Evaluate the performance of various QAM configurations by plotting Bit Error Rate against Signal-to-Noise Ratio.
Interactive QAM Simulator
Visualize 4-QAM, 16-QAM, 64-QAM, and 256-QAM constellations instantly with our online tool.