⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cdmatuibi.m

📁 给出了简单的点到点CDMA系统的物理层和链路层联合仿真的Matlab程序。程序不长
💻 M
📖 第 1 页 / 共 2 页
字号:
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 + -