16QAM Bit Error Rate (BER) with Gray mapping

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

16QAM modulation with Gray coded mapping

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,



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,




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 🙂

Hope this helps,

79 thoughts on “16QAM Bit Error Rate (BER) with Gray mapping

  1. hai krishna pillai frnd, i want to simulate the transmission of message using QAM in different frequency domain in DSP MATLAB

  2. Hi krishna!
    finally I can access your blog again 🙂
    i have a query why cant we use grey coding for 32-bit Cross QAM?
    btw I am just curious why you have not given any code for odd number of bits per symbol cross QAM or rectangular QAM?

    1. @sara: Glad that you are able to visit the blog – not sure about the issue.
      Digitial communication is a vast topic – have only have a handfull of articles in this blog. I have not read much about rectangular QAM. Will study and revert.

  3. hello sir how can I join in this ? how can I interact with u? my research topic is optimization of PAPR in OFDM systems

  4. Hi Krishna,

    First of all, congratulations for this blog which is very interesting.
    I was wondering if you ever try to apply Grey mapping to a binary PCS code? I’ve been trying by finding the periodic autocorrelation function first but then it gets kind of confused. If you ever try this before, could you probably give some guidence how to tackle it/ I will really appreciate.

  5. Hello Krishna
    tank you for your site… it is fantastic.
    could you help me?
    I want to simulation convolutional code with viterbi algorithm . . .
    I need to help for MATLAB code!

  6. Pingback: Softbit for 16QAM
  7. hi krishna
    Simulate & Compare the BER of a 8-PSK system and a 8-QAM system with grey coding and Eb/No==0,2,4,6,8,10 dB
    can you plz post the steps to run this program?


  8. Hello Krishna Pillai.
    i want help
    if we generate random signal to 16qam like this:
    x= rand(1,100000);
    s=(x<1/16)*(3+3i)+(x1/16)*(3+i) +…….etc
    then if we want to know number of error we added noise to this signal
    sig=(x>0)*(3+3i) % test one of 16 qam
    n=awgn(sig,snr) ;
    so that this result should be compatible with theoretical law
    but the result is not compatible ,please where is the error

  9. Hello krishna,
    I am working on the viterbi decoding of the rate1/2 convolution encoder of constraint length 7. I am facing difficulty in coding the state metric and traceback unit of viterbi decoder on matlab as there will be 64 states. could you please help me out in this.

  10. plz provide me the code for my project which is described as:-
    Consider a 16QAM communication system. The information rate is 2 Mb/s and the
    carrier frequency is 12 GHz. Assume perfect synchronization.
    a) Simulate the system if the channel is AWGN and draw bit error rate of the system
    versus Eb/No. Compare the results with what you obtain in theory.
    b) Consider (15,11) Hamming code. Apply this code into the above system.
    Compare the results with what you obtain in theory.
    c) Simulate uncoded system if we have a Doppler Spread due to mobile movement
    in the channel. Simulate and draw the bit error rate of the system for maximum
    mobile speed 42.3 Km/Hour. No equalizer is used in the system.
    d) Apply coding of part (b) into the system of part (c). Simulate the system and
    discuss the results.
    e) Design an interleaver for the system of part (d) to improve the coded performance
    results. Simulate the system.
    f) Discuss all the results.

  11. Hi,
    I’ve just gone through some of your tutorials and I really appreciate the work you are doing. I’ve just subscribed to your feed and will appreciate if you could send me the free ebook as well.

  12. Hello Sir,

    I want to compare BER performance of OFDM system using BPSK, M-PSK and M-QAM schemes with Rayeleigh/Ricean Fading channel. Can u please send me script which can help me …..please I am new to MATLAB

  13. Dear Krishna,

    I need to calculate Matlab code for 64 QAM BER!
    I wonder how to change the code you wrote for 64 QAM SER to 64QAM BER ?
    Please could you explain, I should know it as soon as possible.


  14. Dear Sir,

    For BPSK AWGN AND BPSK RAYLEIGH , Eb = 1 already. But for 16-QAM, Eb=2.5 by doing theoretical calculation and also what you did in your 16-QAM script. Now how shall I make Eb=1 for 16-QAM case so that I can compare this 16-QAM with BPSK AWGN AND BPSK RAYLEIGH?
    Please kindly help me in this above problem.
    Thank You

  15. I want to realize the simulation of the transmission using OFDM with 16QAM thank you for helping me if possible as much as possible

  16. sir,
    i am mid way in matlab.i mean not very good and not very bad.
    i am simulating and implementing the practical adsl environment in matlab.
    please help me regarding it.

  17. 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…

    1. @anna: If you see carefully, its not chosen randomly. Its chosen in a way such that adjacent constellation symbols differ by one one bit (and that called Gray coding) 🙂

  18. 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
    LMS Beamforming for Pre and Post-FFT processing in OFDM communication systems
    Thank for all

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

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

  21. 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?


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

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

    1. 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 ?

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

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

  26. 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??

  27. Hi, I have found your matlab code on the 16qam ber with gray code on the site https://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.

Leave a Reply

Your email address will not be published. Required fields are marked *