通过调制解调器与数据链路层
这个例子向您展示了如何实现一个通过调制解调器与数据链路层(1使用MATLAB®和通信工具箱™)。现代功能分组物理层和一个ALOHA-based数据链路层。你可以模拟系统和无线电使用或运行通信工具箱支持包USRP®收音机万博1manbetx。
所需的硬件和软件
模拟系统的性能,您需要以下软件:
用收音机来衡量系统的性能,你还需要以下硬件:
USRP®收音机(B2xx N2xx,或X3xx)
和下面的软件
通信工具箱支持SDR平台的完整列表,请参阅硬件部分的支持万博1manbetx软件定义无线电(SDR)发现页面。
介绍
通过无线调制解调器通信系统传输信息的爆炸被称为数据包通过无线通道。每一个调制解调器,也称为节点,一个数据包的物理层调制特性,共享频带上传输和接收和解调。因为相同的频带使用所有节点,需要介质访问控制(MAC)算法来减少丢包由于碰撞(即同步传输)。数据链路层包括一个MAC子层和逻辑链路控制子层共享相同的频道,提供了一个无错的两个节点之间的联系。数据链路层也称为层2和位于网络层(第三层)和物理层(第一层)。
运行示例
示例代码创建三个通过调制解调器节点对象并将它们通过一个通道对象。每个节点可以发送数据包到另两个节点。ACKTimeout
决定了超时时间节点之前决定数据包的传输不成功。ACKTimeout
必须大于DATA-ACK交换的往返时间,对于这个例子是0.21秒。仿真是基于时间和模拟完整的物理层与数据链路层处理。
设置仿真参数
runDuration = 10;%秒numPayloadBits = 19530;%比特packetArrivalRate = 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…“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 = info (node1);frameDuration = node1.SamplesPerFrame / node1.SampleRate;[rcvd1, rcvd2 rcvd3] =交易(复杂(0 (node1.SamplesPerFrame, 1)));而radioTime < runDuration trans1 = node1 (rcvd1 radioTime);trans2 = node2 (rcvd2 radioTime);trans3 = node3 (rcvd3 radioTime);%多用户信道[rcvd1, rcvd2 rcvd3] =通道(trans1、trans2 trans3);%更新广播时间。radioTime = radioTime + frameDuration;结束
# | | | | |联系时间行动Seq倒扣(节点1)- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | | | |联系时间行动Seq # |倒扣(节点2)- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | | | |联系时间行动Seq # |倒扣(节点3)- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | 4.46000 | 1 | 3 - > >数据| # 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 s 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 | 2 < < - 3 | ACK | # 0 | | 8.83000 | 1 - > > 3 |数据| # 0 | | 9.09000 | 1 - > > 3 |退出| # 0 | 2.25000秒| | 9.52000 s 3 - > > | 2 |数据| # 1 | | 9.73000 | 2 < < - 3 |数据| 1 | | 9.73000 | 2 - > > 3 | ACK | 1 | | 9.74000 | < < 3 - 2 | | # 1 |消
结果
通过调制解调器节点对象收集统计数据链路层算法的性能。调用信息
节点对象的方法来访问这些数据。样本结果10秒模拟时间的数据包到达率0.2包/秒。每一个数据包都长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)流(“\ tAverageRetries: % f \ n”nodeInfo (p) .Layer2.AverageRetries)流(“\ tAverageRoundTripTime: % f \ n”,…nodeInfo (p) .Layer2.AverageRoundTripTime)流(“\ tNumDroppedPackets: % d \ n”,…nodeInfo (p) .Layer2.NumDroppedPackets)流(“\ tNumDroppedPackets (Max重试):% d \ n ',…nodeInfo (p) .Layer2.NumDroppedPacketsDueToRetries)流(“\ tThroughput: % d \ n”,…numPayloadBits / nodeInfo (p) .Layer2.AverageRoundTripTime)流(“\ tLatency: % 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吞吐量:5.564350 e + 03延迟:2.104687 e-01节点3:NumGeneratedPackets: 2 NumReceivedPackets: 1 AverageRetries: 0.000000 AverageRoundTripTime: 0.220254 NumDroppedPackets: 0 NumDroppedPackets (Max重试):0吞吐量:8.867039 e + 04延迟:1.749922 e + 00
数据链路层(第二层)
这个例子实现了一个基于ALOHA随机存取数据链路层协议(2]。下面的流程图显示了ALOHA协议发送和接收数据包。
当数据链路层一层3包传输,它开始一个新的会话并发送数据包马上使用数据包。该算法等待一个确认(ACK)包。如果没有收到ACK之前超时周期,它支持一个随机的时间,再次发送数据包。如果不能收到ACK后重试,它滴包。如果在这次会议期间,一个新的第三层接收到数据包,第三层包放在先进先出(FIFO)队列。如果FIFO队列已满,就将数据包丢弃。
该算法的实现helperPacketizedModemDataLinkLayer辅助系统对象™。的helperPacketizedModemDataLinkLayer
系统对象定义了一个状态机有三种状态:空闲,ACK_WAIT,倒扣。以下状态机描述了数据链路层算法如何在这个对象中实现。语句在括号中,[…),和花括号{…},分别和操作条件。小圈是透传国家用于表示多个条件。
最初的ALOHA协议使用中心/明星拓扑。上行和下行利用两个独立的频带。下面的示例使用一个网状网络拓扑节点使用相同的频带传输和接收。
调制解调器的结构
现代代码结构执行这六个主要处理部分:
源控制器
消息生成器
PHY译码器
数据链路层
消息解析器
PHY编码器
消息的数据链路层过程输出发电机层和物理层解码器,所以它必须运行在这两个操作。消息解析器层和物理层编码器输出数据链路层的过程。这个序列可以确保调制解调器可以接收数据包和应对他们在相同的时间间隔。的helperPacketizedModemNode对象实现了调制解调器。
源控制器
源控制器生成一个启动信号和随机根据用户选择的数据包到达目的地址分布。
消息生成器
消息生成器创建第三层开始启用时,数据包源控制器。包包含一个数字化的文本消息。如果消息不符合一个数据包,生成器创建多个数据包。包的结构如下:
地址:8位
从地址:8位
包数:16位
有效载荷:M比特
PHY译码器
PHY解码器接收基带I / Q样本并创建层2包。PHY译码器可以正确使用AGC,振幅变化频率与频率偏移估计和补偿器补偿,和时间的倾斜和多路径使用略微间隔判决反馈均衡器(DFE)。物理层的框图(图层1)接收方如下:
当数据有效载荷大小设置为19530比特,现代的总包长度是39956个样本。现代过程SamplesPerFrame
样品,2000个样本在这个例子中,在每一个迭代。一个更小的SamplesPerFrame
结果在较小的延迟但增加现代算法的开销。增加的开销可能会增加处理时间,实时调制解调器不运行了。
数据链路层
数据链路层提供了两个相邻节点之间的联系。它雇佣ALOHA-based协议中描述数据链路层(第二层)部分。包结构包含这些字段:
类型:4位
版本:2位
保留:2位
地址:8位
从地址:8位
序号:8位
时间戳:32位
有效载荷:N (= M + 32)
数据链路层也收集这些数据:
许多成功的数据包传输,这被定义为成功收到ACK数据包的数量
平均重试
平均往返时间以秒为单位
丢失的数据包数量由于第三层数据包队列满的
丢失的数据包数量将重试
吞吐量定义为成功的数据交付率位每秒
平均延迟秒之间的时间定义为第三层数据包的生成和接受它的目的地节点
消息解析器
消息解析器解析接收到的层2负载并创建层3包。消息解析器收集这些数据:
收到的数据包数量
收到重复的数据包的数量
PHY编码器
PHY编码器创建物理层包通过调制层2包到基带I / Q样本。这里显示的包结构。
虚拟的符号用于火车AGC和载波检测。同步是一个调制PN-sequence象征。头有这些字段:
有效载荷长度:16位
CRC: 16位
这张图片显示了物理层的框图(图层1)发射机。
通道模型
这个例子模拟由三节点组成的网络,但可以模拟任意数量的节点。每个节点的输出传递给信道模拟器。通道添加了基带信号从所有三个节点实施后,这些通道障碍:
时间倾斜
频率偏移
Rician多路径
情况下
除了这些障碍,从邻近节点的信号应用20 dB的路径损耗,而自干扰直接添加。
运行使用收音机
您也可以运行这个例子使用收音机来代替一个模拟通道。特别提款权的组合硬件和运行的主机MATLAB会话包含一个节点。下面的步骤向您展示如何设置由三节点组成的网络。这个示例使用USRP®B200和B210收音机。
1)连接USRP®广播主机一个,我们将调用节点1。遵循的指令安装和设置(USRP无线电通信工具箱支持包)万博1manbetx安装和设置你的主机使用USRP®收音机。启动一个MATLAB会话。
2)建立节点1作为初始化的发射机。的helperPacketizedModemInitializeRadio初始化连接USRP®收音机。运行helperPacketizedModemInitializeRadio (tx,平台、地址、FC, RT)
,平台的类型USRP®广播地址是序列号或IP地址,FC的中心频率,RT是运行时在几秒钟内。这个示例使用中心频率915 MHz。假设你的收音机是B200序列号“中的”,函数调用helperPacketizedModemInitializeRadio (tx”、“B200 ', '中的',915 e6, 120)
。这个函数将运行的发射机120秒。如果你需要更多的时间来完成初始化,重新运行命令有更长的运行时间。
3)重复步骤1电台和第二个主机和调用该节点节点2。
4)建立节点2作为初始化的接收机。运行[CDT, MAXGAIN RXGAIN] = helperPacketizedModemInitializeRadio(“处方”,平台、地址、FC、RT)
。假设你的收音机是B210编号“12345”,函数调用[CDT1, MAXGAIN1 RXGAIN1] = helperPacketizedModemInitializeRadio(“处方”,“B210”,“12345”, 915 e6, 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通过运行helperPacketizedModemRadiohelper函数。使用命令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)开始节点2通过运行helperPacketizedModemRadio (' B210 ', ' 12345 ', 2、3 [1], 915 e6, CDT2, MAXGAIN2, RXGAIN2,120)
。
9)开始节点3通过运行helperPacketizedModemRadio (‘B200’,‘A1B2C 3 [1 - 2], 915 e6, CDT3, MAXGAIN3, RXGAIN3,120)
。
10)会议结束后,每个节点输出的统计数据。
3网络设置操作了两个小时。每个节点生成包0.2包/秒的速度根据泊松分布。节点被放置大约相等的距离。一个链接的视线而其他两个没有。以下是收集到的结果在所有三个节点。往返时间以来DATA-ACK交换使用B2xx无线电连接USB可以高达800毫秒,网络的平均往返时间大于3秒。该算法最小化包丢失和提供一个公平的访问向所有节点共享信道。
节点1:NumGeneratedPackets: 1440 NumReceivedPackets: 1389 AverageRetries: 0.533738 AverageRoundTripTime: 3.725093 NumDroppedPackets: 95 NumDroppedPackets (Max重试):23日吞吐量:5.242823 e + 03
节点2:NumGeneratedPackets: 1440 NumReceivedPackets: 1340 AverageRetries: 0.473157 AverageRoundTripTime: 3.290775 NumDroppedPackets: 31 NumDroppedPackets (Max重试):9吞吐量:5.934772 e + 03
节点3:NumGeneratedPackets: 1440 NumReceivedPackets: 1385 AverageRetries: 0.516129 AverageRoundTripTime: 3.558408 NumDroppedPackets: 107 NumDroppedPackets (Max重试):29日吞吐量:5.488410 e + 03
讨论
从前面和仿真代码helperPacketizedModemRadio利用helper函数helperPacketizedModemNode系统对象实现现代节点。在这个例子中,相同的代码是用来评估一个系统,首先使用一个模拟通道,然后使用特别提款权硬件和无线频道。
即使使用模拟通道的代码是基于时间的,现代节点对象可以用来运行一个基于事件的模拟。这个例子并没有提供一个基于事件的仿真内核。
进一步的探索
你可以改变这些参数调查他们对数据链路层性能的影响:
PacketArrivalRate
ACKTimeOut
MaxBackoffTime
MaxDataRetries
QueueSize
你也可以探索的辅助函数算法的实现细节:
您可以检查物理层仅使用性能PacketizedModemPhysicalLayerTxRxExample脚本。
选定的参考书目
版权声明
通用软件无线电周边®和USRP®是国家仪器®公司的商标。