QAM Theoretical BER in AWGN

Quadrature Amplitude Modulation (QAM) is an important modulation scheme as it allows for higher data rates and spectral efficiencies. The bit error rate (BER) of QAM can be calculated through Monte Carlo simulations. However this becomes quite complex as the constellation size of the modulation schemes increases. Therefore a theoretical approach is sometimes preferred. The BER for Gray coded QAM, for even number of bits per symbol, is shown below.

Gray coding ensures that a symbol error results in a single bit error. The code for calculating the theoretical QAM BER for k even (even number of bits per symbol) is given below. The formula for calculating the BER for k odd is different, however, the formula given below can be used a first estimate.

EbNodB=-6:2:24
EbNo=10.^(EbNodB/10);
k=8;
M=2^k;
x=sqrt(3*k*EbNo/(M-1));
Pb=(4/k)*(1-1/sqrt(M))*(1/2)*erfc(x/sqrt(2));
semilogy(EbNodB,Pb)

Note:
1. Each additional bit/symbol requires about 2dB extra in SNR to achieve the same BER.
2. 4-QAM is essentially QPSK modulation. Author: John (YA)

John has over 20 years of Research and Development experience in the field of Wireless Communications. He has worked for a number of companies around the world including Qualcomm Inc. USA.

3.00 avg. rating (68% score) - 2 votes

40 thoughts on “QAM Theoretical BER in AWGN”

1. Rahul says:

Hi,

Can you please provide the bit error rate of 16-QAM modulation through MATLAB simulations using oversampling.

1. John (YA) says:

Hi Rahul,

There are two ways you can approach this problem (each requiring a bit of work from you).
– You can modify the code for 64-QAM by just changing the parameter M from 64 to 16 and run the BER simulation.
http://www.raymaps.com/index.php/ber-64-qam-awgn/

– If you want to go back to basics you can use the 4-PAM code for this. 16-QAM is nothing but two orthogonal 4-PAM constellations.
http://www.raymaps.com/index.php/pulse-amplitude-modulation-symbol-error-rate-in-awgn/

1. Rahul says:

Thank you John for the reply. I tried to build the same from your this post

But when I using the oversampling factor, I am not able to normalize it properly. Can you please look at the below code and suggest any recommended changes. Thank you.
clc
clear all
close all
N = 10000; % Number of bits
Oversamp =8; % oversamling factor
itr=5;
M=16;
k=log2(M);
EbNodB = 0:2:10;

for ii = 1:length(EbNodB)
nErr =[];
for kk = 1:itr
%% Transmitter
x=transpose(round(rand(1,N)));
h1=modem.qammod(M);
h1.inputtype=’bit’;
h1.symbolorder=’gray’;
y=modulate(h1,x);

y1 = transpose(y);
Sig = ones(Oversamp,1)*y1;
Sig1 = (1/sqrt(Oversamp))*(Sig(:));

%% Channel
EbNo=10.^(EbNodB(ii)/10);
Eb=mean((abs(Sig1)).^2)/k;
sigma=sqrt(Eb/(2*EbNo));
w=sigma*(randn(Oversamp*N/k,1)+1i*randn(Oversamp*N/k,1));
rx= Sig1 + w;

rr = transpose(rx);
Rx_sig = reshape(rr,Oversamp,N/k);
Rx_sig1 = ones(1,Oversamp)*Rx_sig;

r = transpose(Rx_sig1);
h2=modem.qamdemod(M);
h2.outputtype=’bit’;
h2.symbolorder=’gray’;
h2.decisiontype=’hard decision’;
z=demodulate(h2,r);
count=(N-sum(x==z))/N ;
nErr = [nErr count];

end
Err(ii) = sum(nErr)/itr;
end
simBer = Err; % simulated ber

EbNo=10.^(EbNodB/10);
x=sqrt(3*k*EbNo/(M-1));
theoryBerAWGN=(4/k)*(1-1/sqrt(M))*(1/2)*erfc(x/sqrt(2));

semilogy(EbNodB,theoryBerAWGN,’bd-‘,’LineWidth’,2);
hold on
semilogy(EbNodB,simBer,’rx-‘,’LineWidth’,2);
hold on
legend(‘AWGN-Theory’, ‘Simulation’);
xlabel(‘Eb/No, dB’);
ylabel(‘Bit Error Rate’)

1. John (YA) says:

I think there is a problem with this line:

Eb=mean((abs(Sig1)).^2)/k;

It should be:

Eb=Oversamp*mean((abs(Sig1)).^2)/k;

1. Rahul says:

But still, it doesn’t work.

2. Rahul says:

Thank you so much John. Now code is working fine.
For the normalization, we divide by sqrt(Oversamp), both at the transmitter and receiver.
And also after oversampling bit energy equals Eb=Oversamp*mean((abs(Sig1)).^2)/k;

The complete code is given below:
%% Transmitter
x=transpose(round(rand(1,N)));
h1=modem.qammod(M);
h1.inputtype=’bit’;
h1.symbolorder=’gray’;
y=modulate(h1,x);

y1 = transpose(y);
Sig = ones(Oversamp,1)*y1;
Sig1 = (1/sqrt(Oversamp))*(Sig(:));

%% Channel
EbNo=10.^(EbNodB(ii)/10);
% Eb=mean((abs(Sig1)).^2)/k;
Eb=Oversamp*mean((abs(Sig1)).^2)/k;
sigma=sqrt(Eb/(2*EbNo));
w=sigma*(randn(Oversamp*N/k,1)+1i*randn(Oversamp*N/k,1));
rx= Sig1 + w;

rr = transpose(rx);
Rx_sig = reshape(rr,Oversamp,N/k);
Rx_sig1 = (1/sqrt(Oversamp))*ones(1,Oversamp)*Rx_sig;

r = transpose(Rx_sig1);
h2=modem.qamdemod(M);
h2.outputtype=’bit’;
h2.symbolorder=’gray’;
h2.decisiontype=’hard decision’;
z=demodulate(h2,r);
count=(N-sum(x==z))/N ;

2. yusuf says:

hello,
i tried to integrate qpsk and 16qam with turbo code. I am not able to obtain the right result. Can someone help me?

thank you very much.

1. John (YA) says:

I have not discussed turbo codes so far…but maybe some day I will do…

3. Dayan says:

Hello all, can someone help me with this problem?
In a QPSK system, the channel has a combination of AWGN n[k] and interference I[k] which is also AWGN. The average transmit power is Pt, the noise spectral density is 10^(−8) W/Hz, the channel bandwidth B is 10 KHz (receiver noise power is N0B), and the interference power is Pi.

Question: Please simulate the average Symbol Error Rate vs SINR (signal-to-noise-plus-interference ratio) in Matlab. Please derive the average SER and plot the theoretical average SER vs SINR in the same figure.

1. John (YA) says:

Dayn, you need to understand the following to do this assignment:

Noise or Interference Power: Bandwidth x Noise or Interference PSD
Total Noise and Interference Power: Noise Power + Interference Power
Signal to Interference and Noise Ratio (SINR): Signal Power / (Noise Power + Interference Power)

Since this is an assignment I would like to leave the rest to you. Plus you can take the help from the blog (be careful not to mix up SNR, SINR and EbNo).

4. Makhfkdb says:

Consider the following interference channel
The channel has a combination of AWGN n[k] and interference I[k]. We model I[k] as AWGN. The average transmit power is Pt, the noise spectral density is 10^(−8) W/Hz, the channel bandwidth B is 10 KHz (receiver noise power is NoB), and the interference power is Pi.
1. Please simulate the average SER vs SINR in Matlab. Please derive the average SER and plot the theoretical average SER vs SINR in the same figure.
2. Assume that the interferer is on (i.e. the switch is down) with probability 0.25 and off (i.e. the switch is up) with probability 0.75. Pt=10 mW, and Pi =9 mW.
2.1 What is the Shannon capacity of the channel if neither transmitter nor receiver know when the interferer is on?
2.2 What is the capacity of the channel if both transmitter and receiver know when the interferer is on?
2.3 Suppose now that the interferer is a malicious jammer with perfect knowledge of x[k] (so the interferer is no longer modeled as AWGN). Assume that neither transmitter nor receiver have knowledge of the jammer behavior. Assume also that the jammer is always on
and has an average transmit power of 10 mW. What strategy should the jammer use to minimize the SNR of the received signal?
3 What insight can you get from the above exercise?

1. John (YA) says:

Pt=10mWatt
Pi=9mWatt
Pn=10^(-8)*10000=0.1mWatt
P_ON=0.25
P_OFF=0.75

In case it is known when the jammer is on and when its off the capacity would be sum of two capacities.

C_ON=B*log2(1+SINR)=10000*log2(1+10/(0.1+9))=10000*log2(2.0989)=10696 bits/sec

C_OFF=B*log2(1+SNR)=10000*log2(1+10/0.1)=10000*log2(101)=66582 bits/sec

C_Total=P_ON*C_ON+P_OFF*C_OFF=0.25*10696+0.75*66582=52610 bits/sec

If it is not known when the jammer is on you can adopt one of two strategies.

1. Always transmit at the lower rate dictated by presence of jammmer.
2. Always transmit at the higher rate and totally lose the signal for 25% of the time.

Figure out which one is better!

1. John (YA) says:

Revisiting this post after a long time I thought I might give a go to the case I briefly mentioned in the end, with the two strategies:

Strategy 1: 10696 bits/sec

Strategy 2: 0.75*66582=49936 bits/sec

Obviously Strategy 2 is better as you can send a lot more bits when the jammer is off (75% of the time).

1. John (YA) says:

Best way to reduce the power of the signal is to transmit a jamming signal which is equal in power to the transmitted signal but phase reversed. Not an easy thing to do but theoretically the best option.

5. 许子卿 says:

How are you doing
I am doing the performance analysis of quasi-orthogonal space-time codes under QAM debugging, using MATLAB simulation, but I do not know the error rate simulation formula How to say, is the same as you write the simulation formula? If not, do you know what it is? I have a piece of code but is under QPSK debugging, its simulation formula is PPQOSTBC (KK) = 0.5*ERFC (sqrt (0.5*SNRQOSTBC)). Can you tell me if you know?
Thank you so much

6. Mansoore says:

I simulate the BER performance of M-ary QAM .
now I want to check that result with theoretical ber. So, please send to me theoretical BER equation of M-ary QAM
thank U

1. John (YA) says:

7. Mariam Arshad says:

The source generates equal probable symbols, P(si) = 0.125, i=0,…,7, and Gray mapping is used to map information bits to the PAM signals.
(a) Create a Matlab program so it can simulate the symbol error performance and the
bit error rate performance of the 8-PAM communication system for the transmission of packets of 10,000 symbols each.
(b) Using your program to simulate the symbol error performance and the bit error
performance of the system with
Eb/N0 = 0, 2, 4, 6, 8, 10 dB.

So far, I have the following code.
N = 10^4; % number of symbols
>> alpha8pam = [-7 -5 -3 -1 1 3 5 7]; % 8-PAM alphabets
>> Es_N0_dB = [0:2:4:6:8:10]; % multiple Eb/N0 values
>> ipHat = zeros(1,N);
for ii = 1:length(Es_N0_dB)
ip = randsrc(1,N,alpha8pam);
s = (1/sqrt(5))*ip; % normalization of energy to 1
n = 1/sqrt(2)*[randn(1,N) + j*randn(1,N)]; % white guassian noise, 0dB variance

y = s + 10^(-Es_N0_dB(ii)/20)*n; % additive white gaussian noise

% demodulation
r = real(y); % taking only the real part
ipHat(find(r= 2/sqrt(5))) = 3;
ipHat(find(r>=-2/sqrt(5) & r=0 & r<2/sqrt(5))) = 1;

I'm not sure how to write the rest of the 'iphat' values.

8. Aziz says:

Sir can you tell me the formula theoretical BER of Tilted Quadrature Amplitude Modulation for rayleigh

9. Carole says:

Hello,

Can you please give us the theoretical Symbol Error Rate of a PAM Modulation?

Thank you!

10. phil colbourn says:

My Octave version.

I’m new to Octave and doing this sort of thing so please offer suggestions and corrections.

function Y=Q(X)
Y=0.5.*erfc(double(X)./sqrt(2))
endfunction

EbNodB=0:2:30
EbNo=10.^(EbNodB/10)
K=[2 4 6 8]
M=2.^K
KM=double(3*K./(M-1))
KME=double(KM’*EbNo)
X=double(sqrt(KME))
Pb=double((4./K).*(1-1./sqrt(M)))’.*Q(X)
semilogy(EbNodB,Pb)
title(“M-QAM BER v SNR”)
grid on
grid minor on
legend(num2str(M’))
ylim([1e-8 1e0])
xlabel(“Eb/No (dB)”)
ylabel(“BER”)
print -dsvg q.svg

1. John (YA) says:

I love using Octave too. Keep up the good work!

11. Andrew says:

Hello,
I am not able to reproduce that graphic, could you send me the complete matlab code?

Thank you!

1. John says:

This is the complete code. You should be able to reproduce the above Fig. If you are still unable to do so, please share your code here.

John

12. prabhu says:

I simulate the BER performance of M-ary QAM over Rayleigh fading channel in Matlab tool, now I want to check that result with theoretical ber. So, please send to me theoretical BER equation of M-ary QAM over Rayleigh fading channel.

Thanking you.

13. Chris says:

Hello, it seems that everyone is in need of those codes :). Could you send me the code for matlab also??

I’ll appreciate it. Thank you!!

14. SHAIK BABAFAKRUDDEEN says:

plz send me BER 64 QAM modulation code in AWGN

15. Alain says:

I´ve proved with the same code and the result was diferent

16. John says:

Gordon: Frankly speaking I could not figure this out easily and had to do a simulation. It turns out that there is significant difference (2-3 dB) at low EbNo but at higher signal to noise ratios the difference is reduced to a fraction of a dB.

The simulation considered 64-QAM modulation but similar results are expected for other modulation schemes.

17. Gordon Kokubunji says:

May I know the sensitivity difference between the cases with and without gray coding?

Best

Gordon

18. Alain Fernandez says:

Hello,
I tried to do the graphic that you upload to the website in order to calculate the theorical BER of 4-QAM, 16-QAM and 64-QAM.
I am not able to reproduce that graphic, could you send me the complete matlab code??

Thank you very much

1. John says:

Just use the code as it is. Change ‘k’ to get the different curves (k=2,4,6,8).

1. Riz says:

What if k is odd
K=3 for 8QAM

1. John (YA) says:

The same formula can be used for k odd, its reasonably accurate. If it does not work let me know.