主要内容

带数据链路层的分组调制解调器

这个例子展示了如何使用数据链路层实现一个分组调制解调器[1]使用MATLAB®和通信工具箱™。该调制解调器具有基于分组的物理层和基于aloha的数据链路层。可以模拟系统或使用无线电运行USRP®无线电通信工具箱支持包金宝app

所需硬件和软件

为了模拟系统性能,需要准备以下软件:

要用无线电测量系统性能,您还需要以下硬件:

  • USRP®无线电(B2xx, N2xx或X3xx)

以及以下软件

的“通信工具箱”支持的SDR平台的完整列表,请参阅的“支持的硬件”部分金宝app软件定义无线电(SDR)发现页面

简介

分组无线调制解调器是一种通过无线信道以分组的形式传输信息的通信系统。每个调制解调器,也称为节点,具有一个物理层,其中数据包在共享频段上进行调制、传输和接收,并解调。由于所有节点使用相同的频段,因此需要介质访问控制(MAC)算法来减少由于碰撞(即同时传输)造成的数据包丢失。数据链路层包括MAC子层和逻辑链路控制子层,用于共享同一通道,提供两个节点之间的无差错链路。数据链路层也称为第2层,位于网络层(第3层)和物理层(第1层)之间。

运行示例

示例代码创建了三个打包的调制解调器节点对象,并通过通道对象将它们连接起来。每个节点都可以向其他两个节点发送报文。ACKTimeout在节点判断数据包传输不成功之前的超时时间。ACKTimeout必须大于DATA-ACK交换的往返持续时间,在本例中为0.21秒。该仿真是基于时间的,与数据链路层一起模拟了整个物理层的处理。

设置仿真参数

runDuration = 10;%秒numPayloadBits = 19530;%比特packetarevalrate = 0.2;每秒包数%ackTimeOut = 0.25;% ACK超时时间(秒)maxBackoffTime = 10;% ackTimeOut duration中的最大回退时间mMaxDataRetries = 5;%最大数据重试次数queueSize = 10;数据包中的数据链路层队列大小samplesPerFrame = 2000;%每次迭代处理的样本数Verbose = true;将数据包活动打印到命令行sampleRate = 200e3;

为可重复模拟修复随机数生成种子。

rng (12345)

方法创建分组的调制解调器节点helperPacketizedModemNode对象。

node1 = helperPacketizedModemNode(“地址”, 1...“DestinationList”(2、3),“NumPayloadBits”numPayloadBits,...“PacketArrivalRate”packetArrivalRate,“ACKTimeOut”ackTimeOut,...“MaxBackoffTime”maxBackoffTime,“MaxDataRetries”mMaxDataRetries,...“QueueSize”queueSize,“CarrierDetectorThreshold”1 e-5...“AGCMaxPowerGain”, 65,“SamplesPerFrame”samplesPerFrame,...“详细”详细的,“SampleRate”, sampleRate);node2 = helperPacketizedModemNode(“地址”2,...“DestinationList”3 [1],“NumPayloadBits”numPayloadBits,...“PacketArrivalRate”packetArrivalRate,“ACKTimeOut”ackTimeOut,...“MaxBackoffTime”maxBackoffTime,“MaxDataRetries”mMaxDataRetries,...“QueueSize”queueSize,“CarrierDetectorThreshold”1 e-5...“AGCMaxPowerGain”, 65,“SamplesPerFrame”samplesPerFrame,...“详细”详细的,“SampleRate”, sampleRate);node3 = helperPacketizedModemNode(“地址”3,...“DestinationList”(1 - 2),“NumPayloadBits”numPayloadBits,...“PacketArrivalRate”packetArrivalRate,“ACKTimeOut”ackTimeOut,...“MaxBackoffTime”maxBackoffTime,“MaxDataRetries”mMaxDataRetries,...“QueueSize”queueSize,“CarrierDetectorThreshold”1 e-5...“AGCMaxPowerGain”, 65,“SamplesPerFrame”samplesPerFrame,...“详细”详细的,“SampleRate”, sampleRate);

属性配置传播通道helperMultiUserChannel对象。

通道= helperMultiUserChannel(...“NumNodes”3,“EnableTimingSkew”,真的,“DelayType”,“三角形”,...“TimingError”, 20岁,“EnableFrequencyOffset”,真的,...“PhaseOffset”47岁的“FrequencyOffset”, 2000,“EnableAWGN”,真的,...“EbNo”25岁的“BitsPerSymbol”2,“SamplesPerSymbol”4...“EnableRicianMultipath”,真的,...“PathDelays”[0 node1.SamplesPerSymbol / node1.SampleRate],...“AveragePathGains”(15 0),“KFactor”15岁的“MaximumDopplerShift”10...“SampleRate”, node1.SampleRate);

主仿真回路

radioTime = 0;nodeInfo =信息(node1);frameDuration = node1.SamplesPerFrame/node1.SampleRate;[rcvd1,rcvd2,rcvd3] = deal(complex(0 (node1.SamplesPerFrame,1)));radioTime <运行时间trans1 = node1(rcvd1, radioTime);trans2 = node2(rcvd2, radioTime);trans3 = node3(rcvd3, radioTime);%多用户通道[rcvd1,rcvd2,rcvd3] = channel(trans1,trans2,trans3);%更新无线电时间。radioTime = radioTime + frameDuration;结束
# | | | | |联系时间行动Seq倒扣(节点1 ) ----------------------------------------------------------- | 时间| | |联系行动Seq # |倒扣(节点2 ) ----------------------------------------------------------- | 时间| | |联系行动Seq # |倒扣(节点3 ) ----------------------------------------------------------- | 4.46000秒| 3 - > > 1 |数据| # 0 | | 4.67000 | 1 < < - 3数据| # | 0 | | 4.67000 | 1 - > > 3 | ACK | # 0 | | 4.68000 | 3 < < - 1 | ACK | # 0 | | 5.04000 | 1 - > > 3 |数据| # 0 | | 5.16000 | 2 - > > 1 |数据| # 0 | | 5.30000 | 1 - > > 3 |退出| # 0 | 0.25000 | | 5.42000 | 2 - > > 1 |退出| # 0 | 0.75000 | | 5.56000 | 1 - > > 3 |数据| # 0 | | 5.77000 | 3 < < - 1数据| # | 0 | | 5.77000 | 3 - > > 1 | ACK | # 0 | | 5.78000 | 1 < < - 3 | ACK | # 0 | | 6.18000 | 2 - > > 1 |数据| # 0 | | 6.44000 | 2 - > > 1 |退出| # 0 | 0.25000 | | 6.70000 | 2 - > > 1 |数据| # 0 | | 6.91000 | 1 < < - 2数据| # | 0 | | 6.91000 | 1 - > > 2 | ACK | # 0| | 6.92000 s | 2 <<- 1 | ACK | # 0 | | 9.77000 s | 3 ->> 1 | DATA | # 1 |

结果

分组的调制解调器节点对象用于统计数据链路层算法的性能。调用信息方法来访问这些统计信息。这里显示了包到达速率为0.2包/秒的10秒模拟时间的样例结果。每个数据包长度为200毫秒。

显示统计信息

nodeInfo(1) = info(node1);nodeInfo(2) = info(node2);nodeInfo(3) = info(node3);p = 1:长度(nodeInfo)流(“\ nNode % d: \ n”, p);流(“\ tNumGeneratedPackets: % d \ n”, nodeInfo(p).NumGeneratedPackets)“\ tNumReceivedPackets: % d \ n”, nodeInfo(p).NumReceivedPackets) fprintf(“\ tAverageRetries: % f \ n”, nodeInfo(p).Layer2.AverageRetries)“\ tAverageRoundTripTime: % f \ n”,...nodeInfo (p) .Layer2.AverageRoundTripTime)流(“\ tNumDroppedPackets: % d \ n”,...nodeInfo (p) .Layer2.NumDroppedPackets)流('\tNumDroppedPackets (Max retries): %d\n',...nodeInfo (p) .Layer2.NumDroppedPacketsDueToRetries)流(“\ tThroughput: % d \ n”,...numPayloadBits / nodeInfo(p).Layer2.AverageRoundTripTime)“\ tLatency: % d \ n”nodeInfo (p) .Layer2.AverageLatency)结束
节点1:NumGeneratedPackets: 1 NumReceivedPackets: 2 AverageRetries: 1.000000 AverageRoundTripTime: 0.739961 NumDroppedPackets: 0 NumDroppedPackets (Max retries): 0 Throughput: 2.639329e+04 Latency: 1.959883e+00节点2:NumGeneratedPackets: 1 NumReceivedPackets: 0 AverageRoundTripTime: 1.759844 NumDroppedPackets: 0 NumDroppedPackets (Max retries): 0 Throughput: 1.109758e+04 Latency: 0节点3:NumGeneratedPackets: 2 NumReceivedPackets: 1 AverageRoundTripTime: 0 Throughput: 1.109758e+04 Latency: 0节点3:NumGeneratedPackets: 2 NumReceivedPackets: 1 averageroundtripies:0.000000 AverageRoundTripTime: 0.220039 NumDroppedPackets: 0 NumDroppedPackets (Max retries): 0 Throughput: 8.875697e+04 Latency: 7.299609e-01

数据链路层(第二层)

这个例子实现了一个基于ALOHA随机访问协议的数据链路层[2].ALOHA协议传输和接收数据包的流程如下图所示。

当数据链路层有一个三层数据包要传输时,它会启动一个新的会话,并立即使用Data数据包发送该数据包。算法等待ACK (acknowledgement)报文。如果在超时时间内没有收到ACK,它会随机回退一段时间,重新发送DATA包。如果在多次重试后仍未收到ACK,则丢弃数据包。如果在此会话期间,收到一个新的三层数据包,则将该三层数据包放入先进先出(FIFO)队列。如果FIFO队列已满,则丢弃报文。

该算法在helperPacketizedModemDataLinkLayerhelper系统对象™。的helperPacketizedModemDataLinkLayerSystem对象定义了一个具有三种状态的状态机:IDLE、ACK_WAIT和BACKOFF。下面的状态机描述了数据链路层算法是如何在这个对象中实现的。括号内的语句,[…]],大括号{…},分别是条件和动作。小圆圈是用来表示多个条件的传递状态。

最初的ALOHA协议使用集线器/星形拓扑。上行链路和下行链路使用两个单独的频段。下面的示例采用网状网络拓扑结构,其中节点使用相同的频带发送和接收。

调制解调器的结构

调制解调器代码结构执行以下六个主要处理部分:

  1. 源控制器

  2. 消息生成器

  3. PHY译码器

  4. 数据链路层

  5. 消息解析器

  6. PHY编码器

数据链路层处理消息生成器和PHY解码器的输出,因此它必须在这两个操作之后运行。消息解析器和PHY编码器处理数据链路层的输出。这个序列确保调制解调器可以在相同的时间间隔内接收数据包并对它们作出响应。的helperPacketizedModemNode对象实现调制解调器。

源控制器

源控制器根据用户选择的包到达分布生成使能信号和随机目的地地址。

消息生成器

当源控制器启用Message Generator时,Message Generator开始创建三层数据包。这些数据包包含一个数字化的文本信息。如果消息不适合一个包,生成器将创建多个包。报文结构如下:

  • 地址:8位

  • 从地址:8位

  • 报文号:16位

  • 有效载荷:M位

PHY译码器

PHY解码器接收基带I/Q采样并创建第二层数据包。PHY解码器可以使用AGC校正振幅变化,使用频偏估计器和补偿器校正频率偏移,使用分数间隔决策反馈均衡器(DFE)校正定时倾斜和多路径。物理层(第一层)接收机框图如下:

当数据负载大小设置为19530位时,调制解调器的总数据包长度为39956个样本。调制解调器进程SamplesPerFrame样本,这个例子是2000个样本,每次迭代。一个更小的SamplesPerFrame延迟较小,但增加了调制解调器算法的开销。增加的开销可能会增加处理时间,从而使调制解调器不再实时运行。

数据链路层

数据链路层提供两个相邻节点之间的链路。中描述的基于aloha的协议数据链路层(第二层)部分。数据包结构包含这些字段:

  • 类型:4位

  • 版本:2位

  • 预留:2位

  • 地址:8位

  • 从地址:8位

  • 序号:8位

  • 时间戳:32位

  • 有效负载:N (= M+32)位

数据链路层还收集这些统计信息:

  • 发送成功的报文数,定义为成功接收ACK报文的个数

  • 平均重试

  • 平均往返时间(秒)

  • 由于三层包队列已满而丢弃的包数

  • 由于重试而丢弃的数据包数

  • 吞吐量定义为成功的数据传输速率(单位:比特/秒)

  • 平均延迟时间(以秒为单位)定义为从生成第三层数据包到目的节点接收数据包之间的时间

消息解析器

消息解析器解析接收到的第2层有效负载并创建第3层数据包。消息解析器收集以下统计信息:

  • 接收包数

  • 收到的重复报文数

PHY编码器

PHY编码器通过将二层数据包调制成基带I/Q样本来创建物理层数据包。这里显示了数据包结构。

虚拟符号用于训练AGC和载波检测。同步符号是一个调制pn序列。头文件有这些字段:

  • 有效载荷长度:16位

  • CRC: 16位

该图像显示了物理层(第一层)发射机的框图。

通道模型

本例模拟的是三节点网络,但可以模拟任意数量的节点。每个节点的输出都传递给通道模拟器。在施加这些信道损伤后,信道添加来自所有三个节点的基带信号:

  • 时间倾斜

  • 频率偏移

  • Rician多路径

  • 情况下

除了这些损伤外,对邻近节点的信号施加了20 dB的路径损耗,而直接增加了自干扰。

使用无线电运行

您也可以使用无线电而不是模拟信道来运行这个示例。SDR硬件和运行MATLAB会话的主机的组合包括一个节点。下面的步骤向您展示如何设置一个三节点网络。本例使用USRP®B200和B210无线电。

1)将USRP®无线电连接到主机计算机a,我们将其称为节点1。请按照安装和设置(USRP无线电通信工具箱支持包)金宝app安装和设置您的主机以使用USRP®无线电。启动MATLAB会话。

2)将节点1设置为发射器进行初始化。的helperPacketizedModemInitializeRadio初始化连接的USRP®无线电。运行helperPacketizedModemInitializeRadio('tx',平台,地址,FC, RT),其中PLATFORM是USRP®无线电的类型,ADDRESS是序列号或IP地址,FC是中心频率,RT是以秒为单位的运行时间。本例使用915 MHz作为中心频率。假设您的收音机是序列号为“ABCDE”的B200,则函数调用将为helppacketizedmodeminitializeradio ('tx', 'B200', 'ABCDE', 915e6, 120).此功能将运行发射机120秒。如果需要更多时间来完成初始化,请重新执行该命令,并延长执行时间。

3)对第二台无线电和主机重复步骤1,并将此节点称为节点2。

4)将节点2设置为接收端进行初始化。运行[CDT, MAXGAIN, RXGAIN] = helperPacketizedModemInitializeRadio('rx', PLATFORM, ADDRESS, FC, RT).假设您的收音机是序列号为“12345”的B210,则函数调用将为[CDT1, MAXGAIN1, RXGAIN1] = helperPacketizedModemInitializeRadio('rx', 'B210', '12345', 915e6, 120).函数将一直运行,直到确定载波检测器阈值(CDT)、最大AGC增益(MAXGAIN)和无线电接收增益(RXGAIN)的最佳值,或者直到RT秒结束。如果初始化算法不能确定合适的参数,可以建议增加或减少发射机功率并重新初始化。

5)以节点1为接收端,节点2为发送端,进行同样的实验,确定节点1的最佳接收端参数。在大多数情况下,通道应该是双通道,并且参数将非常接近。

6)重复步骤1-5对所有其他无线电,即节点1和节点3,节点3和节点2。获取每个节点的CDT、MAXGAIN和RXGAIN值。如果在为不同的链路初始化时,为同一个节点获得不同的值,请选择MAXGAIN和RXGAIN的最大值,以及CDT的最小值。

7)启动节点1helperPacketizedModemRadiohelper函数。使用命令helperPacketizedModemRadio (P,风湿性关节炎,NA,哒,FC, CDT, MAXG, RGAIN, D)式中,P为平台,RA为无线电地址,NA为节点地址,DA为目的地址列表,FC为中心频率,CDT为载波检测门限,MAXG为AGC最大增益,RGAIN为无线电接收机增益,D为持续时间。例如,运行为helperPacketizedModemRadio (' B200 ', '中的',1 2 3,915 e6, CDT1, MAXGAIN1, RXGAIN1,120)

8)运行启动节点2helperPacketizedModemRadio (' B210 ', ' 12345 ', 2、3 [1],915 e6, CDT2, MAXGAIN2, RXGAIN2,120)

9)运行启动节点3helperPacketizedModemRadio(‘B200’,‘A1B2C 3 [1 - 2], 915 e6, CDT3, MAXGAIN3, RXGAIN3,120)

10)一旦会话结束,每个节点打印出它的统计信息。

三个网络的设置运行了两个小时。每个节点按照泊松分布以0.2包/秒的速率生成包。节点被放置在大约相等的距离上。其中一个链接有视线,而其他两个没有。以下是在所有三个节点上收集的结果。由于使用USB连接的B2xx无线电的DATA-ACK交换的往返时间可以高达800 msec,网络的平均往返时间大于3秒。该算法最大限度地减少了包丢失,并为所有节点提供了公平的共享通道访问。

节点1:NumGeneratedPackets: 1440 NumReceivedPackets: 1389 AverageRetries: 0.533738 AverageRoundTripTime: 3.725093 NumDroppedPackets: 95 NumDroppedPackets (Max retries): 23 Throughput: 5.242823e+03
节点2:NumGeneratedPackets: 1440 NumReceivedPackets: 1340 AverageRetries: 0.473157 AverageRoundTripTime: 3.290775 NumDroppedPackets: 31 NumDroppedPackets (Max retries): 9 Throughput: 5.934772e+03
节点3:NumGeneratedPackets: 1440 NumReceivedPackets: 1385 AverageRetries: 0.516129 AverageRoundTripTime: 3.558408 NumDroppedPackets: 107 NumDroppedPackets (Max retries): 29 Throughput: 5.488410e+03

讨论

前面部分的模拟代码和helperPacketizedModemRadioHelper函数都利用helperPacketizedModemNode实现调制解调器节点的系统对象。在本例中,相同的代码用于评估一个系统,首先使用模拟信道,然后使用SDR硬件和无线信道。

即使使用模拟通道的代码是基于时间的,调制解调器节点对象也可以用于运行基于事件的模拟。本例没有提供基于事件的模拟内核。

进一步的探索

您可以改变这些参数来调查它们对数据链路层性能的影响:

  • PacketArrivalRate

  • ACKTimeOut

  • MaxBackoffTime

  • MaxDataRetries

  • QueueSize

你也可以探索辅助函数的实现算法的细节:

方法只检查物理层性能PacketizedModemPhysicalLayerTxRxExample脚本。

选定的参考书目

版权声明

通用软件无线电外设®和USRP®是美国国家仪器公司的商标。