📄 main.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 + -