Articles

# Symbol Error rate for QAM (16, 64, 256,.., M-QAM)

In May 2008, we derived the theoretical symbol error rate for a general M-QAM modulation (in  Embedded.comDSPDesignLine.com and dsplog.com) under Additive White Gaussian Noise. While re-reading that post, felt that the article is nice and warrants a re-run, using OFDM as the underlying physical layer. This post discuss the derivation of symbol error rate for a general M-QAM modulation. The companion Matlab script compares the theoretical and the simulated symbol error rate for 16QAM, 64QAM and 256QAM over OFDM in AWGN channel.

Enjoy and HAPPY NEW YEAR 2012 !!!

Quadrature Amplitude Modulation (QAM) schemes like 16-QAM, 64-QAM are used in typical wireless digital communications specifications like IEEE802.11aIEEE802.16d. In this post let us derive the equation for probability of symbol being in error for a general M-QAM constellation, given that the signal (symbol) to noise ratio is $\frac{E_s}{N_0}$ .

## The general M-QAM constellation

The number of points in the constellation is defined as, $M=2^b$ where $b$ is the number of bits in each constellation symbol. In this analysis, it is desirable to restrict $b$ to be an even number for the following reasons (Refer Sec 5.2.2 in [DIG-COMM-BARRY-LEE-MESSERSCHMITT]):

1. Half the bits are represented on the real axis and half the bits are represented on imaginary axis. The in-phase and quadrature signals are independent $b/2$ level Pulse Amplitude Modulation (PAM) signals. This simplifies the design of mapper.

2. For decoding, symbol decisions may be applied independently on the real and imaginary axis, simplifying the receiver implementation.

Note that the above square constellation is not the most optimal scheme for a given signal to noise ratio.

## Average energy of an M-QAM constellation

In a general M-QAM constellation where $M=2^b$ and $b$ the number of bits in each constellation is even, the alphabets used are:

$\alpha_{MQAM}=\left{\pm(2m-1)\pm(2m-1)j\right}$, where $m \in \left{1, \cdots,\frac{\sqrt{M}}{2}\right}$.

For example, considering a 64-QAM ($M=64$) constellation,

$m \in \left{1,\ 2,\ 3,\ 4\right}$ and the alphabets are

$\alpha_{64QAM}=\left{\pm7 \pm7j,\ \pm7 \pm5j,\ \pm7 \pm3j, \pm7 \pm1j,\\\pm5 \pm7j,\ \pm5 \pm5j,\ \pm5 \pm3j,\ \pm5 \pm1j,\ \\\pm3 \pm7j,\ \pm3 \pm5j,\ \pm3 \pm3j,\ \pm3 \pm1j, \\\pm1 \pm7j,\ \pm1 \pm5j,\ \pm1 \pm3j,\ \pm1 \pm1j\right}$.

For computing the average energy of the M-QAM constellation, let us proceed as follows:

(a) Find the sum of energy of the individual alphabets

$\begin{eqnarray}E__\alpha & =&\sum_{m=1}^{\frac{\sqrt{M}}{2}}\left|(2m-1)+j(2m-1)\right|^2\\&=&\frac{\sqrt{M}}{3}(M-1)\end{eqnarray}$

(b) Each alphabet is used $2\sqrt{M}$ times in the M-QAM constellation.

(c) So, to find the average energy from $M$ constellation symbols, divide the product of (a) and (b) by$M$.The average energy is,

$\begin{eqnarray}E_{MQAM} & = & \frac{2\sqrt{M}}{M}E_\alpha\\&=&\frac{2\sqrt{M}}{M}\frac{\sqrt{M}}{3}(M-1)\\&=&\frac{2}{3}(M-1)\end{eqnarray}$.

Plugging in the number for 64-QAM,
$E_{64QAM}=\frac{2}{3}(64-1)=42$.

Plugging in the number for 16-QAM,
$E_{16QAM}=\frac{2}{3}(16-1)=10$.

From the above explanations, it is reasonably intuitive to guess that the scaling factor of $\frac{1}{\sqrt{10}}$$\frac{1}{\sqrt{42}}$ which is seen along with 16-QAM, 64-QAM constellations respectively is for normalizing the average transmit power to unity.

## Finding the symbol error rate

For computing the symbol error rate for an M-QAM modulation, let us consider the 64-QAM constellation as shown in the figure below and extend it to the M-QAM case.

Figure: Constellation plot for 64-QAM modulation (without the scaling factor of $\frac{1}{\sqrt{42}}$)

As can be seen from the above figure, there are three types of constellation points in a general M-QAM constellation:

(a) Constellation points in the corner (red-square)
The number of constellation points in the corner in any M-QAM constellation is always 4, i.e

$N_{corner}=4$

(b) Constellation points in the inside (magneta-diamond)
The number of constellation points in the inside is,

$N_{inside}=(\sqrt{M}-2)(\sqrt{M}-2)$.
For example with M=64, there are 36 constellation points in the inside.

(c) Constellation points neither at the corner, nor at the center (blue-star) The number of constellation points of this category is,
$N_{\mbox{neither inside nor corner}}=4(\sqrt{M}-2)$.

For example with M=64, there are 24 constellation points in the inside.

## Additive White Gaussian Noise (AWGN) channel

$y=k\sqrt{E_s}s+n$, where

$E_s$ is the energy,
$k=\sqrt{\frac{1}{\frac{2}{3}(M-1)}}$ is the normalizing factor,

$s$ is the transmit symbol and
$n$ is the noise.

Assume that the additive noise $n$ follows the Gaussian probability distribution function,

$p(x) = \frac{1}{\sqrt{2\pi\sigma^2}}e^{\frac{-(x-\mu)^2}{2\sigma^2}$ with

mean $\mu=0$ and

variance $\sigma^2 = \frac{N_0}{2}$.

Symbol in the inside $I=+1, Q=+1$ (magenta-diamond)

The conditional probability distribution function (PDF) of $y$given that the transmitted symbol is $\left{ +k\sqrt{E_s},+k\sqrt{E_s}\right}$ :

$p(y|inside)=\frac{1}{\sqrt{\pi N_0}}e^{\frac{-(y-k\sqrt{Es})^2}{N_0}}$.

As can be seen from the above figure, the symbol in the inside is decoded correctly only if real part of $y$ $(\Re y)$ lies inbetween 0 to 2 and the imaginary part of $y$ $(\Im y)$ lies inbetween 0 to 2. The probability of correct demodulation is,

$p(c|inside) = p\left(\Re y >0, \Re y\le 2k\sqrt{E_s} | +1\right)p\left(\Im y >0, \Im y\le 2k\sqrt{E_s} | +1\right)$.

The probability of the real component falling with in 0 to 2 can be found by integrating the probability distribution function of two parts:

(a) Find the probability that the real component lies from $2$ to $+\infty$.

(b) Find the probability that the real component lies from $-\infty$ to $0$.

(c) Given that the total probability is always 1, for finding the probability of the real component lies within $0$ to $2$, subtract the sum of (a) and (b) from 1.

$\begin{eqnarray}p\left(\Re y >0, \Re y\le 2k\sqrt{E_s} | +1\right)& =& 1-\left[\frac{1}{\sqrt{\pi N_0}}\int_{-\infty}^{0}e^{\frac{-(y-k\sqrt{Es})^2}{N_0}}dy + \frac{1}{\sqrt{\pi N_0}}\int_{2k\sqrt{E_s}}^{+\infty}e^{\frac{-(y-k\sqrt{Es})^2}{N_0}}dy\right]\\& = & 1-erfc\left(k\sqrt{\frac{E_s}{N_0}} \right)\end{eqnarray}$

Note: The complementary error function, $erfc(x) = \frac{2}{\sqrt{\pi}}\int_x^\infty e^{-x^2}dx$.

Similarly,

$\begin{eqnarray}p\left(\Im y >0, \Im y\le 2k\sqrt{E_s} | +1\right)& =&1-erfc\left(k\sqrt{\frac{E_s}{N_0}} \right)\end{eqnarray}$.

From the above equations,

$p(c|inside) = \left[1-erfc\left(\sqrt{\frac{E_s}{10N_o}}\right)\right]\left[1-erfc\left(\sqrt{\frac{E_s}{10N_o}}\right)\right]$.

The probability of the symbol decoded being in error is,

$\begin{eqnarray}p(e|inside) &=&1-\left[1-erfc\left(k\sqrt{\frac{E_s}{N_0}} \right)\right]^2\\& =& 2erfc\left(k\sqrt{\frac{E_s}{N_0}} \right) - erfc^2\left(k\sqrt{\frac{E_s}{N_0}} \right)\end{eqnarray}$.

Symbol in the corner $I=+7, Q=+7$ (red-square)

The conditional probability distribution function (PDF) of $y$given that the transmitted symbol is $\left{ +7k\sqrt{E_s},+7k\sqrt{E_s}\right}$ :

$p(y|inside)=\frac{1}{\sqrt{\pi N_0}}e^{\frac{-(y-7k\sqrt{Es})^2}{N_0}}$.

As can be seen from the above figure, the symbol in the inside is decoded correctly only if real part of $y$ $(\Re y)$ lies from $6$ to $\infty$ and the imaginary part of $y$ $(\Im y)$ lies from $6$ to $\infty$.

$p(c|corner) = p\left(\Re y >6, \Re y\le \infty| +7\right)p\left(\Im y >0, \Im y\le \infty | +7\right)$.

For finding the probability that the real component lies from $6$ to $\infty$, one can integrate the probability distribution function of the received symbol.

$\begin{eqnarray}p\left(\Re y >6, \Re y\le \infty| +7\right)& =& \frac{1}{\sqrt{\pi N_0}}\int_{6k\sqrt{E_s}}^{+\infty}e^{\frac{-(y-7k\sqrt{Es})^2}{N_0}}dy \\& = & 1-\frac{1}{2}erfc\left(k\sqrt{\frac{E_s}{N_0}} \right)\end{eqnarray}$

Similarly,

$\begin{eqnarray}p\left(\Im y >6, \Im y\le \infty| +7\right)& =& \frac{1}{\sqrt{\pi N_0}}\int_{6k\sqrt{E_s}}^{+\infty}e^{\frac{-(y-7k\sqrt{Es})^2}{N_0}}dy \\& = & 1-\frac{1}{2}erfc\left(k\sqrt{\frac{E_s}{N_0}} \right)\end{eqnarray}$.

So, probability that the decoded symbol is correct given $I=+7, Q=+7$is transmitted is,

$\begin{eqnarray}p(c|corner) &=& \left[1-\frac{1}{2}erfc\left(k\sqrt{\frac{E_s}{N_0}} \right) \right]\left[1-\frac{1}{2}erfc\left(k\sqrt{\frac{E_s}{N_0}} \right) \right]\\&=&1-erfc\left(k\sqrt{\frac{E_s}{N_0}} \right) + \frac{1}{4}erfc^2\left(k\sqrt{\frac{E_s}{N_0}} \right)\end{eqnarray}$.

Now, the probability of the symbol decoded being in error is,

$\begin{eqnarray}p(e|corner) &=&1-p(c|corner)\\& =& erfc\left(k\sqrt{\frac{E_s}{N_0}} \right) - \frac{1}{4}erfc^2\left(k\sqrt{\frac{E_s}{N_0}} \right)\end{eqnarray}$.

Symbol neither at the corner nor inside $I=+7, Q=+1$ (blue-star)

As can be seen from the above figure, the symbol in the inside is decoded correctly only if real part of $y$ $(\Re y)$ lies from $6$ to $\infty$ and the imaginary part of $y$ $(\Im y)$ lies from 0 to 2.

$p(c|corner) = p\left(\Re y >6, \Re y\le \infty| +7\right)p\left(\Im y >0, \Im y\le \infty | +7\right)$.

For finding the probability that the real component lies from $6$ to $\infty$, one can integrate the probability distribution function of the received symbol.

$\begin{eqnarray}p\left(\Re y >6, \Re y\le \infty| +7\right)& =& \frac{1}{\sqrt{\pi N_0}}\int_{6k\sqrt{E_s}}^{+\infty}e^{\frac{-(y-7k\sqrt{Es})^2}{N_0}}dy \\& = & 1-\frac{1}{2}erfc\left(k\sqrt{\frac{E_s}{N_0}} \right)\end{eqnarray}$.

As described for the symbol in the inside scenario, the probability of the imaginary component falling with in 0 to 2 can be found by integrating the probability distribution function of two parts:

(a) Find the probability that the imaginary component lies from $2$ to $+\infty$.

(b) Find the probability that the imaginary component lies from $-\infty$ to $0$.

(c) As the total probability is 1, for finding the probability of the imaginary component lies within $0$ to $2$, subtract the sum of (a) and (b) from 1.

$\begin{eqnarray}p\left(\Im y >0, \Im y\le 2k\sqrt{E_s} | +1\right)& =& 1-\left[\frac{1}{\sqrt{\pi N_0}}\int_{-\infty}^{0}e^{\frac{-(y-k\sqrt{Es})^2}{N_0}}dy + \frac{1}{\sqrt{\pi N_0}}\int_{2k\sqrt{E_s}}^{+\infty}e^{\frac{-(y-k\sqrt{Es})^2}{N_0}}dy\right]\\& = & 1-erfc\left(k\sqrt{\frac{E_s}{N_0}} \right)\end{eqnarray}$

So the probability that the symbol is decoded correctly is,

$\begin{eqnarray}p(c|\mbox{neither inside nor corner}) &=& \left[1-erfc\left(k\sqrt{\frac{E_s}{N_0}} \right) \right]\left[1-\frac{1}{2}erfc\left(k\sqrt{\frac{E_s}{N_0}} \right) \right]\\&=&1-\frac{3}{2}erfc\left(k\sqrt{\frac{E_s}{N_0}} \right) + \frac{1}{2}erfc^2\left(k\sqrt{\frac{E_s}{N_0}} \right)\end{eqnarray}$

The probability of error is,

$\begin{eqnarray}p(e|\mbox{neither inside nor corner}) &=&1-p(c|\mbox{neither inside nor corner})\\& =& \frac{3}{2}erfc\left(k\sqrt{\frac{E_s}{N_0}} \right) - \frac{1}{2}erfc^2\left(k\sqrt{\frac{E_s}{N_0}} \right)\end{eqnarray}$.

Total symbol error probability

Given that we have computed the individual symbol error probability for each of the three types of constellation points, to find the joint symbol error rate we compute the average error i.e.

$P(e|MQAM) = \frac{N_{inside}p(e|inside) + \\ N_{corner}p(e|corner) + \\ N_{\mbox{neither inside nor corner}}p(e|\mbox{neither inside nor corner})}{M}$

Pluging in the equations,
$\Large \begin{array}{rrr}P(e|MQAM)& = & 2\left(1-\frac{1}{\sqrt{M}}\right)erfc\left(k\sqrt{\frac{E_s}{N_0}}\right)-\\ & & \left(1-\frac{2}{\sqrt{M}}+ \frac{1}{M}\right)erfc^2\left(k\sqrt{\frac{E_s}{N_0}}\right)\end{array}$.

## OFDM modulation

Let us use the OFDM system loosely based on IEEE 802.11a specifications.

 Parameter Value FFT size. nFFT 64 Number of used subcarriers. nDSC 52 FFT Sampling frequency 20MHz Subcarrier spacing 312.5kHz Used subcarrier index {-26 to -1, +1 to +26} Cylcic prefix duration, Tcp 0.8us Data symbol duration, Td 3.2us Total Symbol duration, Ts 4us

## Simulation model

Simple Matlab/Octave script for computing the symbol error rate for  16QAM/64QAM and 256QAM modulation scheme in additive white gaussian noise channel over OFDM.

## 44 thoughts on “Symbol Error rate for QAM (16, 64, 256,.., M-QAM)”

1. anjali says:

sir plz help me..I need a code for SNR VS BER of different modulation scheme with code rate 1/2 and 3/4.how can i change the code rate.?

1. @anjali: which coding scheme are you using – convolutional coding?

2. anjali says:

How can we change the code rate in BER vs SNR simulation?

1. @anjali: typically, one will have a header field indicating the rate of the transmission

3. Jeremiah says:

Hi Krishna,

I am trying to simulate SNR of 16-QAM (under Rayleigh fading channel). Any advices on how should I work on as I faced difficulty to generate the matlab.

Regards,

4. thang says:

Thanks Krishna Sankar.

5. riccardo says:

Hi,
could you please tell me if it possible and why when in a OFDM code with this parameters:
k = sqrt(1/10) scaling factor
5 tap long channel
zf and mmse 1 tap equalizer
EbN0dB = [0:36]
EsN0dB = EbN0dB + 10*log10(nDSC/nIFFT) + 10*log10(nIFFT/(nIFFT+CP))
using (16QAM)
The MMSE BER curve is actually higher than the ZF BER curve if I use 16 QAM, but when I use in the same program QPSK I get the normal result (MMSE better than ZF)???

I used all the scaling factor that i found in your posts on ofdm and 16QAM and I added to the received signal the noise as 10^(-EsN0dB(ii)/20)*n.
When I perform MMSE I use
C= (1./(conj(hF).*hF+10^(-EsN0dB(ii)/20))).*conj(hF);
y_mse = yF.*C;

The modulation and demodulation is done by
Mod = modem.qammod(‘M’, 16, ‘PhaseOffset’,0,’SymbolOrder’,’gray’,’InputType’,’bit’);
Dem = modem.qamdemod(Mod);
using modulate and demodulate command.

I tried to use one tap channel but I get the same result so I think is not becuse I should use some taps at the equalizer.What I mean is that with 16QAM in Ray channel can one tap MMSE equalizer be worse than one tap ZF or I miss some scaling factor in the equalization or in other parts????

Thanks,

R.

1. riccardo says:

To give you a better idea of what I get I attached the link below of the curves that i get when I use QPSK and 16QAM in OFDM with the same parameters (CP,nBits etc..). In QPSK case I get perfectly identical BER for ZF and MMSE.

http://www.4shared.com/photo/QgFiaXQX/untitled.html

Could it be because of MMSE have only one tap and if I d use 3 or 5 taps MMSE curve will be lower than ZF one??

Regards,

R.

1. @riccardo: Why is MMSE so poor for 16QAM case? Is the noise variance term in order?

2. @riccardo; Should we use scaling of 1/10 for the noise variance?
C= (1./(conj(hF).*hF+10^(-EsN0dB(ii)/10))).*conj(hF);

1. riccardo says:

I did it and it looks better but still ZF outperforms MMSE. Here is the ber.
http://www.4shared.com/photo/gA-Hzpzv/untitledu.html
However, I know I’m missing something stupid but I can’t figured it out…Would you mind having a further look to the whole program which work for QPSK but not for 16QAM? I send send an email and we can try to sort it out.

I’m doing a BER comparison between OFDMA and SCFDMA in SISO SIMO and MIMO scenarios, once I got them correctly if you like we can write a post in this blog so it would be helpfull for everyone 😉
Let me know.

Regards,

R.

1. riccardo says:

I sent a email to you with the code.
Thanks.

2. @riccardo: Given the time constraints, debugging through the code is slightly difficult. Good luck

6. Mostafa says:

Hello Sir ,

Can you please advise me , how can i modify this code to use QPSK modulation along with the QAM modulations. I am in desperate need for my project to observe different types of modulation schemes on OFDM system.

Thanks & best Regards

7. houda says:

first of all thanks a lot for your efforts. I am new in matlab and I want to ask you about some instructions in your matlab code.
1- why have u used this instruction even u can use idft directly
xt = (nFFT/sqrt(nDSC))*ifft(fftshift(xF.’)).’;
2- what do u mean by this instruction
xF = [zeros(nOFDMsym,6) ipMod_norm(:,[1:nConstperOFDMsym/2]) zeros(nOFDMsym,1) ipMod_norm(:,[nConstperOFDMsym/2+1:nConstperOFDMsym]) zeros(nOFDMsym,5)] ;
3- I haven’t understand the addition of cyclic prefix
finnaly can u explain what represent all of this instructions in practice

1. @houda: My replies:
1/ the term (nFFT/sqrt(nDSC)) is for scaling the output power.
the term fftshift() is to provide the frequency domain information in the way ifft() likes.
please check the post on negative frequency
https://dsplog.com/2008/08/08/negative-frequency/
https://dsplog.com/2008/02/03/understanding-an-ofdm-transmission/

2/ This is forming the xF, a matrix of dimension [ number of ofdm symbols x number of subcarriers]
In this example, i recon the number of subcarriers is 64. And the index
[-32:-27] : 6 subcarriers are 0
[-26:-1] : 26 data subcarriers
0 : no information on dc subcarrier
[1:26] : 26 data subcarriers
[27:31] : 5 subcarriers are 0

3/ Cyclic prefix is added to provide a buffer zone for inter symbol interference from the previous symbol caused due to the multipath channel
https://dsplog.com/2008/02/17/cylcic-prefix-in-orthogonal-frequency-division-multiplexing/

1. houda says:

thanks a lot Krishna Sankar.

8. doojin says:

I have simple queation!!
at OFDM, increasing FFT size , how about BER curve?? and why??

1. @doojin: For the same sampling frequency, increasing the fft size means that the subcarrier spacing is narrower resulting in a lower noise power. However we need to lower transmit power of each subcarrier by the same amount to keep the transmit power a constant. Hence, I reckon there is no Eb/N0 vs BER impact by increasing the number of subcarriers.

hello.thank you very much for matlab code 16-QAM.
I want this matlab code for 64-QAM but by change 16 to 64 I cant simulation.help me

Best Regards.

10. sachin says:

Hello Krishna,
i am sachin. i need some help from you.
i need matlab code for ostbc over nakagami-m channel or BER for the nakagami-m channel.waiting for your feedback and your help.

11. imran says:

Hello Krishna,
i am imran. i need some help from you. i need a theoretical formula of Bit Error Rate or Symbol error rate for 16-APSK (amplitude phase shift keying). i got the simulation result . but i dont know the exact theoretical formula or equation regarding of this problem.
I saw some of your updated formula for 16-QAM or 16- PSK. i want the like this formula where i can compare my theoretical and simulation constellation plot.

1. imran says:

i would like to request you, please give me some suggestion where i can get this information. Honestly i need desperately this 16-apsk theoretical formula for BER or SER.

12. ofir michael says:

you should write about Es : Es_max, Es_min, Es_avrage.
Do you know the formula for OFDM based on 64QAM modulation?

1. ofir michael says:

No it will not. In OFDM there are 48 subcarriers of 64qam tansmitted. It changes the SER. The more subcarries you add the bigger the bandwidth becomes, the longer Tsymbol is.

1. @ofir: Well, the slope of the symbol error rate does not change. Yes, it does get shifted in the x-axis based on the cyclic prefix and the number of subcarriers. I have discussed about a simple BPSK case at https://dsplog.com/2008/06/10/ofdm-bpsk-bit-error/
Es/N0 dB = Eb/N0 dB + 10*log10(ndsc/nfft) + 10*log10(td/(td+tcp))

13. sachin says:

any one can give the matlab code for ostbc over nakagami-m channel or BER for the nakagami-m channel

14. ofir michael says:

you have a mistake on “K”.
it does not equal to SQRT(1/(2/3*M-1)).
it’s equal to SQRT(1/(2/3*(M-1)))

1. @ofir: Hmm… it is SQRT(1/(2/3*(M-1))). Where do you see the error?

1. ofir michael says:

k=SQRT(1/(2/3*M-1).

I calculated it and it’s equal to: k=SQRT(1/(2/3*(M-1))).

1. ofir michael says:

No it is not.
under “Additive White Gaussian Noise (AWGN) channel ”
look at “k”
__________
/ 1
k= /___________
/ _2_ * M-1
\/ 3

when it should be:

__________
/ 1
k= /___________
/ _2_ * (M-1)
\/ 3

2. @ofir: At last, I understood your concern – and I added bracket’s around (M-1). Thanks for pointing that out. It was a typo from my side.

15. reza says:

I can not run for this project, there is an error in –>

“??? Error using ==> semilogy
Conversion to double from cell is not possible.

Error in ==> compute_symbol_error_rate_qam_ofdm_awgn at 27
semilogy(EsN0dB,theorySer(jj,:),color_vec1(jj));”

1. reza says:

thanks sir. it works!

16. jio says:

good job