📄 cdmatuibi.m
字号:
clear all;
DataLenth=80 % 包长
ConLenth=20; % 控制信息长度
Rs=100000000; % 业务速率100Mbps
Rcontrol=50000000; % 控制速率50Mbps
Code=zeros(12,16); % 码字
Rc=Rs*16; % 扩频后的速率
dt=1/Rc; % 抽样间隔
Nuser=8; % 用户数
Code(1,:)=[1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1];
Code(2,:)=[1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0];
Code(3,:)=[1 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1];
Code(4,:)=[1 1 1 1 0 0 0 0 1 1 1 1 0 0 0 0];
Code(5,:)=[1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1];
Code(6,:)=[1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0];
Code(7,:)=[1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0];
Code(8,:)=[1 0 1 0 1 0 1 0 0 1 0 1 0 1 0 1];
Code(9,:)=[1 1 0 0 1 1 0 0 0 0 1 1 0 0 1 1];
Code(10,:)=[1 0 0 1 1 0 0 1 0 1 1 0 0 1 1 0];
Code(11,:)=[1 0 1 0 0 1 0 1 0 1 0 1 1 0 1 0];
Code(12,:)=[1 0 0 1 0 1 1 0 0 1 1 0 1 0 0 1];
BCode=2*Code-1;
ol=(25000:25000:100000); % 单个节点的到达业务量
nanbula=ol;
Vmax=1; % 发送电压值
xigema2=0*10^(-12); % 噪声功率
xigema=0*10^(-6);
Poccur=dt*nanbula;
RTS=zeros(5,Nuser); % 各个节点所处状态,此状态下剩余的发送接收比特数,通信另一方的编号,
% 本节点天线上的发送电压值,以及发的是0还是1
RTRece=zeros(Nuser,16); % 相关接收所需的一个码元时间段内的16个接收电压值
RTP=10*rand(Nuser,2); % 各个节点的坐标
G=zeros(Nuser,Nuser); % 节点之间的增益
packetg=zeros(1,4); % 到达的包数
packett=zeros(1,4); % 成功传送的包数
Nend=20; % 欲仿真的包数
Ndt=0; % 时间点数
roll=zeros(1,Nuser)+1; % 码字循环变量
error=zeros(1,Nuser);
menxian=4;
datacode=zeros(Nuser,16);
codeuse=1;
NdtNdt=0;
trycount=0;
CWmin=1;
CWmax=8;
backoffmax=3;
slot=dt;
xx=[1,1,1,1];
Timeout=(xx./(ol))/dt; %归一化的最大退避时间
tback=0;
for i=1:Nuser
for j=1:Nuser
G(i,j)=((RTP(i,1)-RTP(j,1))^2+(RTP(i,2)-RTP(j,2))^2)^(-2);
end
end
for j=1:Nuser
G(j,j)=0;
end
for N1=1:4 % 业务量循环
while packetg(1,N1)<Nend % 仿真包数循环
Ndt=Ndt+1;
NdtNdt=NdtNdt+1;
if Ndt==10^3 % 可能生成包的时刻
Ndt=0;
for source=1:Nuser % 终端循环
%pp=1000*rand(1,3);
%if (pp(1)<1)&(pp(2)<1)&(pp(3)<Poccur(N1)*10^9)
pp=rand(1,1); % 依Poccur概率成生包
if (pp<Poccur(N1)*10^3)&(packetg(1,N1)<Nend)
if (RTS(1,source)==0)&(sum(ceil((RTS(1,:)/10)))<4) % 若前一包未处理完,则丢弃
packetg(1,N1)=packetg(1,N1)+1; % 否则进行处理
RTS(1,source)=1; % 置该终端的状态为发送RTS状态(即‘1’)
RTS(2,source)=ConLenth; % 置该终端在该状态下剩余发送比特数为ConLenth
roll(source)=1; % 收发双方的码字循环变量
%roll(desti)=0;
end
end
end
end
for s=1:Nuser % 开始对各个终端进行发送接收处理
if RTS(1,s)>0 % 若为非空闲状态
if RTS(1,s)==1 % 若为发RTS状态
source=s; % 本次循环的发送节点
desti=RTS(3,source); % 本次循环的接收节点
if (RTS(2,source)==ConLenth)&(roll(source)<=1) % 若刚刚进入此状态,则先为此次连接找一个接收节点
desti=ceil(Nuser*rand(1,1)); % 下四行乃为保证收发不为同一节点所做的处理
while (source==desti)
desti=ceil(Nuser*rand(1,1));
end
if RTS(1,des)
RTS(3,desti)=source; % 收端找到发端
RTS(1,desti)=2; % 收端状态为收RTS
RTS(2,desti)=ConLenth; % 收端剩余字节数
RTS(3,source)=desti; % 更新状态,发端找到收端
RTS(5,source)=round(rand(1,1)); % 发端的信息比特
RTS(4,source)=Vmax*(2*RTS(5,source)-1)*BCode(desti,roll(source)); % 发端天线电压值
roll(source)=2; % 收发双方的码字循环变量
roll(desti)=2;
elseif (RTS(2,source)==0)&(roll(source)==1) % 若该状态结束
RTS(1,source)=4; % 则进入等收CTS状态
RTS(2,source)=ConLenth;
RTS(4,source)=0; % 天线停止发电磁波
roll(source)=1; % 收发双方的码字循环变量清零
roll(desti)=1;
else % 普通情况
RTS(4,source)=Vmax*(2*RTS(5,source)-1)*BCode(desti,roll(source)); % 发端天线电压值
if roll(source)==16
roll(source)=1;
roll(desti)=1;
RTS(2,source)=RTS(2,source)-1;
RTS(2,desti)=RTS(2,desti)-1;
%RTS(5,source)=round(rand(1,1)); % 重置发端的信息比特
%RTS(5,source)=round(rand(1,1)); % 发下一比特
else
roll(source)=roll(source)+1; % 准备发下一码字
roll(desti)=roll(desti)+1;
end
end
end
if RTS(1,s)==2 % 若为收RTS状态
desti=s;
source=RTS(3,s);
RTRece(desti,mod(roll(desti)+14,16)+1)=sum(RTS(4,:).*G(desti,:))+xigema*randn(1,1); % 接收端天线电压值
if roll(desti)==1 % 若发完一个比特,则
rece=(sign(sum(RTRece(desti,:).*BCode(desti,:)))+1)/2; % 接收端进行判决
if rece~=RTS(5,source) % 记录误码个数
error(desti)=error(desti)+1;
end
RTRece=0*RTRece;
RTS(5,source)=round(rand(1,1)); % 发下一比特
end
if (RTS(2,desti)==0)&(roll(desti)==1) % 若该状态结束
if error(desti)>menxian % 若误码率过高,则此次通信失败
RTS(:,source)=0*RTS(:,source);
RTS(:,desti)=0*RTS(:,source);
else % 否则继续,并重置状态标志
RTS(1,source)=4;
RTS(1,desti)=3;
RTS(2,source)=ConLenth;
RTS(2,desti)=ConLenth;
RTS(4,source)=0;
RTS(4,desti)=0;
RTS(5,source)=0;
RTS(5,desti)=0;
roll(source)=1; % 收发双方的码字循环变量清零
roll(desti)=1;
end
error(desti)=0;
RTRece=0*RTRece;
end
end
if RTS(1,s)==3 % 若为发CTS状态
source=s; % 本次循环的发送节点
desti=RTS(3,source); % 本次循环的接收节点
if (RTS(2,source)==0)&(roll(source)==1) % 若该状态结束
RTS(1,source)=6; % 则进入等收数据状态
RTS(2,source)=DataLenth;
RTS(4,source)=0; % 天线停止发电磁波
roll(source)=1; % 收发双方的码字循环变量清零
roll(desti)=1;
else % 普通情况
%RTS(5,source)=round(rand(1,1)); % 发端的信息比特
RTS(4,source)=Vmax*(2*RTS(5,source)-1)*BCode(desti,roll(source)); % 发端天线电压值
if roll(source)==16
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -