📄 jce_4part.m
字号:
end
end
%下面程序进行b矩阵的矢量化,即把一个用户在各个天线上的W径写出一列
V=zeros(M*(Q+W-1),K);
for k=1:K
for j=1:con1
V((j-1)*M+1:j*M,k)=b(:,(k-1)*con1+j);%对每一个用户在每一个天线上的衰减进行矢量化
end
end
clear j;
C=M*Q;%C是两个V矩阵之间相隔的行数
R=M*con1;%R是V矩阵的行数
T=zeros(M*(N*Q+W-1),N*K);%T矩阵有(N-1)*C+M*o行,有N*K列;将C和R带入后,T矩阵的行数可简化为M*(N*Q+W-1)
for j=1:N
T_1((j-1)*C+1:(j-1)*C+R,(j-1)*K+1:j*K)=V;%T矩阵是对角线由N个V矩阵构成,其余元素为0的矩阵;
end
clear j V b;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%下面的程序产生系统矩阵
%先进行信道估计和扩频码的卷积
con1=W+Q-1;
for m=1:M
for k=1:K
u=H_est_22(m,(k-1)*W+1:k*W);
v=w4(Q-k+1,:).*scram;
b(m,(k-1)*con1+1:k*con1)=conv(u,v);
end
end
%下面程序进行b矩阵的矢量化,即把一个用户在各个天线上的W径写出一列
V=zeros(M*(Q+W-1),K);
for k=1:K
for j=1:con1
V((j-1)*M+1:j*M,k)=b(:,(k-1)*con1+j);%对每一个用户在每一个天线上的衰减进行矢量化
end
end
clear j;
C=M*Q;%C是两个V矩阵之间相隔的行数
R=M*con1;%R是V矩阵的行数
T=zeros(M*(N*Q+W-1),N*K);%T矩阵有(N-1)*C+M*o行,有N*K列;将C和R带入后,T矩阵的行数可简化为M*(N*Q+W-1)
for j=1:N
T_2((j-1)*C+1:(j-1)*C+R,(j-1)*K+1:j*K)=V;%T矩阵是对角线由N个V矩阵构成,其余元素为0的矩阵;
end
clear j;
%%%%%%%%%%%%%%%%%%%%%%%利用T矩阵对第p个时隙进行联合检测;
%把M个天线上接收到的用户数据进行矢量化
D_1=data_1(:);%对第一段数据进行矢量化
D_2=data_2(:);%对第二段数据进行矢量化
% T_1=T'*T;%T矩阵的共轭转置;
% T_2=inv(T_1);
% T_3=T_2*T';
D_num_1=inv(T_1'*T_1)*T_1'*D_1;%K个用户的字符按顺序排成一列,每个用户N个字符;
D_num_2=inv(T_2'*T_2)*T_2'*D_2;
D_num=[D_num_1;D_num_2];
D_symbol=zeros(K,N_1);
for q=1:N_1
D_symbol(:,q)=D_num((q-1)*K+1:q*K,1);
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%没有进行H估计的系列程序%%%%%%%%%%%%%
%以下程序进行QPSK解调
D_bit=zeros(K,2*N_1);
angle_symbol=angle(D_symbol);
for k=1:K
for j=1:N_1
if angle_symbol(k,j)>=(pi/4) & angle_symbol(k,j)<(3*pi/4)
D_bit(k,2*j-1:2*j)=[0 0];
elseif angle_symbol(k,j)>=(-3*pi/4) & angle_symbol(k,j)<(-pi/4)
D_bit(k,2*j-1:2*j)=[1 1];
elseif angle_symbol(k,j)>=(-pi/4) & angle_symbol(k,j)<(pi/4)
D_bit(k,2*j-1:2*j)=[0 1];
else
D_bit(k,2*j-1:2*j)=[1 0];
end
end
% D_bit_1(k,:) = vitdec(D_bit(k,:), trel, tblen, 'cont', 'hard');
% bit_source_11(k,:) = vitdec(bit_source_1(k,:), trel, tblen, 'cont', 'hard');
end
clear j ;
%以下程序计算误比特率
D_same=zeros(K,2*N_1);
D_same=eq(D_bit,bit_source_1);%输入和输出作比较,找出传输没有出错的信号;
D_diff=~D_same;
diff(n,p)=sum(sum(D_diff));%传错的比特数
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%以下程序利用估计的H,JD检测%%%%%%%%%%%%%%%%%%%%%
%chip_1=chip_tran(:,(p-1)*1000+1:p*1000);
% con1=W+Q-1;
for m=1:M
for k=1:K
u1=H_est1(m,(k-1)*W+1:k*W);
v=w4(Q-k+1,:).*scram;
b1(m,(k-1)*con1+1:k*con1)=conv(u1,v);
end
end
%下面程序进行b矩阵的矢量化,即把一个用户在各个天线上的W径写出一列
V1=zeros(M*(Q+W-1),K);
for k=1:K
for j=1:con1
V1((j-1)*M+1:j*M,k)=b1(:,(k-1)*con1+j);%对每一个用户在每一个天线上的衰减进行矢量化
end
end
clear j;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%下面程序构成T矩阵%%%%%%%%%%%%%%%%%%%%%%%%%%
C=M*Q;%C是两个V矩阵之间相隔的行数
R=M*con1;%R是V矩阵的行数
T1=zeros(M*(N*Q+W-1),N*K);%T矩阵有(N-1)*C+M*o行,有N*K列;将C和R带入后,T矩阵的行数可简化为M*(N*Q+W-1)
for j=1:N
T1((j-1)*C+1:(j-1)*C+R,(j-1)*K+1:j*K)=V1;%T矩阵是对角线由N个V矩阵构成,其余元素为0的矩阵;
end
clear j;
%%%%%%%%%%%%%%%%%%%%%%%利用T矩阵对第p个时隙进行联合检测;
T_11=T1'*T1;%T矩阵的共轭转置;
T_22=inv(T_11);
T_33=T_22*T1';
D_num_11=T_33*D_1;%K个用户的字符按顺序排成一列,每个用户N个字符;
D_num_22=T_33*D_2;
D_num1=[D_num_11;D_num_22];
D_symbol1=zeros(K,N_1);
for q=1:N_1
D_symbol1(:,q)=D_num1((q-1)*K+1:q*K,1);
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%以下程序进行QPSK解调
D_bit1=zeros(K,2*N_1);
angle_symbol1=angle(D_symbol1);
for k=1:K
for j=1:N_1
if angle_symbol1(k,j)>=(pi/4) & angle_symbol1(k,j)<(3*pi/4)
D_bit1(k,2*j-1:2*j)=[0 0];
elseif angle_symbol1(k,j)>=(-3*pi/4) & angle_symbol1(k,j)<(-pi/4)
D_bit1(k,2*j-1:2*j)=[1 1];
elseif angle_symbol1(k,j)>=(-pi/4) & angle_symbol1(k,j)<(pi/4)
D_bit1(k,2*j-1:2*j)=[0 1];
else
D_bit1(k,2*j-1:2*j)=[1 0];
end
end
% D_bit_2(k,:) = vitdec(D_bit1(k,:), trel, tblen, 'cont', 'hard');
end
clear j ;
%以下程序计算误比特率
D_same1=zeros(K,2*N_1);
D_same1=eq(D_bit1,bit_source_1);%输入和输出作比较,找出传输没有出错的信号;
D_diff1=~D_same1;
diff1(n,p)=sum(sum(D_diff1));%传错的比特数
end%结束n的循环
end%结束TS_num个时隙的循环
ber1=sum(diff1,2)/(2*N_1*K*TS_num)
y1(U_no,:)=transpose(ber1);
ber=sum(diff,2)/(2*N_1*K*TS_num)
y(U_no,:)=transpose(ber);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
end%结束不同用户的循环
% semilogy(sinr,y(1,:))%,sinr,y(2,:),sinr,y(3,:),sinr,y(4,:),sinr,y(5,:));
% semilogy(sinr,y1(1,:))%,sinr,y1(2,:),sinr,y1(3,:),sinr,y1(4,:),sinr,y1(5,:));
% axis([sinr(1) sinr(end) 1e-5 1]);
%
% % subplot(2,1,1),
% plot(sinr,y(1,:),'r-*')%,sinr,y(2,:),'r-o',sinr,y(3,:),'r-+',sinr,y(4,:),'r-x')%,sinr,y(5,:),'s'),grid;
% legend('红色 不估计','绿色 估计后');%,'o 4个用户','x 8个用户','s 16个用户');
% xlabel('Eb/No');%x轴注解
% ylabel('误码率');%y轴注解
% % subplot(2,1,2)
% hold on;
% plot(sinr,y1(1,:),'g-*')%,sinr,y1(2,:),'g-o',sinr,y1(3,:),'g-+',sinr,y1(4,:),'g-x')%,sinr,y_ICIN(5,:),'h'),grid;
% % legend('- 1个用户','-. 2个用户','^ 4个用户','p 8个用户','h 16个用户');
% hold off;
% grid on;
% %legend('* 1个用户','+ 2个用户','o 4个用户','x 8个用户','s 16个用户');
% % xlabel('Eb/No');%x轴注解
% % ylabel('误码率');%y轴注解
% title('不同用户情况下的误码率');%图形标题
% c7=clock
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -