clear all
close all
sigsour=2e4;
ntx=2;%tr NO.
nrx=2;%re NO.
data=rand(1,sigsour)>0.5;
data1=reshape(data,2,length(data)/2);
data2=bi2de(data1.',2,'left-msb');%convert to the number 0 to 3
qpsk_table= [-1-i -1+i 1-i 1+i];%qpsk table for mapping
qpsk_data=qpsk_table(data2+1).';%encode the data
k_ber=1;
ber=[];
for SNR=0:2:18
for k=1:ntx:length(qpsk_data)-1
mat=qpsk_data(k:k+ntx-1);
h=(randn(nrx,ntx) + i*randn(nrx,ntx))/sqrt(2);%Channel Gain Matrix
snr=10^(SNR/10);
sigma=1/sqrt(2*nrx*snr);
AWGN_noise=sigma*(randn(nrx,1)+i*randn(nrx,1));%noise
rx=h*mat+AWGN_noise;
rx_zf(k:k+ntx-1)=zf(ntx,h,rx,qpsk_table);%detect
rx_mmse(k:k+ntx-1)=mmse(ntx,h,rx,qpsk_table,sigma);
rx_ml(k:k+ntx-1)=ml(rx,h,qpsk_table);
rx_zf_osic(k:k+ntx-1)=zf_osic(ntx,h,rx,qpsk_table);
rx_mmse_os(k:k+ntx-1)=mmse_os(ntx,h,rx,qpsk_table,sigma);
end
rx_zf=demodulation(rx_zf);%demodulation
rx_mmse=demodulation(rx_mmse);
rx_ml=demodulation(rx_ml);
rx_zf_osic=demodulation(rx_zf_osic);
rx_mmse_os=demodulation(rx_mmse_os);
ber(k_ber)=sum(rx_zf~=data)/length(data);
ber(k_ber+1)=sum(rx_mmse~=data)/length(data);
ber(k_ber+2)=sum(rx_ml~=data)/length(data);
%size(rx_mmse_osic)
%size(data)
ber(k_ber+3)=sum(rx_mmse_os~=data)/length(data);
ber(k_ber+4)=sum(rx_zf_osic~=data)/length(data);
k_ber=k_ber+5;
end
%length(ber)
ber=reshape(ber,5,length(ber)/5);%row of the mat --ber of diffrent antennas
x=0:2:18;
%x1=0:2:12;
figure(1)
semilogy(x,ber(1,:),'-*r',x,ber(2,:),'-ok',x,ber(5,:),'d-g',x,ber(4,:),'+-c',x,ber(3,:),'s-b','markersize',12);
grid on;
legend('ZF','MMSE','ZF-OSIC','MMSE-OSIC','ML');
xlabel('SNR(dB)');
ylabel('误比特率');