⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.m

📁 CDMA多用户检测程序
💻 M
字号:
%**************************************************************************
%mutiuser detection algorithms comparion
% date:2008-10-3
clc;
clear;
%**************************************************************************
% paramter initilization
usernum = 5;
gain = 24;
num = 2000;
K = usernum;                
G = gain;                      
Num= num;
snrp = 8;
s=longcode(500);

%**************************************************************************
  S = zeros(G,K);
  A = diag(ones(K,1)); 
  C = diag(ones(K,1));
for n = 1:K
   S(:,n) = s((n-1)*G+1:n*G);
%  S(:,n) = s(n+1:n+G);
end
R=(S*C)'*(S*C)/G;
%**************************************************************************
D=diag(diag(R));
E=R-D;
FOD=eye(K)-E;
%**************************************************************************
D(1,1)  =  R(1,1);
D(1,2)  =  R(1,2);

for k = 2:K-1
    D(k,k) = R(k,k);
    D(k,k+1) = R(k,k+1);
    D(k,k-1) = R(k,k-1);
end
D(K,K)  =  R(K,K);
D(K,K-1)  =  R(K,K-1);
TOD = (eye(K)-pinv(D)*E)*pinv(D);
% *************************************************************************
% fast matrix inversion algorithm
L = zeros(K);
Dmid = zeros(K);
L_inv = zeros(K);

Dmid(1,1) = D(1,1);
L(2,1) = D(1,2)/Dmid(1,1);
L(1,1) = 1;
for m = 2:K-1
   L(m,m) = 1;
   Dmid(m,m) = D(m,m)-L(m,m-1)^2*Dmid(m-1,m-1);
   L(m+1,m) = D(m+1,m)/Dmid(m,m);
end

Dmid(K,K) = D(K,K)-L(K,K-1)^2*D(K-1,K-1);
L(K,K) = 1;

        
Linv=inv(L);
for m = 1:K-1
    L_inv(m,m) = L(m,m);
    L_inv(m+1,m) = -L(m+1,m);
end
L_inv(K,K) = 1;

% *************************************************************************
D3inv=L_inv'*inv(Dmid)*L_inv;
E = R-D;
TOD = (eye(K)-pinv(D)*E)*pinv(D);
TODAP = (eye(K)-D3inv*E)*D3inv;
%**************************************************************************
for m=1:snrp
    SNRdB = m;
    SNR = 10^(SNRdB/10); 
    
 for i=1:Num 
b = 1-2*(unidrnd(2,K,1)-1); 
data_b(:,i)=b; 
n_s= (randn(G,1)+j*randn(G,1))/sqrt(SNR)/sqrt(2);
n = (S*C)'*n_s/sqrt(G);  

y=R*A*b + n; 

b_dec_csd = sign(real(y));
b_dec_lmd = sign(real(pinv(R)*y)); 
b_dec_fod = sign(real(FOD*y));  
b_dec_tod = sign(real(TOD*y));  
b_dec_todap = sign(real(TODAP*y));  

e_csd = b-b_dec_csd; 
e_lmd = b-b_dec_lmd; 
e_fod = b-b_dec_fod; 
e_tod = b-b_dec_tod; 
e_todap = b-b_dec_todap; 

data_e_csd(:,i) = abs(e_csd/2);
data_e_lmd(:,i) = abs(e_lmd/2);
data_e_fod(:,i) = abs(e_fod/2);
data_e_tod(:,i) = abs(e_tod/2);
data_e_todap(:,i) = abs(e_todap/2);
 end 

er_user_csd = zeros(1,K); 
er_user_lmd = zeros(1,K); 
er_user_fod = zeros(1,K); 
er_user_tod = zeros(1,K); 
er_user_todap = zeros(1,K); 

for i1=1:K 
for i2=1:Num 
er_user_csd(1,i1)=er_user_csd(1,i1)+abs(data_e_csd(i1,i2)); 
er_user_lmd(1,i1)=er_user_lmd(1,i1)+abs(data_e_lmd(i1,i2)); 
er_user_fod(1,i1)=er_user_fod(1,i1)+abs(data_e_fod(i1,i2)); 
er_user_tod(1,i1)=er_user_tod(1,i1)+abs(data_e_tod(i1,i2)); 
er_user_todap(1,i1)=er_user_todap(1,i1)+abs(data_e_todap(i1,i2)); 
end 
BER_user_csd(1,i1) = er_user_csd(1,i1) / Num; 
BER_user_lmd(1,i1) = er_user_lmd(1,i1) / Num; 
BER_user_fod(1,i1) = er_user_fod(1,i1) / Num; 
BER_user_tod(1,i1) = er_user_tod(1,i1) / Num; 
BER_user_todap(1,i1) = er_user_todap(1,i1) / Num; 
end; 

er_inf_csd = zeros(1,Num); 
er_inf_lmd = zeros(1,Num); 
er_inf_fod = zeros(1,Num); 
er_inf_tod = zeros(1,Num); 
er_inf_todap = zeros(1,Num); 

for i1=1:Num 
for i2=1:K 
er_inf_csd(1,i1) = er_inf_csd(1,i1)+abs(data_e_csd(i2,i1)); 
er_inf_lmd(1,i1) = er_inf_lmd(1,i1)+abs(data_e_lmd(i2,i1)); 
er_inf_fod(1,i1) = er_inf_fod(1,i1)+abs(data_e_fod(i2,i1)); 
er_inf_tod(1,i1) = er_inf_tod(1,i1)+abs(data_e_tod(i2,i1)); 
er_inf_todap(1,i1) = er_inf_todap(1,i1)+abs(data_e_todap(i2,i1)); 
end 
end 

er_tot_csd = 0; 
er_tot_lmd = 0;
er_tot_fod = 0;
er_tot_tod = 0;
er_tot_todap = 0;

for i1=1:K 
for i2=1:Num 
er_tot_csd = er_tot_csd+abs(data_e_csd(i1,i2));  
er_tot_lmd = er_tot_lmd+abs(data_e_lmd(i1,i2));  
er_tot_fod = er_tot_fod+abs(data_e_fod(i1,i2));  
er_tot_tod = er_tot_tod+abs(data_e_tod(i1,i2));  
er_tot_todap = er_tot_todap+abs(data_e_todap(i1,i2));  
end 
end 

BER_tot_csd = er_tot_csd / (K*Num); 
BER_tot_lmd = er_tot_lmd / (K*Num); 
BER_tot_fod = er_tot_fod / (K*Num); 
BER_tot_tod = er_tot_tod / (K*Num); 
BER_tot_todap = er_tot_todap / (K*Num);

p_csd(m)=BER_tot_csd;
p_lmd(m)=BER_tot_lmd;
p_fod(m)=BER_tot_fod;
p_tod(m)=BER_tot_tod;
p_todap(m)=BER_tot_todap;
    
end

x=1:snrp;

figure(1)
semilogy(x,p_lmd,'*-r',x,p_fod,'-.g',x,p_todap,'+-b',x,p_csd,'k');
legend('线性解相关','一对角分解','三对角快速实现','传统检测');
xlabel('信噪比','FontSize',12);
ylabel('误码率','FontSize',12);


figure(2)
semilogy(x,p_tod,'b',x,p_todap,'r-o');
legend('三对角分解','三对角快速实现');
xlabel('信噪比','FontSize',12);
ylabel('误码率','FontSize',12);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -