MATLAB CODE
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% SISO.m
% Single Input Single Output 16-QAM Simulation
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
clear;
close all;
SignalEnergyMin = 2;
SignalEnergyMax = 42;
SignalEnergy_d = 1;
BlocksPerEnergy = 100;
BlockSize = 2^8;
SamplingRate = 6;
WGNPower = 1;
RayleighParam = .4;
Antennas = 2;
M=16;
for aa=1:Antennas
Gvec1 = randn(1,BlocksPerEnergy);
Gvec2 = randn(1,BlocksPerEnergy);
RayleighVec(aa,:) = sqrt((RayleighParam^2.*Gvec1.^2)+(RayleighParam^2.*Gvec2.^2));
end
RayleighVec(1,:) = ones(1,size(RayleighVec,2));
EnergiesdB = SignalEnergyMin:SignalEnergy_d:SignalEnergyMax;
Energies = 10.^(EnergiesdB./10);
for ee = 1:size(Energies,2)
for bb = 1:BlocksPerEnergy
A = randint(1,BlockSize,16); % Generate Data Stream
B = mod16qam (A,1,SamplingRate,Energies(ee))'; % 16-QAM Modulation
for aa=1:Antennas
disp(['Eb = ',int2str(Energies(ee)),'; Block ',int2str(bb),'; Antenna ',int2str(aa)]);
C(aa,:) = RayleighVec(aa,bb).*B; % Rayleigh fading
D(aa,:) = AWGN(C(aa,:),WGNPower); % AWGN
[E(aa,:),Eb(aa,bb)] = demod16qam (D(aa,:),1,SamplingRate); % Demodulate
[TT,SER(aa,bb)] = symerr(A,E(aa,:)); % Measure BER per antenna
end
end
for aa=1:Antennas
ESER(aa,ee) = mean(SER(aa,:),2);
end
end
Eaxis = 10*log10((SignalEnergyMin:SignalEnergy_d:SignalEnergyMax)./(WGNPower^2));
figure;
semilogy(EnergiesdB,ESER,'+');
title ('\fontsize{12}\bf16-QAM SISO Bit Error Rate in a slow flat Rayleigh AWGN Channel');
xlabel ('Eb/N_0'); ylabel ('SER');
legend('No fading','Rayleigh fading (r=0.24)');
%% EOF %% EOF %% EOF %% EOF %% EOF %% EOF %% EOF %% EOF %% EOF %% EOF
14
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%
%
% SISO.m
% Single Input Dual Output 16-QAM Simulation
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%
clear;
close all;
SignalEnergyMin = 4;
SignalEnergyMax = 52;
SignalEnergy_d = 1;
BlocksPerEnergy = 200;
BlockSize = 2^8;
SamplingRate = 1;
WGNPower = 1;
RayleighParam = .24;
Antennas = 2;
M=16;
for aa=1:Antennas
Gvec1 = randn(1,BlocksPerEnergy);
Gvec2 = randn(1,BlocksPerEnergy);
RayleighVec(aa,:) = sqrt((RayleighParam^2.*Gvec1.^2)+(RayleighParam^2.*Gvec2.^2));
end
EnergiesdB = SignalEnergyMin:SignalEnergy_d:SignalEnergyMax;
Energies = 10.^(EnergiesdB./10);
for ee = 1:size(Energies,2)
for bb = 1:BlocksPerEnergy
A = randint(1,BlockSize,16); % Generate Data Stream
B = mod16qam (A,1,SamplingRate,Energies(ee))'; % 16-QAM Modulation
for aa=1:Antennas
disp(['Eb = ',int2str(Energies(ee)),'; Block ',int2str(bb),'; Antenna ',int2str(aa)]);
C(aa,:) = RayleighVec(aa,bb).*B; % Rayleigh fading
D(aa,:) = AWGN(C(aa,:),WGNPower); % AWGN
[E(aa,:),Es(aa,bb)] = demod16qam (D(aa,:),1,SamplingRate); % Demodulate
[TT,SER(aa,bb)] = symerr(A,E(aa,:)); % Measure SER per antenna
end
% Selective Combining
stronger = (find (Es(:,bb) == max (Es(:,bb))));
[SC,E_sc(1,bb)] = demod16qam (D(stronger,:),1,SamplingRate);
[TT,SER_sc(bb)] = symerr(A,SC); % Measure SER per antenna
% Equal Gain Combining
[EGC,E_egc(1,bb)] = demod16qam (mean(D,1),1,SamplingRate);
[TT,SER_egc(bb)] = symerr(A,EGC); % Measure SER per antenna
% Maximal Ratio Combining
for aa=1:Antennas
r(aa) = sqrt(Es(aa,bb)/Energies(ee));
end
for aa=1:Antennas
a(aa) = r(aa)/sum(sqrt(r));
end
15
[MRC,E_mrc(1,bb)] = demod16qam (r(1)*D(1,:)+r(2)*D(2,:),1,SamplingRate);
[TT,SER_mrc(bb)] = symerr(A,MRC); % Measure SER per antenna
end
for aa=1:Antennas
ESER(aa,ee) = mean(SER(aa,:),2);
end
ESER_sc(ee) = mean(SER_sc,2);
ESER_egc(ee) = mean(SER_egc,2);
ESER_mrc(ee) = mean(SER_mrc,2);
end
figure;
semilogy(EnergiesdB,mean
(ESER,1),'+',EnergiesdB,ESER_sc(1,:),'d',EnergiesdB,ESER_egc(1,:),'d',EnergiesdB,ESER_mrc(1,:),'d');
title ('\fontsize{10}\bfAntenna Diversity (16-QAM): \rm2 Received signals with close power levels (slow flat
Rayleigh AWGN Channel)');
xlabel ('Eb/N_0'); ylabel ('SER');
legend('Antenna 1+2','Selective Combining','Equal Gain Combining','Maximum Ratio Combining');
%% EOF %% EOF %% EOF %% EOF %% EOF %% EOF %% EOF %% EOF %% EOF %% EOF
16
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% SIMO.m
% Single Input Multiple Outputs 16-QAM Simulation
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
clear;
close all;
SignalEnergyMin = 4;
SignalEnergyMax = 52;
SignalEnergy_d = 1;
BlocksPerEnergy = 100;
BlockSize = 2^8;
SamplingRate = 1;
WGNPower = 1;
RayleighParam = .24;
Antennas = 8;
M=16;
for aa=1:Antennas
Gvec1 = randn(1,BlocksPerEnergy);
Gvec2 = randn(1,BlocksPerEnergy);
RayleighVec(aa,:) = sqrt((RayleighParam^2.*Gvec1.^2)+(RayleighParam^2.*Gvec2.^2));
end
EnergiesdB = SignalEnergyMin:SignalEnergy_d:SignalEnergyMax;
Energies = 10.^(EnergiesdB./10);
for ee = 1:size(Energies,2)
for bb = 1:BlocksPerEnergy
A = randint(1,BlockSize,16); % Generate Data Stream
B = mod16qam (A,1,SamplingRate,Energies(ee))'; % 16-QAM Modulation
for aa=1:Antennas
disp(['Eb = ',int2str(Energies(ee)),'; Block ',int2str(bb),'; Antenna ',int2str(aa)]);
C(aa,:) = RayleighVec(aa,bb).*B; % Rayleigh fading
D(aa,:) = AWGN(C(aa,:),WGNPower); % AWGN
[E(aa,:),Es(aa,bb)] = demod16qam (D(aa,:),1,SamplingRate); % Demodulate
[TT,SER(aa,bb)] = symerr(A,E(aa,:)); % Measure SER per antenna
end
for aa=2:2:Antennas
TempEs = Es(1:aa,bb);
% Selective Combining
stronger = (find (TempEs == max (TempEs)));
[SC,E_sc(1,bb)] = demod16qam (D(stronger,:),1,SamplingRate);
[TT,SER_sc(aa/2,bb)] = symerr(A,SC); % Measure SER per antenna
% Equal Gain Combining
TempD = D(1:aa,:);
[EGC,E_egc(1,bb)] = demod16qam (mean(TempD,1),1,SamplingRate);
[TT,SER_egc(aa/2,bb)] = symerr(A,EGC);
end
end
for aa=1:Antennas
ESER(aa,ee) = mean(SER(aa,:),2);
end
17
ESER_sc(:,ee) = mean(SER_sc,2);
ESER_egc(:,ee) = mean(SER_egc,2);
% ESER_mrc(ee) = mean(SER_mrc,2);
end
figure;
semilogy(EnergiesdB,mean (ESER,1),'+',EnergiesdB,ESER_sc,'d-');
title ('\fontsize{10}\bfAntenna Diversity - Selective Combining (16-QAM): \rmslow flat Rayleigh AWGN
Channel');
xlabel ('Eb/N_0'); ylabel ('SER');
legend('Antenna 1+2','2 Antennas','4 Antennas','6 Antennas','8 Antennas');
figure;
semilogy(EnergiesdB,mean (ESER,1),'+',EnergiesdB,ESER_egc,'x-');
title ('\fontsize{10}\bfAntenna Diversity - Equal Gain Combining (16-QAM): \rmslow flat Rayleigh AWGN
Channel');
xlabel ('Eb/N_0'); ylabel ('SER');
legend('Antenna 1+2','Equal Gain Combining 2','Equal Gain Combining 4','Equal Gain Combining 6','Equal
Gain Combining 8');
%% EOF %% EOF %% EOF %% EOF %% EOF %% EOF %% EOF %% EOF %% EOF %% EOF
18
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% VBLAST.m
% Multiple Inputs Multiple Outputs (V-BALST algorithm) 16-QAM Simulation
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
clear;
close all;
SignalEnergyMin = 2;
SignalEnergyMax = 13;
SignalEnergy_d = 0.5;
BlockSize = 2^8;
BlocksPerEnergy = 20;
SamplingRate = 1;
WGNPower = 1;
RayleighParam = 1;
Transmitters = 4;
Receivers = 8;
EnergiesdB = SignalEnergyMin:SignalEnergy_d:SignalEnergyMax;
Energies = 10.^(EnergiesdB./10);
for ee = 1:size(Energies,2)
Eb = Energies(ee)/Transmitters;
for bb=1:BlocksPerEnergy
disp(['Eb = ',int2str(Energies(ee)),'; Block ',int2str(bb)]);
RayleighMat = RayleighParam^2*randn (Receivers,Transmitters) + j*RayleighParam^2*randn
(Receivers,Transmitters);
%RayleighMat = RayleighMat*.1;
A = randint(Transmitters,BlockSize,16); % Generate Data Stream A(rows =
xmitters, cols = symbols)
B = mod16qam (A,1,SamplingRate,Eb)'; % 16-QAM Modulation
noise = (WGNPower).*randn(size(RayleighMat*B)) +
j*(WGNPower).*randn(size(RayleighMat*B));
C = RayleighMat*B + noise;
k = [];
H = RayleighMat;
r=C;
for tt=1:Transmitters
% find best signal
G = pinv(H);
normG = sum(abs(G).^2,2);
normG(k) = inf;
k(tt) = find(normG == min(normG));
w = G(k(tt),:) ;
y = w*r;
[E(k(tt),:),Eb_rec(k(tt))] = demod16qam (y,1,SamplingRate); % Demodulate
%