clear all;
close all;
clc; %清屏
N=100; %每个用户的数据
User_num=2; %用户数
Spread=3; %扩频倍
m_length=128; %m序列的长度
m_length1=16383;
A=1; %幅度
Blocklength=N*Spread; %每路chip的数量
ChipLen=N*Spread*m_length;
SNR=-20:4:20;
Num=length(SNR);
fangzhen_NUM=10;%仿真次数
INTER=[1];
inter_num=length(INTER);
inter_num=1
%==========================================================================
p =2;
m =log2(m_length1+1); % Work in GF(81).
fewterms_m= gfprimfd(m,'min',p);
% for m_n=1:User_num
fewterms=fewterms_m(1,:);
L=length(fewterms)-1;
for i=1:L
aa(i)=fewterms(i+1);
end
reg=ones(1,L);
for i=1:2^L-1
output(i)=reg(L);
tem=aa.*reg;
tem=tem';
tem=sum(tem);
for j=1:L-1
reg_(j+1)=reg(j);
end
reg_(1)=mod(tem,2);
reg=reg_;
end
% out1(m_n,:)=1-2*output;
% end
% m_sequence1=out1;
m=1;
for nuser=1:User_num
for i=1:m_length
SpreadSeq(nuser,i)=1-2*(output(m));
m=m+1;
end
end
m_sequence=SpreadSeq;
%=======================================================================
%交织器幂交织器
for i=1:Blocklength;
ScrambleRule1(i)=i;
end
%Perform this for-loop more times may increase the randomness of the interleaver.
for i=1:(Blocklength-1)
j=i+mod(fix(10000*(rand())*fix(10000*rand())),(Blocklength-i));
tmp=ScrambleRule1(i);
ScrambleRule1(i)=ScrambleRule1(j);
ScrambleRule1(j)=tmp;
end
ScrambleRule(1,:)=ScrambleRule1;
for k=2:User_num
for i=1:Blocklength
ScrambleRule(k,i)=ScrambleRule(k-1,ScrambleRule1(i));
end
end
ScrambleRule1=ScrambleRule;
%=========================================================================
for inter1=1:inter_num
inter=INTER(inter1);
for i=1:User_num
ScrambleRule(i,:)=ScrambleRule1(floor((i-1)/(User_num/inter))+1,:);
end
%=========================================================================
for x_num=1:Num %分别统计不同信噪比条件下的误码率
var1=SNR(x_num) ;
snr=(10^(var1/10))/m_length
N0=A*A/(2*snr);
sigma=sqrt(N0);
var=sigma*sigma;
error_total=0;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%信源
error=0;
for j=1:fangzhen_NUM
d=sign(randn(User_num,N));
dd=(d+A)/2;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%REP
for z=1:User_num
R_d=ones(Spread,1)*d(z,:);
R_d1=R_d(:);
R_d2(z,:)=R_d1';
end
%=========================================================================
%交织
% for i=1:inter
% xx(1:User_num/inter,:,i)=R_d2(1+(i-1)*User_num/inter:i*User_num/inter,:);
% end
%
% for k=1:inter
% for j=1:User_num/inter
% for i=1:Blocklength
% x(j,i,k)=xx(j,ScrambleRule(k,i),k);
% end
% end
% end
%
% for i=1:inter
% x1(1+(i-1)*User_num/inter:i*User_num/inter,:)=x(1:User_num/inter,:,i);
% end
for i=1:User_num
for j=1:Blocklength
x1(i,j)=R_d2(i,ScrambleRule(i,j));
end
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%扩频
for z=1:User_num
a=m_sequence(z,:)'*x1(z,:);
a1=a(:);
Rx(z,:)=a1';
end
%=========================================================================
%噪声
noise=randn(1,ChipLen);%*m_m_length);
rnd_noise=sigma*noise;
%接收到的数据
r=sum(Rx)+rnd_noise;
%=========================================================================
r_pi=zeros(z,N*Spread);
for z=1:User_num
for j=1:N*Spread
for i=1:m_length
r_pi(z,j)=r_pi(z,j)+r((j-1)*m_length+i)*m_sequence(z,i);
end
end
end
r_pi=r_pi/m_length;
%===================================================================
%解交织
% for i=1:inter
% rxx(1:User_num/inter,:,i)=r_pi(1+(i-1)*User_num/inter:i*User_num/inter,:);
% end
%
% for k=1:inter:
% for z=1:1:User_num/inter
% for i=1:N*Spread
% rr_p(z,ScrambleRule(k,i),k)=rxx(z,i,k);
% end
% end
% end
% for i=1:inter
% rx1(1+(i-1)*User_num/inter:i*User_num/inter,:)=rr_p(1:User_num/inter,:,i);
% end
for i=1:User_num
for j=1:N*Spread
rx1(i,ScrambleRule(i,j))=r_pi(i,j);
end
end
%=====================================================================
%解码
r_d=zeros(User_num,N);
for z=1:User_num
for i=1:N
for j=1:Spread
r_d(z,i)=r_d(z,i)+rx1(z,j+(i-1)*Spread);
end
end
end
%%======================================================================
r_d=(sign(r_d/Spread)+1)/2;
error=sum(sum(xor(dd,r_d)))+error;
end
error_p(inter1,x_num)=error/(User_num*N*fangzhen_NUM);
end
end
figure(1)
for i=1:inter_num
switch i
case 1
semilogy(SNR,error_p(i,:),'-r*')
grid on
xlabel('Eb/No /dB');
ylabel('BER');
title('BER OF the SYSTEM');
hold on
case 2
semilogy(SNR,error_p(i,:),'-g*')
grid on
xlabel('Eb/No /dB');
ylabel('BER');
title('BER OF the SYSTEM');
hold on
case 3
semilogy(SNR,error_p(i,:),'-b*')
grid on
xlabel('Eb/No /dB');
ylabel('BER');
title('BER OF the SYSTEM');
hold on
case 4
semilogy(SNR,error_p(i,:),'-c*')
grid on
xlabel('Eb/No /dB');
ylabel('BER');
title('BER OF the SYSTEM');
hold on
case 5
semilogy(SNR,error_p(i,:),'-m*')
grid on
xlabel('Eb/No /dB');
ylabel('BER');
title('BER OF the SYSTEM');
hold on
case 6
semilogy(SNR,error_p(i,:),'-y*')
grid on
xlabel('Eb/No /dB');
ylabel('BER');
title('BER OF the SYSTEM');
hold on
case 7
semilogy(SNR,error_p(i,:),'-k*')
grid on
xlabel('Eb/No /dB');
ylabel('BER');
title('BER OF the SYSTEM');
hold on
case 8
semilogy(SNR,error_p(i,:),'-w*')
grid on
xlabel('Eb/No /dB');
ylabel('BER');
title('BER OF the SYSTEM');
hold on
end
end