MATLAB中的蓝牙全双工数据和语音传输
本示例展示了如何使用蓝牙协议的通信工具箱™库在具有WLAN干扰并支持自适应跳频(AFH)功能的蓝牙®piconet中建模全双工通信。使用基本速率物理层PHY (basic rate physical layer)的蓝牙节点通过随机比特传输数据包(通过异步面向连接(asynchronous -oriented connect, ACL)逻辑传输)和语音包(通过同步面向连接(synchronous -oriented connect, SCO)逻辑传输)同时进行通信。支持的数据包和语音包包括:
数据包类型:DM1、DH1、DM3、DH3、DM5、DH5
语音报文类型:HV1、HV2、HV3
本例通过将通道分类为启用AFH好或坏基于每个通道的包错误率(PER)。您可以添加自己的分类算法来分析仿真结果。仿真结果显示了每个蓝牙节点的包错误率(PER)图。利用频谱分析仪可视化了WLAN干扰下蓝牙波形的功率谱密度。
蓝牙规范
蓝牙技术工作在2.4 GHz的工业、科学和医疗(ISM)频段,并与ZigBee和WLAN等其他无线技术共享。蓝牙核心规范[1特殊兴趣小组(SIG)定义了两种PHY模式:强制BR和可选的增强数据速率(EDR)。蓝牙BR/EDR无线电实现1600跳频/秒扩频(FHSS)技术。无线电以一种伪随机的方式在79个指定的蓝牙频道上跳跃。每个蓝牙通道的带宽为1mhz。每个通道以(2402 + k) MHz为中心,其中k = 0,1,…78.BR和EDR模式的有效载荷调制技术分别为高斯频移键控(GFSK)和差分相移键控(DPSK)。波特率为1msymbols /s。蓝牙BR/EDR无线电采用时分双工(TDD)方案,数据一次在一个方向上进行传输。传输在两个方向交替进行,一个接一个。
蓝牙和WLAN无线电通常在相同的物理场景和相同的设备中运行。因此,蓝牙和WLAN的传输会相互干扰,从而影响双方网络的性能和可靠性。为减轻这种干扰,IEEE 802.15.2工作小组[2]推荐使用AFH技术。要研究AFH和蓝牙与无线局域网的共存,请参见Bluetooth-WLAN共存.
有关蓝牙BR/EDR无线电和协议栈的更多信息,请参见蓝牙协议栈.有关蓝牙BR/EDR包结构的更多信息,请参见蓝牙包结构.
逻辑传输
蓝牙系统支持点对点或点对多点连接,称为微微网.每个piconet由一个主节点(Master)和其他从节点(Slave)组成。主服务器和从服务器通过多个逻辑传输交换数据。这些逻辑传输是:
上海合作组织: Master和Slave在预留的槽位上定期交换SCO报文。蓝牙节点使用SCO逻辑传输来交换周期性数据,如音频流。这种逻辑传输不支持重传。
面向扩展同步连接(eSCO):蓝牙节点通过eSCO交换音频流等周期性数据。这种逻辑传输支持重传。
ACL:蓝牙节点通过ACL进行异步数据交换,如FTP (file transfer protocol)协议。在每个轮询间隔期间,Master至少轮询从服务器的ACL逻辑传输一次。
主动从广播(ASB):蓝牙节点使用ASB逻辑传输将消息从Master发送到piconet中的所有slave。这种逻辑传输支持没有确认的单向通信。
无连接从广播(CSB):主节点使用CSB逻辑传输将概要广播数据发送到多个从节点。这种逻辑传输支持没有确认的单向通信。
这个示例通过将数据视为0和1的随机位来支持主节点和从节点之间的ACL和SCO逻辑传输。该图显示了piconet中一个Master和三个slave之间通过ACL和SCO逻辑传输的通信。
蓝牙使用预留的时隙在节点之间进行通信。每个插槽的持续时间为625微秒。主节点在偶数槽位发起传输,在多槽位发送报文时扩展传输到奇数槽位。Slave节点在奇数槽位发起传输,在发送多槽位报文时扩展传输到偶数槽位。
检查是否安装了支持包
%检查“蓝牙协议的通信工具箱库”是否存在安装% support包commSupportPackageCheck (“蓝牙”);
配置仿真参数
配置蓝牙微微网仿真参数、无线信道仿真参数和WLAN干扰仿真参数。
蓝牙微微网
的NumSlaves
参数指定蓝牙piconet中slave的数量。的LinkTraffic
参数指定通过蓝牙逻辑传输在主设备和各自从设备之间传输的流量类型。这个表映射LinkTraffic
到不同的逻辑传输。
如果主节点与多个从节点通信,LinkTraffic
必须是一个向量。
的SequenceType
参数指定蓝牙节点使用的跳频算法类型。当您设置SequenceType
来“连接自适应”
时,蓝牙通道分类为好或坏根据每个蓝牙通道的PER定期进行。要对蓝牙通道进行分类,可以使用classifyChannels对象的功能。
以微秒为单位设置模拟时间simulationTime = 3 * 1 e6;启用或禁用示例中的可视化。enableVisualization = true;simulationParameters =结构;配置piconet中的slave数量simulationParameters。NumSlaves =1;%以n × 3数组的形式指定蓝牙节点的位置。%,其中n表示piconet中的节点数。每一行指定%从Master开始的节点的笛卡尔坐标,后面跟着%的奴隶。simulationParameters。nodelocations = [10 0 0;20 0 0];配置主服务器和从服务器之间的逻辑链路每个元素表示Master和%的奴隶。如果主服务器连接到多个从服务器,则% value必须是行向量。simulationParameters。LinkTraffic = 1;配置跳频序列为'基本连接'或%连接自适应的simulationParameters。SequenceType =“连接自适应”;如果需要启用ACL逻辑传输,请将linkTraffic设置为1或3。指定% ACL报文类型为'DM1'、'DH1'、'DM3'、'DH3'、'DM5'或'DH5'。simulationParameters。ACLPacketType =“DM1”;如果要启用SCO逻辑传输,请将linkTraffic设置为2或3。指定% SCO包类型为'HV1', 'HV2',或'HV3',对于各自的Slave that%有SCO链路流量。这里,1表示从编号,而“HV3”%表示Slave 1使用的对应SCO报文类型。simulationParameters。SCOPacketType = {1,“HV3”};
无线信道和无线局域网干扰
方法配置无线通道helperBluetoothChannelhelper对象。您可以设置EbNo
值为AWGN通道。若要产生WLAN信号干扰,请使用helperBluetoothGenerateWLANWaveformhelper函数。参数指定WLAN干扰源WLANInterference
参数。使用这些选项之一指定WLAN干扰源。
“生成”
:若要添加WLAN工具箱™信号,请选择此选项。执行中显示的步骤进一步的探索以添加来自WLAN工具箱™的信号。“BasebandFile”
:从基带文件(.bb
),选择此选项。方法指定文件名WLANBBFilename
输入参数。如果不指定.bb
文件,本例使用默认值.bb
文件,“WLANNonHTDSSS.bb”
,添加WLAN信号。
的“没有”
option表示不添加WLAN信号。AWGN贯穿整个模拟过程。
配置无线通道参数simulationParameters。EbNo = 22;每比特能量(Eb)与谱噪声密度(No)之比,单位为dB配置WLAN干扰指定WLAN干扰为“已生成”、“BasebandFile”或“None”。要使用'wlanBBFilename'选项,请将wlanInterference设置为%的“BasebandFile”。simulationParameters。WLANInterference =“BasebandFile”;simulationParameters。WLANBBFilename =“WLANNonHTDSSS.bb”;信号干扰比,单位为dBsimulationParameters。Sir = [-15 -16];
频道分类参数
方法将蓝牙通道分为好通道和坏通道helperBluetoothChannelClassification对象仅在SequenceType
是“连接自适应”
.该示例使用这些参数对蓝牙通道进行分类。
PERThreshold
每个阈值:ClassificationInterval
:通道分类的周期性(以槽为单位)RxStatusCount
:每个通道维护的最大接收包数状态MinRxCountToClassify
:每个通道的最小接收包数状态,可将通道划分为好通道或坏通道PreferredMinimumGoodChannels
:主服务器和从服务器之间通信所需的良好通道的首选数量
属性,可以添加自己的分类算法classifyChannels的方法helperBluetoothChannelClassification对象。
simulationParameters。PERThreshold =50;包错误率%simulationParameters。ClassificationInterval =3000;%的插槽simulationParameters。RxStatusCount =10;最大Rx包状态simulationParameters。MinRxCountToClassify=4;收到的最小包数%simulationParameters。PreferredMinimumGoodChannels =20.;%良好通道的首选数量
创建蓝牙微微网
指定piconet中蓝牙节点的总数。设置节点的角色为Master或Slave。要根据所配置的参数创建蓝牙微微网,请使用helperBluetoothCreatePiconethelper函数。
重置随机数生成器rng (“默认”);指定Tx功率,单位为dBmsimulationParameters。TxPower = 20;%指定蓝牙节点接收器范围(以米为单位)simulationParameters。ReceiverRange = 40;设置piconet中的节点总数(一个主节点和多个节点)%的奴隶)numNodes = simulationParameters。NumSlaves + 1;创建一个蓝牙piconetbtNodes = helperBluetoothCreatePiconet (simulationParameters);
要可视化蓝牙波形,请创建dsp。简介
系统™对象。
使用频谱分析仪查看蓝牙波形。简介= dsp。简介(...“名字”,“蓝牙全双工通信”,...“ViewType”,光谱和光谱图,...“TimeResolutionSource”,“属性”,...“TimeResolution”, 0.0005,...“SampleRate”e6, btNodes {1} .PHY.SamplesPerSymbol * 1,...“TimeSpanSource”,“属性”,...“时间间隔”, 0.05,...“FrequencyResolutionMethod”,“WindowLength”,...“WindowLength”, 512,...“AxesLayout”,“水平”,...“FrequencyOffset”2441 * 1 e6,...“ColorLimits”[-20] 15日);
模拟
使用配置的参数模拟蓝牙微微网。在piconet中可视化每个蓝牙节点的PER图。图形显示蓝牙波形的功率谱密度dsp。简介
系统对象。您还可以计算每个蓝牙节点的基带层统计信息(发送总包数、接收总包数、丢弃总包数)和通道分类统计信息。当序列类型设置为“连接自适应”
,t
蓝牙节点更新信道分类统计信息。
%当前模拟时间,以微秒为单位curTime = 0;%以微秒为单位的运行时间elapsedTime = 0;%所有节点的下一次调用时间(以微秒为单位)nextInvokeTimes = 0 (1, numNodes);如果enableVisualization绘制PERperFigure =图(“名称”,“每个蓝牙节点的PER”,“标签”,“BluetoothPERPlot”);perAxes =轴(perFigure);向图中添加注释ylim (perAxes [0, 1]);包含(perAxes“模拟时间(微秒)”);ylabel (perAxes“每”);标题(perAxes,“每个蓝牙节点的PER”);绘制每个蓝牙节点的PER线[perPlots, legendStr] = deal(cell(1, numNodes));为plotIdx = 1:numNodes hold在perPlots{plotIdx} = plot(perAxes, curTime, 0);如果plotIdx == 1 legendStr{1} = [“(rgb){\颜色”num2str (perPlots {plotIdx} .Color)“}大师”];其他的legendStr {plotIdx} = [“(rgb){\颜色”num2str (perPlots {plotIdx} .Color)'}奴隶- 'num2str (plotIdx-1)];结束结束在图中添加图例传奇(perAxes legendStr,“位置”,“northeastoutside”,“盒子”,“上”);如果~ strcmpi (simulationParameters。WLANInterference,“没有”)生成WLAN波形以进行可视化wlanWaveform = helperBluetoothGenerateWLANWaveform (...simulationParameters。WLANInterference,simulationParameters。WLANBBFilename);结束结束%运行模拟而(curTime < simulationTime)模拟蓝牙节点为nodeIdx = 1: numNodes将数据推入节点pushData (btNodes {nodeIdx},...simulationParameters。ACLPacketType, simulationParameters.SCOPacketType);%运行蓝牙节点实例nextInvokeTimes(nodeIdx) = runNode(btNodes{nodeIdx}, elapsedTime);如果enableVisualization如果~ isempty (findobj (“标签”,“BluetoothPERPlot”))%更新并绘制PERperPlots {nodeIdx}。XData = [perPlots {nodeIdx}。XData curTime];如果isempty(btNodes{nodeIdx}.PHY.PER) per = 0;其他的每= btNodes {nodeIdx} .PHY.PER;结束perPlots {nodeIdx}。YData = [perPlots {nodeIdx}。YData每];结束结束结束更新当前模拟时间curTime = curTime + elapsedTime;将从每个节点发送的数据包分发到接收端其他节点的%缓冲区[isPacketDistributed, txBuffer] = helperBluetoothDistributePackets(btNodes);%更新可视化如果enableVisualization为txIdx = 1:numel(txBuffer) channel波形= txBuffer{txIdx}.波形(1:txBuffer{txIdx}.NumSamples);如果~ strcmpi (simulationParameters。WLANInterference,“没有”)在信道波形中添加WLAN干扰channel波形= channel波形+ wlan波形(1:txBuffer{txIdx}.NumSamples);结束绘制蓝牙波形简介(channelWaveform);结束结束%如果报文分配到接收节点,执行命令nodes to%检查数据包接收缓冲区。如果isPacketDistributed elapsedTime = 0;将模拟时间提前到节点上的下一个事件。其他的elapsedTime = min(nextInvokeTimes(nextInvokeTimes ~= -1));结束结束
ans =1 x79逻辑阵列0 1 1 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
释放(简介);
上述频谱分析仪图显示了由于WLAN干扰(在频域内)而失真的蓝牙波形经过AWGN通道的频谱。右边的图显示了蓝牙数据包与干扰WLAN信号的重叠。
图“每个蓝牙节点的PER”表示蓝牙微微网中每个节点的PER相对于仿真时间的变化。
要查看每个蓝牙节点的基带层统计信息,请检查statisticsAtEachNode
变量。要查看每个主从对的通道分类统计信息,请检查classificationStats
变量。当信道分类统计信息有效时sequenceType
被设置为“连接自适应”
.获取piconet中每个蓝牙节点的基带层和通道分类统计信息。
获取piconet中每个蓝牙节点的基带层和通道分类统计信息[statisticsAtEachNode, classificationStats] = helperBluetoothFullDuplexStatistics(btNodes)
statisticsAtEachNode =表2×19______________ ______________ ____________ ___________________ _____________________ ____________________ _______________________ ___________________ . TotalRxPackets TotalTxPackets TxACLOneSlotPackets TxACLThreeSlotPackets TxACLFiveSlotPackets RetransmittedACLPackets RxSlotsWithNoPacket TxSCOPackets RxACLPackets RxACLOneSlotPackets RxACLThreeSlotPackets RxACLFiveSlotPackets RxSCOPackets TotalRxFailedPackets ACKedACLPackets ACKedSCOPackets DroppedPackets DroppedLMPMessages____________ ____________ ___________________ _____________________ ____________________ ____________ ____________________ _______________ _______________ ______________ __________________ 主1435 2401 {7 x2双}{7 x2双}{7 x2双}{7 x2双}{965 x2双}{7 x2双}{7 x2双}{7 x2双}{7 x2双}{7 x2双}{157 x2双}{7 x2双}{7 x2双}254 0 Slave1 2379 1444 {7 x2双}{7 x2双}{7 x2双}{7 x2双}{7 x2双}0 {7 x2双}{7 x2双}{7x2 double} {7x2 double} {7x2 double} {7x2 double} 384 {7x2 double} {7x2 double} 551 0
classificationStats =1×3表LTAddress ClassificationCount ChannelMap _________ ___________________ __________________________________________________________________________ 1 1{[0 1 1 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0…]}
本示例使您能够在具有WLAN干扰的蓝牙piconet中配置和模拟全双工数据和语音通信。该示例使用AFH通过将信道分类为来减轻WLAN干扰好或坏基于PER值。通过可视化WLAN干扰对每个蓝牙节点的影响,分析了全双工通信的性能。
进一步的探索
若要使用WLAN工具箱™的特性添加WLAN信号,请将“wlanInterference”的值设置为“Generated”。使用此代码添加WLAN信号。
将使用WLAN工具箱™特性生成的WLAN信号作为静态信号干扰添加到蓝牙中。要启用此功能,请设置wlanInterference
值为'Generated',在函数中添加自定义信号生成代码。在使用WLAN工具箱™的特性生成WLAN信号中使用此示例代码片段。
% %的WLAN波形可以干扰蓝牙波形% %通过使用WLAN工具箱(TM)的特性修改。% psduLength = 1000;%为WLAN波形创建配置对象(802.11b)% cfgNHT = wlanNonHTConfig('调制','DSSS',…% PSDULength, PSDULength);%随机创建PSDU% psdu = randi([0 1], cfgNHT.;PSDULength * 8, 1);%% %生成WLAN波形% wlan波形= wlanWaveformGenerator(psdu, cfgNHT);
中添加自定义信号生成代码helperBluetoothGenerateWLANWaveform函数。您还可以编写各自的信号WLAN频谱掩码并注册到WLANSpectrum
财产的helperBluetoothChannel作为函数指针。
附录
下面的例子使用了这个对象:
bluetoothFrequencyHop
:选择蓝牙BR/EDR通道索引进行跳频
这个例子使用了这些帮助器:
helperBluetoothFullDuplexNode:配置和模拟蓝牙节点
helperBluetoothBaseband:配置和模拟蓝牙基带层
helperBluetoothLogicalTransports:配置蓝牙节点间的逻辑传输
helperBluetoothSlotTimer:蓝牙时钟和槽位定时管理
helperBluetoothPHY:配置和模拟蓝牙PHY层
helperBluetoothChannel:配置和模拟蓝牙无线信道
helperBluetoothGenerateWLANWaveform:生成WLAN波形,作为蓝牙波形的干扰
helperBluetoothWLANDSSSSpectrumMask:通过WLAN 802.11b (DSSS)频谱掩码计算相邻信道干扰功率
helperBluetoothCreatePiconet:使用蓝牙节点创建蓝牙微微网
helperBluetoothFullDuplexStatistics:返回蓝牙微微网中每个蓝牙节点的统计信息
helperBluetoothQueue:为蓝牙队列功能创建对象
选定的参考书目
蓝牙特殊兴趣小组(SIG)。“蓝牙核心规范。”5.2版。https://www.bluetooth.com.
IEEE标准®802.15.2™。无线个人区域网络与在未经许可的频段内运行的其他无线设备共存。IEEE信息技术推荐实施规程。系统间的电信和信息交换。局域网和城域网。特殊要求;IEEE计算机协会。