主要内容

上行触发器格式的802.11ax包错误率仿真

此示例显示了如何测量IEE​​E®802.11AX™高效率(HE)上行链路,基于触发(TB)格式的数据包错误率。

介绍

802.11ax[1]基于触发器的(HE TB)格式允许在上行链路中进行OFDMA或MU-MIMO传输。HE-TB传输完全由接入点(AP)控制。传输所需的所有参数在触发帧中提供给参与HE-TB传输的所有sta。如下图所示,当AP触发时,每个站(STA)同时发送HE TB数据包。

在本例中,端到端仿真用于确定一个MU-MIMO配置中四个sta的HE TB链路的包错误率。在每个信噪比点上,除信道和噪声外,多包在无损害的情况下传输。对收到的报文进行解调,并恢复每个STA的psdu。将PSDUs与传输的PSDUs进行比较,以确定包错误率,从而确定所有用户的包错误率。数据包检测、定时同步和符号均衡由接收端完成。本例中不进行频率偏移校正。HE TB加工链的加工如下图所示。

接收机执行一个基于最小均方误差的有序连续干扰消除(MMSE-SIC)过程来实现数据均衡[2]。为了避免取消阶段中的误差传播,基于信道状态信息以降序排序所有STA的数据流并按顺序均衡。该图显示了MMSE-SIC均衡的过程。

均衡法

在此示例中,您可以将均衡方法指定为“MMSE”或“MMSE-SIC”。默认均衡器是“MMSE-SIC”。

equalizationMethod ='mmse-sic'

用户配置

在该示例中,多个上行链路sta的分配信息和发射参数使用hetbsystemconfig对象。

AllocationIndex = 195;MU-MIMO配置中%四个上行链路用户cfgsys = hetbsystemconfig(AllocationIndex);

在基于触发器的传输中,对于所有上行链路用户来说,某些参数相同,而有些则可能不同。这用户财产cfgSys包含用户配置的单元格数组。单元数组的每个元素都是一个对象,可以将其配置为设置单个用户的参数。在此示例中,所有用户具有相同的传输参数。

%这些参数对MU-MIMO系统中的所有用户都是相同的cfgsys.heltftype = 4;% HE-LTF压缩模式cfgsys.guardinterval = 3.2;%保护间隔类型cfgSys。SingleStreamPilots = 1;HE-LTF的单流导频传输numRx=8;%接收数(AP)天线数量%下面指定每个用户的各个参数allocInfo = ruInfo (cfgSys);numUsers = allocInfo.NumUsers;%上行链路用户数为了userIdx = 1:numUsers cfgSys.User{userIdx}。NumTransmitAntennas = 1;cfgSys.User {userIdx}。NumSpaceTimeStreams = 1;cfgSys.User {userIdx}。SpatialMapping =“直接”; cfgSys.User{userIdx}.MCS=7;cfgSys.User{userIdx}.APEPLength=1e3;cfgSys.User{userIdx}.ChannelCoding=“自民党”结尾

系统内的单个用户的基于触发器的传输配置为配置wlanhetbconfig对象。使用该方法生成所有用户的传输配置getuserconfig.创建一个由四个HE TB对象组成的单元阵列来描述四个用户的传输。

cfgTB=getUserConfig(cfgSys);

仿真参数

对于每个SNR点(DB)信噪比向量生成多个分组,通过信道并解调以确定分组错误率。

SNR = 20:2:24;%HE TB数据包的样本速率和现场指数对于所有内容相同%用户。这里使用第一个用户的触发配置来获取%HE TB PPDU的样品速率和现场指数。fs = wlansamplerate(cfgtb {1});所有用户都相同IND = WLANFIELDINDINCES(CFGTB {1});所有用户都相同

频道配置

在此示例中,TGax NLOS室内信道模型与延迟剖面模型-B一起使用。当发射器和接收器之间的距离大于或等于5米时,模型B被视为非直瞄。这将在中进一步描述wlanTGaxChannel.在该示例中,假设所有STA都与AP处于相同的距离。

tgaxbase = wlantgaxchannel;tgaxbase.samplere = fs;tgaxbase.transmissionDirection =.“上行”;tgaxbase.transmitreceivedistance = 10;chanbw = cfgsys.channelbandwidth;tgaxbase.channelbandwidth = chanbw;tgaxbase.numreceiveannas = numrx;

为四个用户中的每一个创建一个单独的频道。每个频道都是tgaxBase,但又有所不同UserIndex属性,并存储在单元格数组中tgax.这UserIndex设置每个通道的属性为每个用户提供唯一的频道。在该示例中,通过随机改变每个数据包使用随机信道实现UserIndex属性。

%单元阵列存储通道对象,每个用户一个tgax=细胞(1,微乳);为了UserIDX = 1:NUMUSERS TGAX {USERIDX} =克隆(TGAXBASE);tgax {useridx} .numtransmitantennas = cfgsys.user {useridx} .numtransmitantannas;tgax {useridx} .userIndex = UserIDX;结尾

处理SNR点

对于每个SNR点,测试了许多数据包,并计算数据包错误率。802.11AX的预先序言是向后兼容802.11ac™的,因此在该示例中,VHT波形的定时同步组件用于在接收器处同步HE波形。对于每个用户,发生以下处理步骤以在包含所有四个用户的接收器处创建波形:

  1. 为了创建HE TB波形,根据预定义的用户参数为每个用户创建并编码PSDU。

  2. 每个用户的波形通过室内TGAX通道模型传递。通过随机改变不同的用户和数据包来模拟不同的频道实现。UserIndex渠道的财产。这导致所有用户的空间相关性能相同。

  3. 所有HE TB用户的波形都被缩放并组合,以确保在添加噪声后每个用户的同一SNR。

  4. 在每个用户的OFDM解调之后,将AWGN添加到接收的波形中,以创建期望的每个子载波的平均SNR。通信信道,以提供正确的信噪比。该配置考虑了信道内接收天线数量的归一化,以及在OFDM解调过程中去除的未使用子载波中的噪声能量。

在接收器(AP)发生以下处理步骤:

  1. 检测到数据包。

  2. 建立了精细定时同步。L-STF, L-LTF和L-SIG样本被提供用于精确定时,允许在L-STF的开始或结束时进行包检测。

  3. 所有用户的HE-LTF和HE-DATA数据字段都是从同步接收波形中提取的。HE-LTF和HE-DATA字段是OFDM解调的。

  4. 为每个RU提取解调的HE-LTF,并执行信道估计。

  5. 使用每个RU的解调数据场导频执行噪声估计。

  6. 从解调数据字段中提取数据字段并均衡所有用户内的所有用户。

  7. 对于每个RU和RU内的用户,对用户的空间流进行解调和解码以恢复发送的PSDU。

可以使用parfor循环并行处理信噪比点,因此对每个信噪比点创建一个AWGN信道并配置comm.AWGNChannel。为了使用并行计算来提高速度,请将下面的'for'语句注释掉,并取消对'parfor'语句的注释。

ofdmInfo = wlanHEOFDMInfo (“数据”、cfgSys.ChannelBandwidth cfgSys.GuardInterval);numSNR =元素个数(信噪比);%信噪比点数numPackets=50;%要模拟的数据包数packetErrorRate = 0 (numUsers numSNR);txPSDU =细胞(numUsers);% parfor isnr = 1:numSNR %使用“parfor”加速模拟为了ISNR = 1:NUMSNR%迭代设置随机子流索引,以确保每个%迭代使用一组可重复的随机数stream=RandStream('幸福父母''种子',0); 子流=isnr;RandStream.setGlobalStream(stream);%每模拟一个SNR点创建一个AWGN信道实例awgn = comm.awgnchannel;Awgn.noisemethod =“信噪比”;摘要。SignalPower = 1 / numRx;sysInfo = ruInfo (cfgSys);%模拟多个数据包numpacketerrors =零(麻木,1);为了pktIdx = 1: numPackets%传输处理rxWaveform = 0;packetError = 0 (numUsers, 1);txPSDU =细胞(1、numUsers);%为每个包生成随机信道实现,方法是%通道的UserIndex属性。这假设所有用户%具有相同数量的发射天线。chpermutations = randperm(麻木商);为了userIdx = 1: numUsers每个用户的%he tb config对象cfgUser=cfgTB{userIdx};%使用随机PSDU生成数据包txPSDU{userIdx} = randi([0 1],getPSDULength(cfgUser)*8,1,'int8');%生成HE TB波形,包含单个用户的有效载荷txtrig = wlanwaveformgenerator(txpsdu {useridx},cfguser);%通过随机TGAX通道传递波形ChannelIDX = chpermutations(UserIDX);重置(TGAX {ChinnelIDX});%新渠道实现rxtrig = tgax {chentelidx}([txtrig; zeros(15,尺寸(txtrig,2))]);%缩放了ru内用户的发射功率。这是%确保添加噪音后每个用户的信噪比相同。ruNum=cfgSys.User{userIdx}.RUNumber;SF=sqrt(1/sysInfo.numusersperu(ruNum))*sqrt(cfgUser.RUSize/(sum(sysInfo.RUSizes));%将上行用户组合成一个波形rxWaveform=rxWaveform+SF*rxTrig;结尾%通过AWGN通道传递波形。解释噪声NULL中的%能量,因此SNR定义为每个活动子载波。摘要。信噪比=信噪比(isnr) -10 * log10 (ofdmInfo.FFTLength / sum (sysInfo.RUSizes));rxWaveform = awgn (rxWaveform);%接收处理包检测并确定粗包偏移量coarsepktoffset = wlanpacketdetect(rxwaveform,chanbw,0,0.05);如果isempty(coarsepktoffset)%如果空不检测到L-STF;数据包错误numPacketErrors = numPacketErrors + 1;持续%转到下一个循环迭代结尾%提取非ht字段并确定精细数据包偏移量nonhtfields = rxWaveform (coarsePktOffset + (ind.LSTF (1): ind.LSIG (2)),:);finePktOffset = wlanSymbolTimingEstimate (nonhtfields chanBW);%确定最终数据包偏移量pktoffset = coarsepktoffset + finepktoffset;%如果通过来自的预期延迟范围检测到数据包%频道建模;数据包错误如果pktOffset>50 numPacketErrors = numPacketErrors+1;持续%转到下一个循环迭代结尾%rus提取HE-LTF和HE-DATA字段rxLTF = rxWaveform (pktOffset + (ind.HELTF (1): ind.HELTF (2)),:);rxData = rxWaveform (pktOffset + (ind.HEData (1): ind.HEData (2)),:);为了ruIdx=1:allocInfo.NumRUs%为感兴趣的RU解调HE-LTF和HE-Data字段ru = [allocinfo.rusize(ruidx)Allocinfo.Ruindices(Ruidx)];Demodheltfru = wlanhedemodulate(rxltf,'he-ltf',chanBW,cfgSys.GuardInterval,cfgSys.HeltType,ru);解调数据=wlanHEDemodulate(rxData,“数据”,chanbw,cfgsys.guardinterval,ru);%信道估计[Chanest,SSPILOTEST] = HELTFCHANNELESTIMATIOM(DEMODHELTFRU,CFGSYS,RUIDX);%在ru中获得数据和飞行员的指数(没有空虚)ruOFDMInfo = wlanHEOFDMInfo (“数据”,cfgSys.ChannelBandwidth,cfgSys.GuardInterval,...[allocInfo.RUSizes (ruIdx) allocInfo.RUIndices (ruIdx)]);%估计每个用户现场的噪声功率nvarest = henoiseestimate(remodhedataru(ruofdminfo.pilotindices,:,:),sspilotest,cfgsys,ruidx);%丢弃导频子载波Demoddatasym = Demodhedataru(Ruofdminfo.dataindices,:,:);chanestdata = chanest(ruofdminfo.dataindices,::);%平衡如果strcmpi(均衡方法,'mmse-sic') [eqSym,csi] = heSuccessiveEqualize(demodDataSym,chanEstData,nVarEst,cfgSys,ruIdx);别的[eqSym,csi]=heEqualizeCombine(解调数据sym,chanEstData,nVarEst,cfgSys);结尾为了useridx = 1:Allocinfo.numusersperru(ruidx)%为每个用户获取TB配置对象USERNUM = CFGSYS.RU {RUIDX} .USERNUMBERS(USERIDX);cfguser = cfgtb {usernum};%获取当前用户的时空流索引stsidx = cfguser.startingspacetimestream-1 +(1:cfguser.numspacetimestreams);% Demap和解码位rxpsdu = wlanhedatabitrocover(eqsym(:,:,stsidx),nvarest,csi(:,stsidx),cfguser,“LDPCDecodingMethod”'分层BP');%按计算任何(biterr packetError (userNum) = (txPSDU {userNum}, rxPSDU));结尾结尾Numpackterros=Numpackterros+打包错误;结尾%计算SNR点的数据包错误率(PER)packetErrorRate (:, isnr) = numPacketErrors / numPackets;disp (['snr'num2str(SNR(ISNR))...'完成'num2str (numUsers)'用户']);结尾
SNR 20已完成4位用户SNR 22已完成4位用户SNR 24完成4个用户

绘制数据包错误率与信噪比

标记='ox * sd ^ v> ;颜色=“bmcrgbrkymcrgbrkymc”; 图形为了nSTA = 1:numUsers semilogy(snr,packetErrorRate(nSTA,:).',[' - '标记(NSTA)颜色(NSTA)]);抓住结尾网格; xlabel('snr(db)'); 伊拉贝尔(“每”);dataStr = arrayfun (@ (x) sprintf (“STA-%d”,x),1:讽刺者,“UniformOutput”,错误的);传奇(数据组);标题('PER for uplink 802.11ax link');

在每个SNR点测试的数据包数由numPackets.对于有意义的结果,该值应大于此示例中所呈现的值。下图是通过运行更长的仿真来创建的numPackets:1E4和信噪比:20:2:28,显示MMSE均衡器和MMSE-SIC均衡器的分组错误率。

附录

此示例使用以下辅助函数和对象:

选定的书目

  1. IEEE P802.11ax™/D4.1信息技术标准草案-系统间电信和信息交换-局域网和城域网-特定要求-第11部分:无线LAN介质访问控制(MAC)和物理层(PHY)规范-修改件6:高效WLAN增强。

  2. 德·库维尔先生、马克先生、西蒙先生和鲁巴顿先生。一种新的可调混合扩频OFDM系统的MMSE连续干扰消除方案。IEEE第51届车辆技术会议论文集,第745-749页,第2卷,2000。