📄 tx3.m
字号:
function [E,G,T,L,Q]=tx3(TS_num,K,c)
Lm=144; %时隙中缀码长度144。
P=128; %基本中缀码长度128。
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%初始化及变量赋值部分%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%BER=input('误比特率的要求BER=');
%TS_num=floor(100/BER/88)+1; %%仿真的时隙数,以时隙的最小比特数88为参考。
TS_interval=136; %给一个合理的时隙间隔,使得在仿真的时间里信道变化可以忽略。
t=TS_num*(864+TS_interval)*675/864*0.000001; %仿真时间以秒为单位计算。
%K=zeros(1); %开辟存储空间以便调试和性能估计时查找参照。
%c=zeros(1); %小区序号,间接决定了扰码组(4个)和中缀码组(4个)序号。
l=zeros(1); %扰码的序号--4个码中的第几个,开辟内存空间存以便调试和性能估计时查找参照。
m=zeros(1,128); %基本中缀码集。
mid_num=zeros(1); %中缀码的序号4个码中的第几个,开辟内存空间存以便调试和性能估计时查找参照。
%c=input('小区的序号(1-32)c=');
mid_num=(c-1)*4; %与小区序号相关的中缀码组(四个基本中缀码)。
l=(c-1)*4+1; %小区的序号与之有关的扰码组(四个基本中缀码)。
x=0; %针对TS_num个时隙desired_k用户数据bit的存放数组的起始位置。
z=0; %针对TS_num个时隙desired_k用户时隙码片chip的存放数组的起始位置。
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%基本中缀码%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
m=remidable(mid_num);%找出需要的中缀码;
L=scramble(l); %找出需要的扰码;
%K=input('当前时隙激活的用户数(<=16)K=');
%desired_k=input('要做性能估计的用户(<=K)=');
W=floor(128/K);%由K决定的用户的无线信道冲激响应抽头数目W。
m_1=zeros(1,Lm+(K-1)*W); %产生复中缀码的中间过程。
M=zeros(K,Lm); %K个用户的复中缀码集合,每一行为一个用户所对应的复中缀码。
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%扩频码矩阵%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%if (K<=16) & (K>8) %第一步:由K决定的扩频因子Q的大小选择。
% Q=16;
%elseif (K<=8) & (K>4) %有待升级优化,根据扩频树的使用原则。
% Q=randsrc(1,1,[16,8]);
%elseif (K<=4) & (K>2)
% Q=randsrc(1,1,[16,8,4]);
%elseif (K<=2) & (K>1)
% Q=randsrc(1,1,[16,8,4,2]);
%else
% Q=randsrc(1,1,[16,8,4,2]);
%end
Q=16;
A=[1];T=zeros(Q); %扩频码矩阵。
data_symbol_num=352*2/Q; %两部份数据段的符号数与扩频因子及码片数352(*2)的关系。
data_bit_num=data_symbol_num*2; %2个比特产生一个符号。
E=zeros(K,(864+TS_interval)*TS_num); %记录了K个用户仿真时间内的所有发送chip。
G=zeros(K,data_bit_num*TS_num); %纪录了K个用户仿真时间内的所有源bit,初始化的容量以最大的可能bit数为参考。
for i=1:log2(Q)
A=[A A;
A -A];
end
if Q==1 %第二步:扩频码矩阵。
C=[1];T=A*C;
elseif Q==2
C=[1;sqrt(-1)];
for j=1:2
T(j,:)=C(j,1).*A(j,:);
end
elseif Q==4
C=[-sqrt(-1);1;sqrt(-1);-1];
for j=1:4
T(j,:)=C(j,1).*A(j,:);
end
elseif Q==8
C=[1;sqrt(-1);sqrt(-1);-1;-sqrt(-1);-1;-sqrt(-1);1];
for j=1:8
T(j,:)=C(j,1).*A(j,:);
end
else
C=[-1;-sqrt(-1);1;1;sqrt(-1);-1;-1;1;-sqrt(-1);sqrt(-1);1;sqrt(-1);-sqrt(-1);-sqrt(-1);sqrt(-1);-1];
for j=1:16
T(j,:)=C(j,1).*A(j,:);
end
end
clear A C;
clear A C;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%当前时隙K个用户的复中缀码矩阵M%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%通过调用basic_midamble_codes(mid_num)得到当前时隙user_num个用户应使用的基本中缀码集mp。
%由基本中缀码集导出K个用户的中缀码集。
for n=1:Lm+(K-1)*W
if n<=P
m_1(n)=m(n);
else
m_1(n)=m_1(n-P);
end
end
%每个用户的复中缀码的分配情况。第K个用户使用m_1(1)到m_1(144),第一个用户使用到m(end)。
for n=1:K
for j=1:Lm
M(n,j)=(sqrt(-1))^j*m_1(j+(K-n)*W);
end
end
clear mp m m_1 n;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% TS_num个时隙的循环 %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
for f=1:TS_num
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 循环K次产生K个用户的当前时隙 %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
for k=1:K %产生一个时隙激活的K个不同用户。
B=zeros(1,864); %初始化存放当前时隙当前用户的数组。
S=zeros(1,704);
D_1=zeros(1,352);
D_2=zeros(1,352);
symbol=zeros(1,data_symbol_num);
data= randsrc(1,data_bit_num,[0 1]);%比特到复数符号的映射:(00 +j,01 +1,10 -1,11 -j)。///////改动11月18日
for n=1:2:data_bit_num
if (data(n)==data(n+1))
if (data(n)==0)
symbol((n-1)/2+1)=+sqrt(-1);
else
symbol((n-1)/2+1)=-sqrt(-1);
end
elseif (data(n)==0)
symbol((n-1)/2+1)=+1;
else
symbol((n-1)/2+1)=-1;
end
end
%%%扩频部分
for n=1:data_symbol_num
for j=1:Q
S((n-1)*Q+j)=symbol(n)*T(Q-k+1,j); %每个符号乘以扩频码。
end
end
clear symbol n;
%%%查找扰码。
v=16; %扰码的长度。如果704/v不为整数则需改动程序!!!!
for n=1:352/v
for j=1:v
D_1((n-1)*v+j)=S((n-1)*v+j)*L(j); %以码片为基本单位对齐进行扰码。
end
end
for n=352/v+1:704/v
for j=1:v
D_2((n-1)*v+j-352)=S((n-1)*v+j)*L(j); %以码片为基本单位对齐进行扰码。S(n)由spreading.m得到。
end
end
clear S n;
%%%第k个用户的时隙比特。
for n=1:864+TS_interval
if n<=352
B(n)=D_1(n); %第一部分数据,可以考虑用矩阵D_1表示。
elseif (n>352) & (n<=496)
B(n)=M(k,n-352); %第k个用户的复中缀码。:)
elseif (n>496) & (n<=848)
B(n)=D_2(n-496); %第二部分数据,可以考虑用矩阵D_2表示。
else
B(n)=0; %保护间隔。 :)
end
end
E(k,x+1:x+864+TS_interval)=B; %第k行存放第k个用户TS_num*864个chip。
G(k,z+1:z+data_bit_num)=data; %第k行存放第k个用户TS_num*data_bit_num个data(source)。
clear B data n;
end %一个时隙K个用户循环完毕。
x=x+864+TS_interval; %%下个时隙E存放起始位置下标变量。
z=z+data_bit_num; %%下个时隙G存放起始位置下标变量
end
y1=E(1,:);y2=G(1,:);
clear W;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -