You are on page 1of 2

% close all

clear all
clc

SNR=0:2:20;
SNRnor=10.^(SNR/10);
N=400;
M=60;
R=4;
T=2;
fBERb=zeros(1,length(SNR));
fBERa=zeros(1,length(SNR));
tic
for mon=1:M
for r=1:R
for c=1:T
temp=0.707*(randn(1,N)+sqrt(-1)*randn(1,N));
H(r,c,:)=(temp);
end
end
xbar=0.707*(sign(randn(T,N))+sqrt(-1)*sign(randn(T,N)));
for a=1:length(SNR)
for i=1:N
xrecbar(:,i)=H(:,:,i)*xbar(:,i);
end
Sigpow=mean(mean(abs(xbar).^2));
noipow=Sigpow/SNRnor(a);
yrecbar=xrecbar+sqrt(noipow)*0.707*(randn(R,N)+sqrt(-1)*randn(R,N));
%%%% ZF detector
for i=1:N
xbarest(:,i)=pinv(H(:,:,i))*yrecbar(:,i);
end
xdec=(sign(real(xbarest))+sqrt(-1)*sign(imag(xbarest)))*0.707;
err=0;
for k=1:T
xbarexp=[real(xbar(k,:)) imag(xbar(k,:))]';
xdecexp=[real(xdec(k,:)) imag(xdec(k,:))]';
db=find(xbarexp~=xdecexp);
err=err+length(db);
end
BERb(a)=err/(T*N*2);
%%%%%MMSE detector
for i=1:N

xbarest2(:,i)=H(:,:,i)'*inv(H(:,:,i)*H(:,:,i)'+noipow*eye(R))*yrecbar(:,i);
end
xdec2=(sign(real(xbarest2))+sqrt(-1)*sign(imag(xbarest2)))*0.707;
err2=0;
for k=1:T
xbarexp2=[real(xbar(k,:)) imag(xbar(k,:))]';
xdecexp2=[real(xdec2(k,:)) imag(xdec2(k,:))]';
db2=find(xbarexp2~=xdecexp2);
err2=err2+length(db2);
end
BERa(a)=err2/(T*N*2);

end
fBERb=fBERb+BERb;
fBERa=fBERa+BERa;
end

%%%Analytical BER
L=R-T+1;
for a=1:length(SNR)
del2=1 %or use mean(mean(mean((abs(H).^2))));
gammabar=SNRnor(a)*del2;
BERana(a)=reqncr(L)*(1/(2*gammabar))^L;
end

figure1=figure
axes1 = axes('Parent',figure1,'FontSize',14);
box(axes1,'on');
grid(axes1,'on');
semilogy(SNR,fBERb/M,'b-.','LineWidth',1.5)
hold on
semilogy(SNR,fBERa/M,'r','LineWidth',1.5)
hold on;
semilogy(SNR,BERana,'k-.','LineWidth',2);

grid on
xlabel('SNR (dB)','FontSize',14);
ylabel('BER','FontSize',14);
legend('ZF detection','MMSE detection','Analytical');
title('MIMO system with QPSK and R=8, T=2');

mean(mean(mean((abs(H).^2))))
(abs(H(1,1,9)).^2)

function [out]=reqncr(R)
n=2*R-1;
r=R;
out=factorial(n)/(factorial(r)*factorial((n-r)));
end

You might also like