📄 jce_4part.m
字号:
clc
clear all;
users=[4 2 4 8];
c1=clock
load ('D:\4M4K100slotscase3.mat')
for U_no=1:1
K=users(U_no)%用户数
M=4;%天线数
TS_num=10;%时隙数
cell_num=2;%小区序号
Lm=144;
casething=3;
%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@可以改变
switch casething
case 1
paths=2;
delay_tapscase=[0 4]; % timedelay of multipath
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%case1
case 2
paths=3;
delay_tapscase=[0 4 15];
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%case2
case 3
paths=4;
delay_tapscase=[0 1 2 3];
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%case3
end
W=max(delay_tapscase)+1;
T_max=W-1;
[chip_tran,bit_source,w4,scram,Q]=tx3(TS_num,K,cell_num);%chip_tran矩阵是发送端发出的chip序列,bit_source是用户的比特序列,w4是用户的扩频码矩阵,
%scram是用户的扰码矩阵,Q是扩频因子,tx1的第一个函数是时隙数,第二个函数是用户数,第三个是小区数;
%以下程序产生瑞利衰减信道对每个用户的每一径的平均衰减,以及进行联合检测的用户数据
N=352/Q;%N是每段数据的字符数
N_1=2*N;%N1是两段数据的字符总和
chip_1=chip_tran(:,1:1000);%
%%%%%%%%%%%%%%%%%%%%%产生信道估计用的G矩阵%%%%%%%%%%%
%%%%%%%截取K个用户的中缀码放入G_1中%%%%%%
for i=1:K
G_1(i,:)=chip_1(i,353:496);%%%%维数:【K,144】
end
clear i;
%%%%%%%%%%%%%每个用户因为多径效应,中缀码也有W径,共K个用户%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
for i=1:K
G_2=G_1(i,:).';%%%取出第k个用户的中缀码转置放入G_2中,以备后用
for j=1:W %%%%%%%%%%%%%%%产生第k个用户的W个信道冲击响应的中缀码矩阵
G_3(:,j)=G_2(W-j+1:Lm-j+1);
end
G_4(:,(i-1)*W+1:i*W)=G_3;%%%%%将第k个用户的中缀码多径矩阵,放入G中
end %%%%%%%结束K个用户循环,维数是:【(L-W+1),KW】
G=KRON(eye(M),G_4); %%%%维数是:【M(L-W+1),MKW】
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
H_ZF=inv(G'*G)*G';%%%% MKW,M(Lm+W-1)
clear G_1 G_2 G_3 G_4 G;
%%%%%%%%%%%%%%%%%%%%%产生2个信道估计用的G矩阵%%%%%%%%%%%
%%%%%%%截取K个用户的中缀码放入G_1中%%%%%%
for i=1:K
G_1(i,:)=chip_1(i,353:424);%%%%维数:【K,144】
end
clear i;
%%%%%%%%%%%%%每个用户因为多径效应,中缀码也有W径,共K个用户%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
for i=1:K
G_2=G_1(i,:).';%%%取出第k个用户的中缀码转置放入G_2中,以备后用
for j=1:W %%%%%%%%%%%%%%%产生第k个用户的W个信道冲击响应的中缀码矩阵
G_3(:,j)=G_2(W-j+1:72-j+1);
end
G_4(:,(i-1)*W+1:i*W)=G_3;%%%%%将第k个用户的中缀码多径矩阵,放入G中
end %%%%%%%结束K个用户循环,维数是:【(L-W+1),KW】
G=KRON(eye(M),G_4); %%%%维数是:【M(L-W+1),MKW】
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
H_ZF_1=inv(G'*G)*G';%%%% MKW,M(Lm+W-1)
clear G_1 G_2 G_3 G_4 G;
%%%%%%%截取K个用户的中缀码放入G_1中%%%%%%
for i=1:K
G_1(i,:)=chip_1(i,425:496);%%%%维数:【K,144】
end
clear i;
%%%%%%%%%%%%%每个用户因为多径效应,中缀码也有W径,共K个用户%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
for i=1:K
G_2=G_1(i,:).';%%%取出第k个用户的中缀码转置放入G_2中,以备后用
for j=1:W %%%%%%%%%%%%%%%产生第k个用户的W个信道冲击响应的中缀码矩阵
G_3(:,j)=G_2(W-j+1:72-j+1);
end
G_4(:,(i-1)*W+1:i*W)=G_3;%%%%%将第k个用户的中缀码多径矩阵,放入G中
end %%%%%%%结束K个用户循环,维数是:【(L-W+1),KW】
G=KRON(eye(M),G_4); %%%%维数是:【M(L-W+1),MKW】
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
H_ZF_2=inv(G'*G)*G';%%%% MKW,M(72+W-1)
clear G_1 G_2 G_3 G_4 G;
clear chip_1;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%% TS_num个时隙的循环%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
for p=1:TS_num
p
H_user=zeros(K*W,1000,M);
H_user(:,1:864,:)=H_all(:,(p-1)*864+1:p*864,:);
sinr=[5];
chip_1=chip_tran(:,(p-1)*1000+1:p*1000);%%%%%%调用不同时隙的符号序列,维数是[K,1000]
bit_source_1=bit_source(:,(p-1)*2*N_1+1:p*2*N_1);%%%%调用不同时隙的数据比特
H_multi=H_user(1:K*W,:,:);
H_delay=zeros(W,1000+W-1);
sum_channel=zeros(K*W,M);
r_delay=zeros(K*W,1000+W-1,M);
for m=1:M
H_page=H_multi(:,:,m);%%%【K×W,1000】
sum_channel(:,m)=sum(H_page,2);%对矩阵的每一行求和,即对每一径进行求和,列向量,K*W,M
for k=1:K
H_single=H_multi((k-1)*W+1:k*W,:,m);
for w=1:W
A_delay(w,w:1000+w-1)=chip_1(k,:); % A_delay是每一径经延迟后的K个用户的信号矩阵,对用户各径数据产生延迟,
%最大延迟为W-1(已把τ(max)归一化为chip)
H_delay(w,w:1000+w-1)=H_single(w,:);
end
r_delay((k-1)*W+1:k*W,:,m)=A_delay.*H_delay;
end
end
h=sum_channel/1000;%%%维数是【K*W,M】,用于构造系统矩阵
h=transpose(h);
%%%%%通过瑞利信道之后,再通过高斯信道
for n=1:length(sinr)
for m=1:M
B(m,:)=sum(r_delay(:,:,m));%%%%一根天线上所有用户的数据
end
B_noise=awgn(B,sinr(n),'measured');%对每个天线上接收到的数据加高斯白噪声
%对第p个时隙进行联合检测,程序知道QPSK解调前才结束;产生D_symbol矩阵
data_1=B_noise(:,1:352+T_max);%去复用,得到第一段数据
data_2=B_noise(:,497:848+T_max);%去复用,得到第二段数据
%%%% 分四段来做 %%%%
% chip_qian_1=chip_end(:,1:176+W-1);
% chip_qian_2=chip_end(:,177:352+W-1);
% chip_qian_3=chip_end(:,497:672+W-1);
% chip_qian_4=chip_end(:,673:848+W-1);
%%%%%%%%%%%%%%%%%%%中缀码的截取,前面W-1个不要%%%%%%%%%%%%%%
midamble=B_noise(:,352+T_max+1:352+Lm).';% 混合多径中缀码数据,维数是[(L-W+1),M]
x_midamble=midamble(:);
H_est2=H_ZF*x_midamble;%%% MK*W,1
%%%%% midi码分2段来做信道估计
midamble_1=B_noise(:,352+T_max+1:352+72).';%
x_midamble_1=midamble_1(:);
midamble_2=B_noise(:,424+T_max+1:424+72).';%
x_midamble_2=midamble_2(:);
H_est_1=H_ZF_1*x_midamble_1;%%% { [MKW,M(72+W-1)] , [M(72+W-1),1] }
H_est_2=H_ZF_2*x_midamble_2;%%% MK*W,1
%%% 利用估计中缀码得到的2段信道估计得值,线性延升到数据得2段上
% slope=(H_est_2-H_est_1)/72;
% slope_r=real(slope);
% slope_i=imag(slope);
% location_1=-248;
% location_2=320;
% H_1_r=real(H_est_1)+slope_r*location_1;
% H_1_i=imag(H_est_1)+slope_i*location_1;
% H_2_r=real(H_est_1)+slope_r*location_2;
% H_2_i=imag(H_est_1)+slope_i*location_2;
% H_1=H_1_r+sqrt(-1)*H_1_i;
% H_2=H_2_r+sqrt(-1)*H_2_i;
for i=1:M
H_est1(i,:)=H_est2((i-1)*K*W+1:i*K*W).';
H_est_11(i,:)=H_est_1((i-1)*K*W+1:i*K*W).';
H_est_22(i,:)=H_est_2((i-1)*K*W+1:i*K*W).';
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%下面的程序产生系统矩阵
%先进行信道估计和扩频码的卷积
con1=W+Q-1;
for m=1:M
for k=1:K
u=H_est_11(m,(k-1)*W+1:k*W);
v=w4(Q-k+1,:).*scram;
b(m,(k-1)*con1+1:k*con1)=conv(u,v);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -