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

此示例演示如何使用数据链路层实现分组化调制解调器[1.]使用MATLAB®和通信工具箱™. 调制解调器具有基于分组的物理层和基于ALOHA的数据链路层。您可以使用模拟系统或使用无线电运行USRP®无线电通信工具箱支持包万博1manbetx.

所需的硬件和软件

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

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

  • USRP®无线电(B2xx、Nxxx或X3xx)

和下面的软件

有关支持的SDR平台的全部通信工具箱列表,请参阅支持的硬件部分万博1manbetx软件定义无线电(SDR)发现页面.

介绍

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

运行示例

要运行该示例,请键入PacketizedModemNetworkExample在MATLAB命令窗口中或单击链接。示例代码创建三个打包调制解调器节点对象,并通过通道对象将它们连接起来。每个节点都可以向其他两个节点发送数据包。ACKTimeout确定节点确定数据包传输不成功之前的超时持续时间。ACKTimeout必须大于数据确认交换的往返持续时间,本例为0.21秒。模拟基于时间,与数据链路层一起模拟整个物理层处理。

设定模拟参数运行持续时间=10;%秒numPayloadBits=19530;%位packetArrivalRate = 0.2;%每秒包数acktimeout = 0.25;%ack超时以秒为止maxbackofftime = 10;AckTimeout持续时间的最大退避时间mMaxDataRetries = 5;%最大数据重试次数queuesize = 10;%数据链路层队列大小(以数据包为单位)样本性能框架=2000;每次迭代处理%的样本数量verbose = true;%打印数据包活动到命令行采样率=200e3;%修复了可重复模拟的随机数生成种子rng(12345)%创建分组化调制解调器节点node1 = helperPacketizedModemNode (...“地址”1....“命运论者”(2、3),...“NumPayloadBits”,numPayloadBits,...“包氯胺四乙酸”packetArrivalRate,...'acktimeout',确认超时,...“MaxBackoffTime”,maxbackofftime,...'maxdataretries',mMaxDataRetries,...“队列大小”,队列大小,...'CarrationDetectorthreshold',1e-5,...“AGCMaxPowerGain”65,...'samplesperframe',samplesperframe,...“冗长”详细的,...“采样器”, 采样率);node2 = helperpacketizedmodemnode(...“地址”2....“命运论者”,[1 3],...“NumPayloadBits”,numPayloadBits,...“包氯胺四乙酸”packetArrivalRate,...'acktimeout',确认超时,...“MaxBackoffTime”,maxbackofftime,...'maxdataretries',mMaxDataRetries,...“队列大小”,队列大小,...'CarrationDetectorthreshold',1e-5,...“AGCMaxPowerGain”65,...'samplesperframe',samplesperframe,...“冗长”详细的,...“采样器”,取样器);node3=helperPacketizedModelNode(...“地址”3....“命运论者”, [1 2],...“NumPayloadBits”,numPayloadBits,...“包氯胺四乙酸”packetArrivalRate,...'acktimeout',确认超时,...“MaxBackoffTime”,maxbackofftime,...'maxdataretries',mMaxDataRetries,...“队列大小”,队列大小,...'CarrationDetectorthreshold',1e-5,...“AGCMaxPowerGain”65,...'samplesperframe',samplesperframe,...“冗长”详细的,...“采样器”, 采样率);%设置通道channel=helperMultiUserChannel(...'numnodes'3....“EnableTimingSkew”符合事实的...'delaytype',“三角形”,...'timingError', 20岁,...'EnableFrequencyOffset'符合事实的...“相位偏移”, 47,...“频率偏移”, 2000,...'Enableawgn'符合事实的...“埃布诺”, 25,...'bitspersymbol'2....“SamplesPerSymbol”4....'enableRicianmultipath'符合事实的...'pathdelays',[0 node1.SamplesPerSymbol/node1.SampleRate],...“AveragePathGains”, [15 0],...“KFactor”, 15,...“最大换档速度”10,...“采样器”,node1.samplerate);%主循环ratiotime = 0;nodeInfo = Info(node1);Framedrion = node1.samplesperframe / node1.samplerate;[rcvd1,rcvd2,rcvd3] =交易(复数(零(node1.samplefly,1)));尽管ratiotime %多用户信道[RCVD1,RCVD2,RCVD3] =通道(Trans1,Trans2,Trans3);%更新无线电时间。无线电时间=无线电时间+帧持续时间;结尾
# | | | | |联系时间行动Seq倒扣  ----------------------------------------------------------- | 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 s | 2 - > > 3 |退出| # 0 | 1.00000秒| | 6.31000 | 1 - > > 3 |数据| # 0 | | 6.43000 | 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 s | 2 <<- 3 | ACK | # 0 | | 8.83000 s | 1 ->> 3 | DATA | # 0 | | 9.09000 s | 1 ->> 3 | Back Off | # 0 | 2.25000 s | | 9.52000 s | 3 ->> 2 | DATA | # 1 | | 9.73000 s | 2 <<- 3 | DATA | # 1 | | 9.73000 s | 2 ->> 3 | ACK | # 1 | | 9.74000 s | 3 <<- 2 | ACK | # 1 |

后果

Node对象统计数据链路层算法的性能。调用信息方法来访问这些统计信息。下面显示了10秒模拟时间的样本结果,数据包到达率为0.2包/秒。每个数据包的长度为200毫秒。

%显示统计信息nodeInfo (1) = info (node1);nodeInfo (2) = info (node2);nodeInfo (3) = info (node3);为了p = 1:长度(nodeinfo)fprintf(“\ nNode % d: \ n”,p);fprintf(“\ tNumGeneratedPackets: % d \ n”nodeInfo (p) .NumGeneratedPackets)流(“\ tNumReceivedPackets: % d \ n”,nodeInfo(p).NumReceivedPackets)fprintf(“\t平均重试次数:%f\n”nodeInfo (p) .Layer2.AverageRetries)流(“\t平均oundTripTime:%f\n”nodeInfo (p) .Layer2.AverageRoundTripTime)流('\ tnumdroppedpackets:%d \ n',nodeInfo(p).Layer2.numdroppedpackages)fprintf('\tNumDroppedPackets(最大重试次数):%d\n'nodeInfo (p) .Layer2.NumDroppedPacketsDueToRetries)流(“\t吞吐量:%d\n”,numPayloadBits/nodeInfo(p).Layer2.AverageRoundTripTime)fprintf('\ tlatency:%d \ n',nodeInfo(p).Layer2.平均延迟)结尾
节点1:NumGeneratedPackets:2 NumReceivedPackets:1 AveragerMetries:NaN AveragerRoundTripTime:NaN NumDroppedPackets:0 NumDroppedPackets(最大重试次数):0吞吐量:NaN延迟:Inf节点2:NumReceivedPackets:1 NumReceivedPackets:1 AveragerMetries:2.000000 AveragerRoundTripTime:3.509844 NumDroppedPackets:0 NumDroppedPackets(最大重试次数):0吞吐量:5.564350e+03延迟:2.104687e-01节点3:NumGeneratedPackets:2 NumReceivedPackets:1 AveragerMetries:0.000000 AverageRoundTripTime:0.220254 NumDroppedPackets:0 NumDroppedPackets(最大重试次数):0吞吐量:8.867039e+04延迟:1.749922e+00

数据链路层(第2层)

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

当数据链路层具有要传输的第3层数据包时,它会启动新会话并立即使用数据包发送数据包。该算法等待确认(ACK)数据包。如果在超时期间未接收到ACK,则它会返回随机的时间并再次发送数据包。如果在若干重试后未能接收ACK,则会丢弃数据包。如果在此会话期间,则接收到新的第3层数据包,将第3层分组放在先进先出(FIFO)队列中。如果FIFO队列已满,则删除数据包。

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

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

现代结构

以下介绍调制解调器代码结构。处理分为六个主要部分,并按以下顺序运行:

  1. 源控制器

  2. 消息生成器

  3. 物理层解码器

  4. 数据链路层

  5. 消息分析器

  6. 物理层编码器

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

源控制器

源控制器基于用户选择的分组到达分布生成启用信号和随机目的地地址。

消息生成器

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

  • 地址:8位

  • 来自地址:8位

  • 数据包号:16位

  • 有效载荷:M位

物理层解码器

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

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

数据链路层

数据链路层提供两个相邻节点之间的链路。它采用中描述的基于ALOHA的协议数据链路层(第2层)部分。数据包结构如下:

  • 类型:4位

  • 版本:2位

  • 保留:2位

  • 地址:8位

  • 来自地址:8位

  • 序列号:8位

  • 时间戳:32位

  • 有效载荷:n(= m + 32)位

数据链路层还收集以下统计信息:

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

  • 平均重试次数

  • 平均往返时间(秒)

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

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

  • 吞吐量定义为每秒位数的成功数据交付率

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

消息分析器

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

  • 接收到的数据包数

  • 接收到的重复报文数

物理层编码器

PHY编码器通过将二层包调制到基带I/Q样本中来创建物理层包。数据包结构如下:

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

  • 有效负载长度:16位

  • CRC:16位

物理层(第1层)发射机的框图如下:

通道模型

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

  • 定时歪斜

  • 频偏

  • Rician多径

  • AWGN

除了这些损害,来自邻近节点的信号的路径损失为20 dB,而自干扰是直接增加的。

用收音机跑步

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

1) 将USRP®无线电连接到主机a,我们称之为节点1。按照中的说明操作安装和设置(通信工具箱支持包的USRP无线电)安装和设置您万博1manbetx的主机使用USRP®无线电。开始一个MATLAB会话。

2)将节点1设置为用于初始化的发送器。运行HelperPacketizedModeMinitializerAdio('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] = 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)开始节点1通过运行函数helperPacketizedModemRadio (P,风湿性关节炎,NA,哒,FC, CDT, MAXG, RGAIN, D), P是平台,RA是广播讲话中,NA是节点地址,DA是目的地址列表,FC中心频率,CDT载波检测阈值,MAXG最大AGC增益,RGAIN无线电接收机增益,D是持续时间。例如,运行为helperPacketizedModemRadio('B200', 'ABCDE', 1, [2 3], 915e6, CDT1, MAXGAIN1, RXGAIN1, 120)。

8) 通过运行HelperPacketizedModelRadio('B210','12345',2[13],915e6,CDT2,MAXGAIN2,RXGAIN2,120)启动节点2。

9)通过运行HelperPacketizedModeMradio('B200','A1B2C',3,[1 2],915E6,CDT3,MaxGain3,RxGain3,120)来启动节点3。

10)会话结束后,每个节点输出自己的统计信息。

三个网络的设置运行了两个小时。根据泊松分布,每个节点的包生成速率为0.2包/秒。节点被放置在大约相等的距离。其中一个链接有视线,而另外两个没有。下面是在所有三个节点上收集的结果。往返时间以来DATA-ACK交换使用B2xx无线电连接USB可以高达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 AveragerMetries:0.473157 AverageRoundTripTime:3.290775 NumDroppedPackets:31 NumDroppedPackets(最大重试次数):9吞吐量:5.934772e+03
节点3:NumGeneratedPackets:1440 NumReceivedPackets:1385 AveragerMetries:0.516129 AveragerRoundTripTime:3.558408 NumDroppedPackets:107 NumDroppedPackets(最大重试次数):29吞吐量:5.488410e+03

讨论

来自上一节的仿真代码和HelperPacketizedModelradio.m函数都利用HelperPacketizedModelNode.m系统对象实现调制解调器节点。在当前示例中,相同的代码用于评估系统,首先使用模拟通道,然后使用SDR硬件和超空气通道。

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

进一步的探索

您可以更改以下参数,以调查其对数据链路层性能的影响:

  • 包氯胺四乙酸

  • acktimeout.

  • 最大回退时间

  • maxdatariries

  • 队列大小

您还可以浏览以下函数以了解算法实现的详细信息:

您可以使用使用的物理层检查物理层PacketizedModempPhysicalAllayerTXRXExample脚本。

选定的书目

版权公告

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