%MMSE解相关多用户检测器和CD传统多用户检测器的误码率比较(八个用户)
clear all;
snr_indb=1:8;
for k=1:length(snr_indb)
snr=10^(snr_indb(k)/10);
sgma=1;
eb=2*(sgma^2)*snr;
LC=31;
echip=eb/LC;
N=10000;%number of bits transmitted
%creat PN codes
fbconnection=[0 1 0 0 1];
mseq=m_sequence(fbconnection);
fbconnection1=[0 0 1 0 1];
fbconnection2=[0 1 1 1 1];
goldseq=gold_seq(fbconnection1,fbconnection2);
%N=2^length(fbconnection)-1;
ind1=find(mseq==0);
mseq(ind1)=-1;
ind2=find(goldseq==0);
goldseq(ind2)=-1; %creat 31*31 gold sequence
temp=goldseq;
pn_seq1=temp(3,:);
pn_seq2=temp(4,:);
pn_seq3=temp(7,:);
pn_seq4=temp(10,:);
pn_seq5=temp(15,:);
pn_seq6=temp(20,:);
pn_seq7=temp(26,:);
pn_seq8=temp(31,:);
% comput matrix R
pp=[pn_seq1;pn_seq2;pn_seq3;pn_seq4;pn_seq5;pn_seq6;pn_seq7;pn_seq8];
RR=(1/LC)*pp*pp';
RR1=inv(eb*eye(8));
R=inv(RR+RR1);
%generate codes
for i=1:N
temp1=rand;
if(temp1<0.5),dsource1(i)=-1;
else dsource1(i)=1;
end;
temp2=rand;
if(temp2<0.5),dsource2(i)=-1;
else dsource2(i)=1;
end;
temp3=rand;
if(temp3<0.5),dsource3(i)=-1;
else dsource3(i)=1;
end;
temp4=rand;
if(temp4<0.5),dsource4(i)=-1;
else dsource4(i)=1;
end;
temp5=rand;
if(temp5<0.5),dsource5(i)=-1;
else dsource5(i)=1;
end;
temp6=rand;
if(temp6<0.5),dsource6(i)=-1;
else dsource6(i)=1;
end;
temp7=rand;
if(temp7<0.5),dsource7(i)=-1;
else dsource7(i)=1;
end;
temp8=rand;
if(temp8<0.5),dsource8(i)=-1;
else dsource8(i)=1;
end;
end;
number_of_err=0;
number_of_err1=0;
number_of_err2=0;
for i=1:N
%将每个bit repeat LC=31 times
for j=1:LC
repeatdata1(j)=dsource1(i);
repeatdata2(j)=dsource2(i);
repeatdata3(j)=dsource3(i);
repeatdata4(j)=dsource4(i);
repeatdata5(j)=dsource5(i);
repeatdata6(j)=dsource6(i);
repeatdata7(j)=dsource7(i);
repeatdata8(j)=dsource8(i);
end;
for ii=0:2^8-1
j=1;aa=ii;
while aa~=0
bk(j,ii+1)=rem(aa,2);
aa=floor(aa/2);
j=j+1;
end
end
bk=bk*2-1;
%tranmit signal is:
trans_sig1=sqrt(echip)* repeatdata1.*pn_seq1;
trans_sig2=sqrt(echip)* repeatdata2.*pn_seq2;
trans_sig3=sqrt(echip)* repeatdata3.*pn_seq3;
trans_sig4=sqrt(echip)* repeatdata4.*pn_seq4;
trans_sig5=sqrt(echip)* repeatdata5.*pn_seq5;
trans_sig6=sqrt(echip)* repeatdata6.*pn_seq6;
trans_sig7=sqrt(echip)* repeatdata7.*pn_seq7;
trans_sig8=sqrt(echip)* repeatdata8.*pn_seq8;
%add AWGN noise
noise=sgma*randn(1,LC);
% receive signal
for j=1:LC
rtemp(j)=trans_sig1(j)+trans_sig2(j)+trans_sig3(j)+trans_sig4(j)+trans_sig5(j)+trans_sig6(j)+trans_sig7(j)+trans_sig8(j);
end;
r=rtemp+noise;
r1=r;r2=r;r3=r;r4=r;r5=r;r6=r;r7=r;r8=r;
%CD JUDGE
I1=sum(r1.*pn_seq1);
I2=sum(r2.*pn_seq2);
I3=sum(r3.*pn_seq3);
I4=sum(r4.*pn_seq4);
I5=sum(r5.*pn_seq5);
I6=sum(r6.*pn_seq6);
I7=sum(r7.*pn_seq7);
I8=sum(r8.*pn_seq8);
% DD JUDGE
I=R*[I1,I2,I3,I4,I5,I6,I7,I8]';
y=[I1,I2,I3,I4,I5,I6,I7,I8]';
for ii=1:2^8
c(ii)=2*(bk(:,ii))'*y-(bk(:,ii))'*R*bk(:,ii);
end
[m,mm]=max(c);
bb=bk(:,mm);
if(bb(1)~=dsource1(i)),number_of_err2=number_of_err2+1;end;
if(bb(2)~=dsource2(i)),number_of_err2=number_of_err2+1;end;
if(bb(3)~=dsource3(i)),number_of_err2=number_of_err2+1;end;
if(bb(4)~=dsource4(i)),number_of_err2=number_of_err2+1;end;
if(bb(5)~=dsource5(i)),number_of_err2=number_of_err2+1;end;
if(bb(6)~=dsource6(i)),number_of_err2=number_of_err2+1;end;
if(bb(7)~=dsource7(i)),number_of_err2=number_of_err2+1;end;
if(bb(8)~=dsource8(i)),number_of_err2=number_of_err2+1;end;
% DD make decision
if(I(1)<0), desion1=-1;
else desion1=1;
end;
if(I(2)<0), desion2=-1;
else desion2=1;
end;
if(I(3)<0), desion3=-1;
else desion3=1;
end;
if(I(4)<0), desion4=-1;
else desion4=1;
end;
if(I(5)<0), desion5=-1;
else desion5=1;
end;
if(I(6)<0), desion6=-1;
else desion6=1;
end;
if(I(7)<0), desion7=-1;
else desion7=1;
end;
if(I(8)<0), desion8=-1;
else desion8=1;
end;
if(desion1~=dsource1(i)),number_of_err=number_of_err+1;end;
if(desion2~=dsource2(i)),number_of_err=number_of_err+1;end;
if(desion3~=dsource3(i)),number_of_err=number_of_err+1;end;
if(desion4~=dsource4(i)),number_of_err=number_of_err+1;end;
if(desion5~=dsource5(i)),number_of_err=number_of_err+1;end;
if(desion6~=dsource6(i)),number_of_err=number_of_err+1;end;
if(desion7~=dsource7(i)),number_of_err=number_of_err+1;end;
if(desion8~=dsource8(i)),number_of_err=number_of_err+1;end;
%CD MAKE DECISION
% CD make decision
if(I1<0), desion11=-1;
else desion11=1;
end;
if(I2<0), desion21=-1;
else desion21=1;
end;
if(I3<0), desion31=-1;
else desion31=1;
end;
if(I4<0), desion41=-1;
else desion41=1;
end;
if(I5<0), desion51=-1;
else desion51=1;
end;
if(I6<0), desion61=-1;
else desion61=1;
end;
if(I7<0), desion71=-1;
else desion71=1;
end;
if(I8<0), desion81=-1;
else desion81=1;
end;
if(desion11~=dsource1(i)),number_of_err1=number_of_err1+1;end;
if(desion21~=dsource2(i)),number_of_err1=number_of_err1+1;end;
if(desion31~=dsource3(i)),number_of_err1=number_of_err1+1;end;
if(desion41~=dsource4(i)),number_of_err1=number_of_err1+1;end;
if(desion51~=dsource5(i)),number_of_err1=number_of_err1+1;end;
if(desion61~=dsource6(i)),number_of_err1=number_of_err1+1;end;
if(desion71~=dsource7(i)),number_of_err1=number_of_err1+1;end;
if(desion81~=dsource8(i)),number_of_err1=number_of_err1+1;end;
end
err(k)=number_of_err/(3*N)%MMSE ber
err1(k)=number_of_err1/(3*N)%CD ber
err2(k)=number_of_err2/(3*N)
end
%plot(snr_indb,err);
semilogy(snr_indb,err,'k');%MMSE ber
grid on;
hold on;
semilogy(snr_indb,err1,'r');%CD ber
hold on
semilogy(snr_indb,err2,'^-')
- 1
- 2
- 3
- 4
前往页