主要内容

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

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

所需硬件和软件

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

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

  • USRP®无线电(B2XX,N2XX或X3xx)

和以下软件

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

介绍

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

运行这个例子

示例代码创建三个分组调制解调器节点对象,并通过频道对象连接它们。每个节点都可以将数据包发送到其他两个节点。acktimeout.确定节点决定数据包传输不成功的超时持续时间。acktimeout.必须大于DATA-ACK交换的往返时间,在本例中为0.21秒。该仿真是基于时间的,并与数据链路层一起模拟全物理层处理。

设置仿真参数

runduration = 10;%秒numpayloadbits = 19530;%位packetarrialrate = 0.2;每秒%包acktimeout = 0.25;%ack超时以秒为止maxbackofftime = 10;AckTimeout持续时间的最大退避时间mMaxDataRetries = 5;%最大数据重试queuesize = 10;%数据包中的数据链路层队列大小samplesPerFrame = 2000;每次迭代处理%的样本数量verbose = true;%打印数据包活动到命令行sampleRate = 200年e3;

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

RNG(12345)

通过使用使用该分组的调制解调器节点helperPacketizedModemNode目的。

node1 = helperpacketizedmodemnode('地址',1,...'destinylist',[2,3],'numpayloadbits',numpayloadbits,...'packetarrialrate',packetarrialrate,'acktimeout',acktimeout,...'maxbackofftime',maxbackofftime,'maxdataretries',mmaxdatariries,...“QueueSize”queueSize,'CarrationDetectorthreshold',1e-5,...'agcmaxpowergain'65,'samplesperframe'samplesPerFrame,...“详细”详细的,“SampleRate”,采样率);node2 = helperpacketizedmodemnode('地址',2,...'destinylist'3 [1],'numpayloadbits',numpayloadbits,...'packetarrialrate',packetarrialrate,'acktimeout',acktimeout,...'maxbackofftime',maxbackofftime,'maxdataretries',mmaxdatariries,...“QueueSize”queueSize,'CarrationDetectorthreshold',1e-5,...'agcmaxpowergain'65,'samplesperframe'samplesPerFrame,...“详细”详细的,“SampleRate”,采样率);node3 = helperpacketizedmodemnode('地址'3,...'destinylist'(1 - 2),'numpayloadbits',numpayloadbits,...'packetarrialrate',packetarrialrate,'acktimeout',acktimeout,...'maxbackofftime',maxbackofftime,'maxdataretries',mmaxdatariries,...“QueueSize”queueSize,'CarrationDetectorthreshold',1e-5,...'agcmaxpowergain'65,'samplesperframe'samplesPerFrame,...“详细”详细的,“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.samplevere],...“AveragePathGains”,[15 0],'kfactor'15岁的'MaximumDopplersHift'10,...“SampleRate”,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);%更新无线电时间。ratiotime = ratiotime +框架;结尾
|时间|链接|行动|SEQ#|退避(节点1)------------------------------------------------------- |时间|链接|行动|SEQ#| Backoff (Node 2) ----------------------------------------------------------- | Time | Link | Action | Seq # | Backoff (Node 3) ----------------------------------------------------------- | 4.46000 s | 3 ->> 1 | DATA | # 0 | | 4.67000 s | 1 <<- 3 | DATA | # 0 | | 4.67000 s | 1 ->> 3 | ACK | # 0 | | 4.68000 s | 3 <<- 1 | ACK | # 0 | | 5.04000 s | 1 ->> 3 | DATA | # 0 | | 5.16000 s | 2 ->> 3 | DATA | # 0 | | 5.30000 s | 1 ->> 3 | Back Off | # 0 | 1.00000 s | | 5.42000 s | 2 ->> 3 | Back Off | # 0 | 1.00000 s | | 6.31000 s | 1 ->> 3 | DATA | # 0 | | 6.43000 s | 2 ->> 3 | DATA | # 0 | | 6.57000 s | 1 ->> 3 | Back Off | # 0 | 2.25000 s | | 6.69000 s | 2 ->> 3 | Back Off | # 0 | 1.75000 s | | 8.45000 s | 2 ->> 3 | DATA | # 0 | | 8.66000 s | 3 <<- 2 | DATA | # 0 | | 8.66000 s | 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 |

结果

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

显示统计信息

nodeInfo(1)=信息(node1);nodeInfo(2)=信息(node2);nodeInfo(3)=信息(node3);为了p = 1:长度(nodeinfo)fprintf('\ nnode%d:\ n', p);流('\ tnumgeneratedPackets:%d \ n',nodeinfo(p).numgeneratedpackets)fprintf('\ tnumreceivedpackets:%d \ n',nodeinfo(p).numreceivedpackets)fprintf(“\ tAverageRetries: % f \ n”,nodeinfo(p).layer2.averageretries)fprintf('\ taverageroundriptime:%f \ n'...nodeinfo(p).layer2.averageroundtriptime)fprintf('\ tnumdroppedpackets:%d \ n'...nodeInfo (p) .Layer2.NumDroppedPackets)流('\ tnumdroppedpackets(最大重试):%d \ n'...nodeinfo(p).layer2.numdroppedpacketsduetoretries)fprintf('\ tthrouguppul:%d \ n'...numpayloadbits / nodeinfo(p).layer2.averageroundtriptime)fprintf('\ tlatency:%d \ n',nodeinfo(p).layer2.averagelatency)结尾
Node 1:NumGenerationPackets:2 NumreCeivedPackets:1 AverageRivePackets:NumDroppedPackets:0 NumDroppedPackets:0 NumDroppedPackets:0吞吐量:NUN延迟:INF节点2:NumGenerationPackets:1 NumReceivedPackets:1 NumreCeivedPackets:1个AverageRive:2.000000 AverageRoundTriptime:0 NumDroppedPacket(最大重试):0吞吐量:5.564350E + 03延迟:2.104687E-01节点3:NumGenerationPackets:2 NumreceivedPackets:1 AsverageRive:0.000000 AverageRoundFrakets:0 NumDroppedPackets:0 NumDroppedPackets(Max Retries):0吞吐量:8.867039E + 04延迟:1.749922E + 00

数据链路层(第二层)

此示例基于Aloha随机接入协议实现数据链路层[2]。以下流程图显示了Aloha协议如何发送和接收数据分组。

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

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

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

调制解调器的结构

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

  1. 源控制器

  2. 消息生成器

  3. PHY译码器

  4. 数据链路层

  5. 消息解析器

  6. PHY编码器

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

源控制器

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

消息生成器

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

  • 解决:8位

  • 来自地址:8位

  • 数据包号:16位

  • 有效载荷:m位

PHY译码器

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

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

数据链路层

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

  • 类型:4位

  • 版本:2位

  • 保留:2位

  • 解决:8位

  • 来自地址:8位

  • 序号:8位

  • 时间戳:32位

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

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

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

  • 平均重试

  • 平均往返时间在几秒钟内

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

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

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

  • 平均延迟时间(秒)定义为从第三层数据包产生到目标节点接收到该数据包的时间

消息解析器

消息解析器解析所接收的第2层有效载荷并创建第3层数据包。消息解析器收集这些统计信息:

  • 接收报文数

  • 接收重复数据包的数量

PHY编码器

PHY编码器通过将第2层分组调制到基带I / Q样本来创建物理层分组。这里示出了分组结构。

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

  • 有效负载长度:16位

  • CRC:16位

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

频道模型

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

  • 定时歪斜

  • 频率偏移

  • 瑞典多径

  • 情况下

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

使用无线电运行

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

1)将USRP®收音机连接到主机A,我们将调用节点1.按照指令安装和设置(USRP收音机的通信工具箱支持包)万博1manbetx安装和设置主计算机以进行USRP®无线电。启动matlab会话。

2)将节点1设置为用于初始化的发送器。这HelperPacketizedModeminitializeradio.初始化连接的USRP®无线电。跑helperPacketizedModemInitializeRadio('tx',平台,地址,FC, RT),其中平台是USRP®收音机的类型,地址是序列号或IP地址,FC是中心频率,RT在几秒钟内运行时间。此示例使用915 MHz进行中心频率。假设您的电台是B200具有序列号的“ABCDE”,函数调用将是HelperPacketizedModeminitializeradio('TX','B200','ABCDE',915E6,120)。此功能将运行发送器120秒。如果您需要更多的时间来完成初始化,则重新运行更长的运行时间。

3)对第二无线电和主计算机重复步骤1并呼叫该节点节点2。

4)将节点2设置为接收器以进行初始化。跑[CDT, MAXGAIN, RXGAIN] = helperPacketizedModemInitializeRadio('rx',平台,地址,FC, RT)。假设您的收音机是一个带序列号'12345'的B210,函数调用将是[CDT1,Maxgain1,Rxgain1] = HelperPacketizedModeminitializerAdio('RX','B210','12345',915E6,120)。该功能将运行,直到确定载波检测器阈值(CDT)的最佳值,最大AGC增益(Maxgain)和无线电接收增益(Rxgain)或直到RT秒。如果初始化算法无法确定合适的参数,则可能建议增加或减少发射机功率并重试初始化。

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

6)对所有其他RATIO的步骤1-5重复步骤1-5,即节点1和节点3,节点3和节点2.获得每个节点的CDT,MAXGAIN和RXGAIN值。如果在初始化不同链接的同时获得相同节点的不同值,请为MaxGain和Rxgain的最大值,以及CDT的最小值。

7)通过运行启动节点1helperPacketizedModemRadio帮手功能。使用命令HelperPacketizedModemradio(P,RA,NA,DA,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)通过运行启动节点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包/秒。节点被放置在大约相等的距离。其中一个链接有视线,而另外两个没有。以下是在所有三个节点上收集的结果。往返时间以来DATA-ACK交换使用B2xx无线电连接USB可以高达800毫秒,网络的平均往返时间大于3秒。该算法最小化包丢失和提供一个公平的访问向所有节点共享信道。

节点1:NumGeneratedPackets: 1440 NumReceivedPackets: 1389 AverageRetries: 0.533738 AverageRoundTripTime: 3.725093 NumDroppedPackets: 95 NumDroppedPackets (Max retries): 23 Throughput: 5.242823e+03
节点2:NumGenerationPackets:1440 NumreceivedPackets:1340 AsveragerEtries:0.473157 AveragerRoundFraptime:31 NumDroppedPackets:31 NumDroppedPackets(最大重试):9吞吐量:5.934772E + 03
节点3:NumGeneratedPackets: 1440 NumReceivedPackets: 1385 AverageRetries: 0.516129 AverageRoundTripTime: 3.558408 NumDroppedPackets: 107 NumDroppedPackets (Max retries): 29 Throughput: 5.488410e+03

讨论

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

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

进一步的探索

你可以改变这些参数来研究它们对数据链路层性能的影响:

  • PacketArrivalRate

  • acktimeout.

  • maxbackofftime.

  • maxdatariries

  • QueueSize

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

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

选定的书目

版权声明

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