Let us derive the theoretical 16QAM bit error rate (BER) with Gray coded constellation mapping in additive white Gaussian noise conditions. Further, the Matlab/Octave simulation script can be used to confirm that the simulation is in good agreement with theory.
Gray coded bit mapping in 16-QAM modulation
As we discussed in the previous post on Binary to Gray code for 16QAM, the 4 bits in each constellation point can be considered as two bits each on independent 4-PAM modulation on I-axis and Q-axis respectively.
| 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

Figure: 16QAM constellation plot with Gray coded mapping
Symbol Error and Bit Error probability
As can be seen from the above constellation diagram, with Gray coded bit mapping, adjacent constellation symbols differ by only one bit. So, if the noise causes the constellation to cross the decision threshold, only 1 out of bits will be in error. So the relation between bit error and symbol error is,
.
Note:
For very low value of , it may so happen that the noise causes the constellation to fall near a diagonally located constellation point. In that case, the each symbol error will cause two bit errors. Hence the need for approximate operator in the above equation. However, for reasonably high value of
, the chances of such events are negligible.
Bit energy and symbol energy
As we learned from the post discussing Bit error rate for 16PSK, since each symbol consists of bits, the symbol to noise ratio k times the bit to noise ratio i.e,
where,
.
16QAM BER
From the post detaling the derivation of 16QAM Symbol error rate, we know that the symbol error is,
.
Combining the above two equations, the bit error rate for Gray coded 16QAM in Additive White Gaussian Noise is
Simulation model
The Matlab/Octave script performs the following:
(a) Generation of random binary sequence
(b) Assigning group of 4 bits to each 16-QAM constellation symbol per the Gray mapping
(c) Addition of white Gaussian Noise
(d) Demodulation of 16-QAM symbols and
(e) De-mapping per decimal to Gray conversion
(f) Counting the number of bit errors
(g) Running this for each value of Eb/No in steps of 1dB.
Click here to download : Script for computing 16QAM BER with Gray mapping

Figure: Bit Error Rate plot for 16QAM modulation with Gray mapping
I think we have analyzed the bit error and symbol error probabilites for most of the PSK and QAM modulation schemes in Additive White Gaussian Noise. Time to move on to error rate in multipath channel. receiver diversity. MIMO channel, modulation with memory etc etc
Related posts
- Bit error rate for 16PSK modulation using Gray mapping
- Binary to Gray code for 16QAM
- Comparing 16PSK vs 16QAM for symbol error rate
- Softbit for 16QAM
- Comparing BPSK, QPSK, 4PAM, 16QAM, 16PSK, 64QAM and 32PSK
D id you like this article? Make sure that you do not miss a new article by subscribing to RSS feed OR subscribing to e-mail newsletter. Note: Subscribing via e-mail entitles you to download the free e-Book on BER of BPSK/QPSK/16QAM/16PSK in AWGN.

(4 votes, average: 4.75 out of 5)
{ 2 trackbacks }
{ 29 comments… read them below or add one }
hi
I need article about walsh modulator
plz help me
bye
Hi, I have found your matlab code on the 16qam ber with gray code on the site http://www.dsplog.com and I have two question to ask you please.
1) What is the difference between “16qam ber with gray code” and “16qam ber without gray code”?
2) How do you get the theoretical expression of any M-aire qam ber.?
can you give me the corresponding expression of the 64-qam.?
Thanks for your help.
@yvon: My replies:
1/ With Gray coded mapping, the bit loading into adjacent constellation symbols differ by only one bit. So, each error in constellation symbol typically results in one bit being in error. Without Gray coded bit mapping, this assumption is no longer true.
2/ I have posted about theoretical derivation of M-QAM symbol error rate @
http://www.dsplog.com/2008/05/24/article-in-dspdesignlinecom-m-qam-symbol-error/
Hope this helps.
Hello Krishna Pillai
Your blog helps me a lot!
I still have some question about the BER and SER on 16QAM
In code for caculating SER
n = 1/sqrt(2)*[randn(1,N) + j*randn(1,N)];
y = s + 10^(-Es_N0_dB(ii)/20)*n; % additive white gaussian noise
In code for caculating BER
n = 1/sqrt(2)*[randn(1,N) + j*randn(1,N)];
y = s + 10^(-Es_N0_dB(ii)/20)*n; % additive white gaussian noise
1)what’s the difference using Es/N0 or Eb/N0?
2)if I want to draw the curve of SER and using Eb/N0 as the x-axis
is that wrong??
Thanks~
@K.T.Liao: My replies:
1) Es/N0 refers to symbol to noise ratio and Eb/N0 refers to bit to noise ratio. For eg, in 16QAM, each constellation symbol carries 4 bits, so Es/N0 = 4Eb/N0.
2) Nothing wrong in plotting SER vs Eb/N0. I have written a post on it @
http://www.dspdesignline.com/howto/208801783;jsessionid=QJJFYXQLQJMO1QE1GHRSKHWATMY32JVN?pgno=2
hi i need the matlab code for
” channel estimation and predicition for adaptive OFDM links”.
plz help me….
@venkat: Sorry, I do not have the Matlab code.
sir, i am new here. How i can add convolution encoding & viterbi decoding within the code. Are the code same for 16psk & 16qam???if u have code pls write.
@ipraz2: You can look at some convolutional encoder + Viterbi decoder posts @
http://www.dsplog.com/2009/01/04/convolutional-code/
http://www.dsplog.com/2009/01/04/viterbi/
http://www.dsplog.com/2009/01/14/soft-viterbi/
http://www.dsplog.com/2009/07/27/viterbi-with-finite-survivor-state-memory/
http://www.dsplog.com/2009/08/21/matlab-or-c-for-viterbi-decoder/
You may find 16PSK posts @
http://www.dsplog.com/2008/03/18/symbol-error-rate-for-16psk/
http://www.dsplog.com/2008/05/18/bit-error-rate-for-16psk-modulation-using-gray-mapping/
Good luck.
hi sir.
i’m new to matlab and have problem to modulate the 64QAM bit error rate.
how do i change the code u wrote in 16QAM to 64QAM or 256QAM?
every help is much appreciated.
@izzat: Please check the post http://www.dspdesignline.com/howto/207601769 and
http://www.dsplog.com/2008/07/08/compare-bpsk-qpsk-4pam-16qam-16psk-64qam-32psk/
Hello ! Thank you so much for this great work ^_^
I have a question about the n noise :
n = 1/sqrt(2)*[randn(1,N) + j*randn(1,N)]; 0 dB variance
if I didn’t use a complex noise, wh
Hello ! Thank you so much for this great work ^_^
I have a question about the n noise :
n = 1/sqrt(2)*[randn(1,N) + j*randn(1,N)]; 0 dB variance
if I use a real noise, what is the value of the variance ?
@Fritzou: 3dB less.
@Fritzou: If you dont use complex, then the variance will be down by 3dB.
I dont understand why while normalizing the transmit power to 1, you use the factor 1/sqrt(10). Would you explain it more? How about this factor in 32QAM and 64QAM? Thank you
@minh: Please refer http://www.dsplog.com/2007/09/23/scaling-factor-in-qam/
Thanks for the great info on here, it’s helping alot…
I am having a problem seeing how I would factor in the number of users, and the processing gain, of a CDMA system for the Probability of Bit error….
I am assuming that the Gp and the number of users, would be factored into the value for Eb but I’m not sure. Can you give me some direction on this?
Thanks
@Preston: Well, I did not quite understand how you are using 16QAM Gray mapping to the CDMA case? In the CDMA case, I would expect you to have a code for each user.
Hello Mr Krishna Sankar
Great work
why you didn’t use an filter in the transmission and in the reception?(raised cosine)
what would I do if I had this case ?
Thanks .
@Fritzou: The transmit and receive filters will cause additional notational complexity, which I wished to avoid in this post. I have some posts on simulations with transmit and receive filters
a) http://www.dsplog.com/2008/05/01/eye-diagram-plot-matlab-raised-cosine-filter/
b) http://www.dsplog.com/2008/04/22/raised-cosine-filter-for-transmit-pulse-shaping/
c) http://www.dsplog.com/2009/05/08/ber-with-matched-filtering/
please send me simulation for 16QAM and 64 QAM modulation and demodulation for convolutionaly encoding and viterbi decoding and theoritical BER for convolutionaly BPSK,QPSK,16QAM,64QAM
@shadat: Please refer to the post
http://www.dsplog.com/2008/07/08/compare-bpsk-qpsk-4pam-16qam-16psk-64qam-32psk/
http://www.dsplog.com/tag/viterbi
I am waleed from palestinian
I was in need the performnce of bit error rate in pre-ffT and postfft at frequency selective fading .
plesae help me
thank for all
@waleed salos: Hopefully the post on BER for BPSK with OFDM in multipath channel might be of help
http://www.dsplog.com/2008/08/26/ofdm-rayleigh-channel-ber-bpsk/
Dear Krishna sankar
I waleed salos Thank alot for Reply but I need Matlab codes for Post and pre-FFT Beamforming in an OFDM system
or
LMS Beamforming for Pre and Post-FFT processing in OFDM communication systems
Thank for all
@waleed: Sorry, I am not familiar with the topic which you are referring to.
hye sir…. do you have any tutorial on how to structure the constellation because the symbols is randomly being plot in the graph… i want to start with {0000} first and lastly to {1111)..- from left top corner of the constellation then move to the right and down…
please help me in 16 qam modulation.any one send me the matlab code of 16 qam modulation.