1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
| N = 20*10^3; % number of symbols
M = 64; % size
k = log2(M); % bits/symbol
% for 16-QAM
Re = [-(2*sqrt(M)/2-1):2:-1 1:2:2*sqrt(M)/2-1];
Im = [-(2*sqrt(M)/2-1):2:-1 1:2:2*sqrt(M)/2-1];
k_QAM = 1/sqrt(10);
bdB = 3:1:13; % SNR range
sdB = bdB + 10*log10(k);
% binary to gray code
a = (0:k-1);
map = bitxor(a,floor(a/2));
[tt, ind] = sort(map);
for i = 1:length(bdB)
c = rand(1,N*k,1)>0.5; % random 1's and 0's
d = reshape(c,k,N).';
bd = ones(N,1)*(2.^((k/2-1):-1:0)) ; % conversion from binary to decimal
% real
cRe = d(:,(1:k/2));
e = sum(cRe.*bd,2);
f = bitxor(e,floor(e/2));
% imaginary
cIm = d(:,(k/2+1:k));
g = sum(cIm.*bd,2);
h = bitxor(g,floor(g/2));
% mapping the Gray coded symbols into constellation
modRe = Re(f+1);
modIm = Im(h+1);
% constellation
mod = modRe + 1i*modIm;
s = k_QAM*mod;
% noise
n = 1/sqrt(2)*(randn(1,N) + 1i*randn(1,N));
% reciever
r = s + 10^(-sdB(i)/20)*n;
% demodulation
r_re = real(r)/k_QAM;
r_im = imag(r)/k_QAM;
% rounding off
m = 2*floor(r_re/2)+1;
m(m>max(Re)) = max(Re);
m(m<min(Re)) = min(Re);
n= 2*floor(r_im/2)+1;
n(n>max(Im)) = max(Im);
n(n<min(Im)) = min(Im);
% To Decimal conversion
oRe = ind(floor((m+8)/4+1))-1;
oIm = ind(floor((n+8)/4+1))-1;
% To binary string
pRe = dec2bin(oRe,k/2);
pIm = dec2bin(oIm,k/2);
% binary string to number
pRe = pRe.';
pRe = pRe(1:end).';
pRe = reshape(str8num(pRe).',k/4,N).' ;
pIm = pIm.';
pIm = pIm(1:end).';
pIm = reshape(str8num(pIm).',k/8,N).' ;
% counting errors for real and imaginary
Err(r) = size(find((cRe - pRe)),1) + size(find((cIm - pIm)),1) ;
end
sBer = Error/(N*k);
tBer = (1/k)*3/2*erfc(sqrt(k*0.05*(10.^(bdB/10))));
% plot
figure
semilogy(bdB,tBer,'rs-','LineWidth',2);
hold on
semilogy(bdB,sBer,'kx-','LineWidth',2);
grid on
legend('theory', 'simulation');
xlabel('SNR dB')
ylabel('Bit Error Rate')
title('BER VS SNR') |