- DSP log - http://www.dsplog.com -

Binary to Gray code for 16QAM

Posted By Krishna Sankar On June 1, 2008 @ 6:28 am In Modulation | 13 Comments

In the previous post on Binary to Gray code conversion for PSK, I had claimed that “for a general M-QAM modulation the binary to Gray code conversion is bit more complicated“. However following a closer look, I realize that this is not so complicated.

The QAM scenario can be treated as independent PAM modulation on I arm and Q-arm respectively. For example, let us consider 16-QAM scenario.

Each constellation point can represent $\log_2(16)=4$bits, with two bits on the I axis and two on the Q axis. For 16-QAM, the values taken by the I and Q axes are {-3, -1, +1, +3}. The two bits on the I and Q arm can be Gray coded as shown in the table below

 b0b1 I b2b3 Q 00 -3 00 -3 01 -1 01 -1 11 +1 11 +1 10 +3 10 +3

Table: Gray coded constellation mapping for 16-QAM

The constellation diagram with the bit mapping is shown below.

Figure: 16QAM constellation with Gray coded mapping

As can be observed from the figure above, the adjacent constellation symbols differ by only one bit. As simple as that.

## Simulation model for Binary to Gray coded mapping for 16-QAM

% Matlab/Octave code for converting bits into 16-QAM constellation

clear all
M = 16;
% number of constellation points
k = log2(M); % number of bits in each constellation
% defining the real and imaginary PAM constellation
% for 16-QAM
alphaRe = [-(2*sqrt(M)/2-1):2:-1 1:2:2*sqrt(M)/2-1];
alphaIm = [-(2*sqrt(M)/2-1):2:-1 1:2:2*sqrt(M)/2-1];
% input - decimal equivalent of all combinations with b0b1b2b3
ip = [0:15];
ipBin = dec2bin(ip.'); % decimal to binary
% taking b0b1 for real
ipDecRe = bin2dec(ipBin(:,[1:k/2]));
ipGrayDecRe = bitxor(ipDecRe,floor(ipDecRe/2));
% taking b2b3 for imaginary
ipDecIm = bin2dec(ipBin(:,[k/2+1:k]));
ipGrayDecIm = bitxor(ipDecIm,floor(ipDecIm/2));
% mapping the Gray coded symbols into constellation
modRe = alphaRe(ipGrayDecRe+1);
modIm = alphaIm(ipGrayDecIm+1);
% complex constellation
mod = modRe + j*modIm;

Note:

The above code snippet works only for 4QAM and 16QAM.