主要内容

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

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

所需硬件和软件

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

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

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

以及以下软件

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

介绍

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

运行示例

示例代码创建了三个分组调制解调器节点对象,并通过一个通道对象将它们连接起来。每个节点可以向其他两个节点发送数据包。确认超时确定节点确定数据包传输未成功之前的超时持续时间。确认超时必须大于数据确认交换的往返持续时间,本例为0.21秒。模拟基于时间,与数据链路层一起模拟整个物理层处理。

设置仿真参数

runDuration = 10;%秒numPayloadBits = 19530;%比特packetArrivalRate = 0.2;%每秒包数确认超时=0.25;%确认超时(秒)maxBackoffTime=10;%确认超时持续时间内的最大退避时间mMaxDataRetries = 5;%最大重试次数队列大小=10;%数据链路层队列大小(以数据包为单位)样本性能框架=2000;%每次迭代处理的样本数冗长=真实;%将数据包活动打印到命令行采样率=200e3;

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

rng (12345)

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

node1 = helperPacketizedModemNode (“地址”1....“DestinationList”(2、3),“NumPayloadBits”numPayloadBits,...“PacketArrivalRate”packetArrivalRate,“确认超时”,确认超时,...“MaxBackoffTime”maxBackoffTime,“MaxDataRetries”,mMaxDataRetries,...“队列大小”queueSize,“CarrierDetector阈值”1 e-5...“AGCMaxPowerGain”, 65,“样品性能框架”,样本性能框架,...“冗长”冗长的“采样器”,取样器);node2=HelperPacketizedModelNode(“地址”2....“DestinationList”3 [1],“NumPayloadBits”numPayloadBits,...“PacketArrivalRate”packetArrivalRate,“确认超时”,确认超时,...“MaxBackoffTime”maxBackoffTime,“MaxDataRetries”,mMaxDataRetries,...“队列大小”queueSize,“CarrierDetector阈值”1 e-5...“AGCMaxPowerGain”, 65,“样品性能框架”,样本性能框架,...“冗长”冗长的“采样器”, sampleRate);node3 = helperPacketizedModemNode (“地址”3....“DestinationList”(1 - 2),“NumPayloadBits”numPayloadBits,...“PacketArrivalRate”packetArrivalRate,“确认超时”,确认超时,...“MaxBackoffTime”maxBackoffTime,“MaxDataRetries”,mMaxDataRetries,...“队列大小”queueSize,“CarrierDetector阈值”1 e-5...“AGCMaxPowerGain”, 65,“样品性能框架”,样本性能框架,...“冗长”冗长的“采样器”, sampleRate);

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

channel=helperMultiUserChannel(...“珠心”3.“EnableTimingSkew”,真的,“延迟类型”“三角形”...“Timingeror”, 20岁,“启用频率偏移”,真的,...“PhaseOffset”47岁的“FrequencyOffset”,2000,“使能工作组”,真的,...“EbNo”,25,“BitsPerSymbol”2.“SamplesPerSymbol”,4,...“启用多路径”,真的,...“路径延迟”[0 node1.SamplesPerSymbol / node1.SampleRate],...“AveragePathGains”,[15 0],“KFactor”,15,“MaximumDopplerShift”10...“采样器”, node1.SampleRate);

主模拟回路

无线电时间=0;节点信息=信息(节点1);frameDuration=node1.SamplesPerFrame/node1.SampleRate;[rcvd1,rcvd2,rcvd3]=交易(复杂(零(node1.sampleperframe,1));虽然radioTime%多用户信道[rcvd1,rcvd2,rcvd3]=通道(trans1,trans2,trans3);%更新广播时间。radioTime = radioTime + frameeduration;终止
# | | | | |联系时间行动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 - > > 3 |数据| # 0 | | 5.30000 | 1 - > > 3 |退出| # 0 | 1.00000 | | 5.42000 | 2 - > > 3 |退出| # 0 | 1.00000 | | 6.31000 | 1 - > > 3 |数据| # 0 | |6.43000 s | 2 - > > 3 |数据| # 0 | | 6.57000 | 1 - > > 3 |退出| # 0 | 2.25000秒| | 6.69000 | 2 - > > 3 |退出| # 0 | 1.75000秒| | 8.45000 | 2 - > > 3 |数据| # 0 | | 8.66000 | 3 < < - 2数据| # | 0 | | 8.66000 | 3 - > > 2 | ACK | # 0 | | 8.67000 | 2 < < - 3 | ACK | # 0 | | 8.83000 | 1 - > > 3 |数据| # 0 | | 9.09000 | 1 - > > 3 |后退| # 0 | 2.25000秒| | 9.52000 | 3 - > > 2 |数据| 1 | | 9.73000 | 2 < < - 3 |数据| 1 | | 9.73000 | 2 - > > 3 | ACK | 1 | | 9.74000 | < < 3 - 2 | | # 1 |消

后果

分组化的调制解调器节点对象收集数据链路层算法性能的统计信息信息节点对象访问这些统计信息的方法。此处显示10秒模拟时间的样本结果,数据包到达率为0.2个数据包/秒。每个数据包的长度为200毫秒。

显示统计数据

节点信息(1)=信息(节点1);节点信息(2)=信息(节点2);节点信息(3)=信息(节点3);对于p=1:长度(节点信息)fprintf(“\ nNode % d: \ n”, p);流(“\t UMGeneratedPackets:%d\n”nodeInfo (p) .NumGeneratedPackets)流(“\ tNumReceivedPackets: % d \ n”nodeInfo (p) .NumReceivedPackets)流(“\t平均重试次数:%f\n”,nodeInfo(p).Layer2.AverageRetries)fprintf(“\ tAverageRoundTripTime: % f \ n”...nodeInfo (p) .Layer2.AverageRoundTripTime)流(“\tNumDroppedPackets:%d\n”...nodeInfo (p) .Layer2.NumDroppedPackets)流('\tNumDroppedPackets(最大重试次数):%d\n'...nodeInfo (p) .Layer2.NumDroppedPacketsDueToRetries)流(“\ tThroughput: % d \ n”...numPayloadBits/nodeInfo(p).Layer2.AverageRoundTripTime)fprintf(“\t有效期:%d\n”nodeInfo (p) .Layer2.AverageLatency)终止
节点1:NumGeneratedPackets: 2 NumReceivedPackets: 1 AverageRetries:南AverageRoundTripTime:南NumDroppedPackets: 0 NumDroppedPackets (Max重试):0吞吐量:南延迟:正节点2:NumGeneratedPackets: 1 NumReceivedPackets: 1 AverageRetries: 2.000000 AverageRoundTripTime: 3.509844 NumDroppedPackets: 0 NumDroppedPackets (Max重试):0 Throughput: 5.564350e+03 Latency: 2.104687e-01 Node 3: NumGeneratedPackets: 2 NumReceivedPackets: 1 AverageRetries: 0.000000 AverageRoundTripTime: 0.220254 NumDroppedPackets: 0 NumDroppedPackets (Max retries): 0 Throughput: 8.867039e+04 Latency: 1.749922e+00

数据链路层(第二层)

本例实现了基于ALOHA随机访问协议的数据链路层[2].下面的流程图展示了ALOHA协议是如何传输和接收数据包的。

当数据链路层有一个第三层包要传输时,它开始一个新的会话,并立即使用一个数据包发送该包。该算法等待一个确认(ACK)包。如果在超时时间之前没有收到ACK,它将返回一个随机的时间量,并再次发送数据包。如果在多次重试后仍未收到ACK,则丢弃该包。如果在此会话期间,收到一个新的三层包,三层包被放入先进先出(FIFO)队列。如果FIFO队列已满,数据包将被丢弃。

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

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

现代结构

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

  1. 源控制器

  2. 消息生成器

  3. 物理层解码器

  4. 数据链路层

  5. 消息解析器

  6. PHY编码器

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

源控制器

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

消息生成器

当源控制器启用时,消息生成器开始创建第三层数据包。这些信息包包含一个数字化的文本信息。如果消息不能放入一个包中,生成器会创建多个包。报文结构如下:

  • To Address: 8位

  • 起始地址:8位

  • 数据包编号:16位

  • 有效载荷:M比特

物理层解码器

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

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

数据链路层

数据链路层提供两个相邻节点之间的链路。它采用了基于aloha的协议数据链路层(第二层)数据包结构包含以下字段:

  • 类型:4位

  • 版本:2位

  • 保留:2位

  • To Address: 8位

  • 起始地址:8位

  • 序列号:8位

  • 时间戳:32位

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

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

  • 成功数据包传输数,定义为成功接收的ACK数据包数

  • 平均重试次数

  • 平均往返时间以秒为单位

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

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

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

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

消息解析器

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

  • 接收到的数据包数

  • 接收到的重复报文数

PHY编码器

PHY编码器通过将第2层包调制成基带I/Q样本来创建物理层包。包结构如图所示。

虚拟符号用于训练AGC和载波检测。同步符号是调制的PN序列。报头具有以下字段:

  • 有效负载长度:16位

  • CRC:16位

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

渠道模型

这个例子模拟了三个节点的网络,但是可以模拟任意数量的节点。每个节点的输出被传递到信道模拟器。在施加这些信道障碍之后,信道添加来自所有三个节点的基带信号:

  • 定时偏差

  • 频率偏移

  • Rician多路径

  • AWGN

除了这些损伤之外,来自相邻节点的信号被施加20 dB的路径损耗,而自干扰被直接添加。

运行使用收音机

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

1)将USRP®无线电连接到主机a,我们称之为节点1。按照安装和设置(USRP无线电通讯工具箱支援包)金宝app安装和设置您的主机与USRP®收音机使用。开始一个MATLAB会话。

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

3) 对另一台收音机和主机重复步骤1,并调用此节点2。

4) 将节点2设置为用于初始化的接收器。跑[CDT,MAXGAIN,RXGAIN]=HelperPacketizedModeminializeRadio('rx',平台,地址,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、RA、NA、DA、FC、CDT、MAXG、RGAIN、D)式中,P为平台,RA为无线电地址,NA为节点地址,DA为目的地址列表,FC为中心频率,CDT为载波检测阈值,MAXG为最大AGC增益,RGAIN为无线电接收机增益,D为持续时间。例如,运行ashelperPacketizedModemRadio (' 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个数据包/秒的速率生成数据包。这些节点放置的距离大致相等。其中一个链路有视线,而其他两个没有。以下是在所有三个节点上收集的结果。由于DAT的往返时间使用通过USB连接的B2xx无线电的A-ACK交换可高达800毫秒,网络的平均往返时间大于3秒。该算法将数据包丢失降至最低,并为所有节点提供对共享信道的公平访问。

节点1:NumGeneratedPackets:1440 NumReceivedPackets:1389 AveragerMetries:0.533738 AveragerRoundTripTime:3.725093 NumDroppedPackets:95 NumDroppedPackets(最大重试次数):23吞吐量: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 AveragerMetries:0.516129 AveragerRoundTripTime:3.558408 NumDroppedPackets:107 NumDroppedPackets(最大重试次数):29吞吐量:5.488410e+03

讨论

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

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

进一步的探索

您可以更改这些参数,以研究它们对数据链路层性能的影响:

  • PacketArrivalRate

  • 确认超时

  • MaxBackoffTime

  • MaxDataRetries

  • 队列大小

你也可以通过helper函数了解算法的实现细节:

您可以使用PacketizedModempPhysicalAllayerTXRXExample脚本。

精选书目

版权公告

Universal Software Radio Peripheral®和USRP®是National Instruments®Corp.的商标。