802.11ac数据包的恢复过程

这个例子展示了如何在接收的IEEE®802.11ac标准的VHT™波形检测分组和解码净荷位。接收器恢复从前导码字段中的数据包格式参数对数据进行解码。

介绍

在单用户的802.11ac分组的发送参数是使用L-SIG和VHT-SIG-A前导码字段[发送到接收机1]:

  • L-SIG字段包含允许接收方确定包的传输时间的信息。

  • 的VHT-SIG-A字段包含传输参数包括调制和编码方案,空间时间流和信道编码的数目。

在这个例子中,我们检测和含有具有帧校验序列(FCS)的有效MAC帧产生的波形内进行解码的分组。所有的传输参数除了被假定未知,因此从经解码的L-SIG和在每个分组VHT-SIG-A前导码字段检索带宽信道。所检索的传输配置用于解码所述VHT-SIG-B和VHT数据字段。此外,进行了如下分析:

  • 显示所检测的分组的波形。

  • 显示检测到的数据包的频谱。

  • 显示每个空间流的均衡数据码元的星座图。

  • 每个字段的误差矢量幅度(EVM)进行测量。

波形变速箱

在这个例子中一个的802.11ac VHT单用户波形本地产生的,但也可以使用所捕获的波形。MATLAB®可用于从广泛的使用仪器控制工具箱™和软件定义无线电平台仪器获得I / Q数据。

局部产生的波形会受到3x3 TGac衰落信道、加性高斯白噪声和载波频偏的影响。为了在本地生成波形,我们配置了一个VHT包格式配置对象。注意,VHT包配置对象仅用于发送端。当数据包被解码时,接收方将动态地形成另一个VHT配置对象。辅助函数vhtSigRecGenerateWaveform在局部产生受损的波形。辅助功能的处理步骤如下:

  • 一个有效的MAC帧被生成并编码成VHT波形。

  • 波形是通过TGAC衰落信道模型通过。

  • 载波频率偏移被添加到波形中。

  • 加性高斯白噪声添加到波形。

% VHT链接参数cfgVHTTx = wlanVHTConfig (...“ChannelBandwidth”'CBW80'...“NumTransmitAntennas”,3,...“NumSpaceTimeStreams”,2,...“SpatialMapping”“阿达玛”...“摘要”,真的,...'MCS'5,...“GuardInterval”“长”...“APEPLength”,1052);%传播渠道numRx = 3;%接收天线数目delayProfile =型号c的;% TGac通道延迟配置文件%减值noisePower = -30;应用于dBW的噪声功率%首席财务官= 62年e3;%载波频率偏移(Hz)生成波形参数%numTxPkt = 1;传输数据包的数量idleTime = 20 e-6;每个数据包前后的空闲时间%生成波形RX = vhtSigRecGenerateWaveform(cfgVHTTx,numRx,...delayProfile, noisePower, cfo, numTxPkt,空闲时间);

包复苏

要处理的信号存储在变量中处方。恢复数据包的处理步骤如下:

  • 的分组中检测和同步。

  • 检测到数据包的格式。

  • L-SIG字段被提取出来,它的信息位被恢复来确定数据包的长度(以微秒为单位)。

  • 提取vht - siga字段,并恢复其信息位。

  • 包格式参数从解码L-SIG和VHT-SIG-A位检索。

  • 提取VHT- ltf字段进行MIMO信道估计,对VHT- sigb和VHT数据字段进行解码。

  • 的VHT-SIG-B字段被提取,并且其信息比特恢复。

  • 的VHT数据字段提取和PSDU和VHT-SIG-B的CRC位使用检索到的分组参数回收。

某些前导字段的开始和结束索引依赖于信道带宽,但独立于所有其他传输参数。这些索引是使用具有已知带宽的默认传输配置对象计算的。

cfgVHTRx = wlanVHTConfig(“ChannelBandwidth”,cfgVHTTx.ChannelBandwidth);idxLSTF = wlanFieldIndices(cfgVHTRx,“L-STF”);idxLLTF = wlanFieldIndices (cfgVHTRx,'L-LTF');idxLSIG = wlanFieldIndices(cfgVHTRx,“L-SIG”);idxSIGA = wlanFieldIndices(cfgVHTRx,'VHT-SIG-A');

下面的代码为处理配置对象和变量。

chanBW = cfgVHTTx.ChannelBandwidth;SR = wlanSampleRate(cfgVHTTx);%安装地块例如[spectrumAnalyzer,时间波谱,constellationDiagram] = vhtSigRecSetupPlots(SR);%最小分组长度是10个OFDM符号lstfLen =双(idxLSTF(2));L-STF中样品的数量minPktLen = lstfLen * 5;rxWaveLen =尺寸(RX,1);

前端处理

前端处理包括数据包检测、粗载波频偏校正、定时同步和精载波频偏校正。一个回路用于所接收的波形中检测和同步的分组。样本偏移searchOffset用于索引数组中的元素处方检测数据包。里面的第一个数据包处方被检测和处理。如果检测到的包的同步失败,则样本索引偏移searchOffset递增到移动超过在处理后的分组处方。重复这个过程,直到成功地检测并同步了一个包。

searchOffset = 0;样本中波形开始偏移的百分比(searchOffset + minPktLen)<= rxWaveLen%包检测pktOffset = wlanPacketDetect(RX,chanBW,searchOffset);%调整分组偏移pktOffset = searchOffset + pktOffset;如果isempty(pktOffset) || (pktOffset + idxLSIG(2) > rx小波)错误('**未检测到数据包**');结束使用L-STF进行粗频偏估计LSTF = rx(pktOffset + (idxLSTF(1):idxLSTF(2)),:);@ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @%的粗频率偏移补偿rx = helperFrequencyOffset (rx、sr、-coarseFreqOffset);符号定时同步LLTFSearchBuffer = rx (pktOffset + (idxLSTF (1): idxLSIG (2)),:);pktOffset = pktOffset + wlanSymbolTimingEstimate (LLTFSearchBuffer chanBW);如果(pktOffset + minPktLen)“**不足够的样本来恢复分组** \ n \ n”);打破;结束%的定时同步完成:包检测fprintf中('分组在索引检测%d \ n \ n',pktOffset + 1);%精细频率使用L-LTF偏移估计L-LTF = RX(pktOffset +(idxLLTF(1):idxLLTF(2)),:);fineFreqOffset = wlanFineCFOEstimate(L-LTF,chanBW);%精频偏置补偿rx = helperfrequency偏移量(rx, sr, -fineFreqOffset);显示估计的载波频率偏移cfoCorrection = sefreqoffset + fineFreqOffset;%总CFOfprintf中('预估财务长:%5.1f Hz\n\n',cfoCorrection);打破;%前端处理完成时,停止搜索分组结束
在索引1600处检测到数据包,估计CFO: 61954.3 Hz

格式检测

数据包的格式是使用紧随着L-LTF的三个OFDM符号来检测的。需要对从L-LTF获得的信道和噪声功率进行估计。

使用L-LTF%的信道估计L-LTF = RX(pktOffset +(idxLLTF(1):idxLLTF(2)),:);demodLLTF = wlanLLTFDemodulate(L-LTF,chanBW);chanEstLLTF = wlanLLTFChannelEstimate(demodLLTF,chanBW);估计非高温环境下的噪声功率noiseVarNonHT = helperNoiseEstimate(demodLLTF);%检测分组的格式FMT = wlanFormatDetect(RX(pktOffset +(idxLSIG(1):idxSIGA(2)),:),...chanEstLLTF,noiseVarNonHT,chanBW);DISP([FMT“格式检测”]);如果~ strcmp (fmt,“VHT”)错误('**检测到VHT以外的格式**');结束
VHT格式检测

L-SIG解码

在VHT传输中,L-SIG字段用于确定数据包的接收时间或RXTIME。RXTIME是使用L-SIG有效载荷[1情商,22 - 105]。包含包的样本的数量处方然后可以计算。在L-SIG的有效载荷使用从L-LTF中得到的信道和噪声功率的估计解码。

%恢复L-SIG字段位DISP('解码L-SIG ......');[rxLSIGBits, failCheck, eqLSIGSym] = wlanLSIGRecover(rx(pktOffset + (idxLSIG(1):idxLSIG(2)),:),...chanEstLLTF,noiseVarNonHT,chanBW);如果failCheck样品的%跳过L-STF长度并继续搜索DISP('** L-SIG检查失败**');其他的DISP(L-SIG检查通过的);结束测量L-SIG符号的EVM维生素与= comm.EVM;维生素。ReferenceSignalSource =“从参考星座估计”;EVM.ReferenceConstellation = wlanReferenceSymbols(“BPSK”);rmsEVM = EVM(eqLSIGSym);fprintf中('L-SIG EVM: %2.2f%% RMS\n',rmsEVM);中计算接收时间和对应的样本数量%包lengthBits = rxLSIGBits (17)。”;RXTime = ceil((bi2de(double(lengthBits)) + 3)/3) * 4 + 20;%的美国numRxSamples = RXTime * 1e-6 * sr;在接收时间内样品的数量fprintf中(“RXTIME: % du \ n”,RXTime);fprintf中('在分组样品数:%d \ n \ n',numRxSamples);
解码L-SIG ... L-SIG检查通L-SIG EVM:1.83%RMS RXTIME:在包样本数84us:6720

检测到的分组的内部的波形和频谱处方显示计算出的RXTIME和相应的样本数量。

sampleOffset = max((-lstfLen + pktOffset), 1);%首指数情节sampleSpan = numRxSamples + 2*lstfLen;要绘图的样本数量绘制尽可能多的包(和额外的样品)plotIdx = sampleOffset:分钟(sampleOffset + sampleSpan,rxWaveLen);%配置时间波谱显示包timeScope.TimeSpan = sampleSpan / SR;timeScope.TimeDisplayOffset = sampleOffset / SR;timeScope.YLimits = [0最大(ABS(RX(:)))];时间波谱(ABS(RX(plotIdx,:)));%显示检测到的分组的频谱spectrumAnalyzer(rx(pktOffset + (1:numRxSamples),:);

VHT-SIG-A解码

的VHT-SIG-A字段包含分组的传输配置。的VHT-SIG-A位使用从L-LTF得到的信道和噪声功率估计回收。

%恢复vht - siga字段位DISP(“解码VHT-SIG-A…');[rxSIGABits, failCRC, eqSIGASym] = wlanVHTSIGARecover(rx(pktOffset + (idxSIGA(1):idxSIGA(2)),:),...chanEstLLTF,noiseVarNonHT,chanBW);如果failCRC DISP('** vht - siga CRC失败**');其他的DISP('VHT-SIG-A CRC通');结束测量BPSK和QBPSK调制方案vht - siga符号的EVM释放(维生素);EVM.ReferenceConstellation = wlanReferenceSymbols(“BPSK”);rmsEVMSym1 =维生素(eqSIGASym (: 1));释放(维生素);EVM.ReferenceConstellation = wlanReferenceSymbols(“QBPSK”);rmsEVMSym2 =维生素(eqSIGASym (:, 2));fprintf中(' vht - siga - EVM: %2.2f% RMS\n',意味着([rmsEVMSym1 rmsEVMSym2]));
解码VHT-SIG-A……vht - siga CRC通过vht - siga EVM: 2.06% RMS

辅助函数helperVHTConfigRecover返回一个VHT格式的配置对象,cfgVHTRx,基于恢复的vht - siga和L-SIG位。不需要解码波形的属性被设置为a的默认值wlanVHTConfig对象,并且因此可以从值不同cfgVHTTx。这些属性的例子包括NumTransmitAntennasSpatialMapping

%通过检索包参数创建一个VHT格式配置对象%从解码L-SIG和VHT-SIG-A位cfgVHTRx = helperVHTConfigRecover(rxLSIGBits,rxSIGABits);%显示来自VHT-SIG-A中得到的传输配置vhtSigRecDisplaySIGAInfo(cfgVHTRx);
解码VHT-SIG-A内容:ChannelBandwidth: 'CBW80' NumSpaceTimeStreams:2 STBC:1 MCS:5 ChannelCoding:{ 'BCC'} GuardInterval: '长' 的GroupID:63 PartialAID:275波束形成:0 PSDULength:1167

vht - siga提供的信息允许计算接收波形中后续字段的位置。

%获取VHT-LTF和VHT-Data字段的起始和结束索引%使用检索到的数据包参数idxVHTLTF = wlanFieldIndices (cfgVHTRx,'VHT-LTF');idxVHTSIGB = wlanFieldIndices(cfgVHTRx,'VHT-SIG-B');idxVHTData = wlanFieldIndices (cfgVHTRx,“VHT-Data”);%警告,如果波形不包含整个包如果(pktOffset + double(idxVHTData(2)))**没有足够的样本来恢复整个包**\n\n');结束

VHT-SIG-B解码

VHT-SIG-B的主要用途是用于在多用户分组的信令的用户信息。在单用户分组中的VHT-SIG-B携带其也可以使用L-SIG和VHT-SIG-A(其是体现在以上部分)计算的分组的长度。尽管不被需要解码单个用户数据包中,VHT-SIG-B被回收和下面的位解释。的VHT-SIG-B的符号使用从VHT-LTF获得的MIMO信道估计解调。注意VHT-SIG-B的CRC在VHT数据字段中携带。

使用VHT-LTF和检索的数据包参数%的估计MIMO信道demodVHTLTF = wlanVHTLTFDemodulate(RX(pktOffset +(idxVHTLTF(1):idxVHTLTF(2)),:),cfgVHTRx);chanEstVHTLTF = wlanVHTLTFChannelEstimate(demodVHTLTF,cfgVHTRx);%估计噪声功率在vht - sigb领域noiseVarVHT = helperNoiseEstimate(demodLLTF,chanBW,cfgVHTRx.NumSpaceTimeStreams);%VHT-SIG-B恢复DISP('解码VHT-SIG-B ......');[rxSIGBBits,eqSIGBSym] = wlanVHTSIGBRecover(RX(pktOffset +(idxVHTSIGB(1):idxVHTSIGB(2)),:),...chanEstVHTLTF、noiseVarVHT chanBW);%测量vht - sigb符号的EVM释放(维生素);EVM.ReferenceConstellation = wlanReferenceSymbols(“BPSK”);rmsEVM = EVM(eqSIGBSym);fprintf中(' vht - sigb EVM: %2.2f% RMS\n',rmsEVM);%解释VHT-SIG-B个比特来恢复APEP长度(上舍入到一% 4字节的倍数),并生成参考CRC位[refSIGBCRC,sigbAPEPLength] = helperInterpretSIGB(rxSIGBBits,chanBW,TRUE);DISP('解码VHT-SIG-B内容:');fprintf中('APEP长度(上舍入到4字节的倍数):%d字节\ n \ n',sigbAPEPLength);
解码VHT-SIG-B……RMS解码vht - sigb内容:APEP长度(四舍五入为4字节倍数):1052字节

VHT数据解码

然后重建的VHT配置对象可以被用于恢复VHT数据字段。这包括VHT-SIG-B的CRC位和PSDU。

恢复的VHT数据符号可以根据需要进行分析。在本例中,每个空间流显示恢复的VHT数据符号的均衡星座。

%获取单个流的信道估计chanEstSSPilots = vhtSingleStreamChannelEstimate(demodVHTLTF, cfgVHTRx);%从波形中提取VHT数据样本vhtdata = rx(pktOffset + (idxVHTData(1):idxVHTData(2)),:);估计VHT数据场的噪声功率noiseVarVHT = vhtNoiseEstimate(vhtdata,chanEstSSPilots,cfgVHTRx);使用检索到的包参数和信道来恢复PSDU位从VHT-LTF%估算DISP(“解码VHT数据字段……”);[rxPSDU, rxSIGBCRC, eqDataSym] = wlanVHTDataRecover(vhtdata, chanEstVHTLTF, noiseVarVHT, cfgVHTRx);%剧情均衡星座对于每个空间流refConst = wlanReferenceSymbols (cfgVHTRx);[Nsd, Nsym, Nss] = size(eqDataSym);eqDataSymPerSS =整形(eqDataSym, Nsd*Nsym, Nss);对于ISS = 1:Nss为constellationDiagram {ISS} .ReferenceConstellation = refConst;constellationDiagram {ISS}(eqDataSymPerSS(:,ISS));结束测量vht数据符号的EVM释放(维生素);EVM.ReferenceConstellation = refConst;rmsEVM = EVM(eqDataSym(:));fprintf中('VHT数据EVM:%2.2F %% RMS \ N',rmsEVM);
解码VHT数据字段…VHT-Data EVM: 4.68% RMS

对VHT-SIG-B的CRC位回收VHT数据进行比较,以本地产生的参考以确定所述VHT-SIG-B和VHT数据业务的比特已经是否成功地恢复。

%从VHT数据中的服务位测试VHT- sigb CRC%引用计算vht - sigb位如果~ isequal (refSIGBCRC rxSIGBCRC) disp ('** VHT-SIG-B CRC失败**');其他的DISP(“VHT-SIG-B CRC传递”);结束
VHT-SIG-B CRC通过

MAC帧中的FCS可以使用以下命令进行验证wlanMPDUDecode。作为一个VHT格式帧恢复时,PSDU中包含的A-MPDU。所述的MPDU是使用从A-MPDU中提取wlanAMPDUDeaggregate

mpduList = wlanAMPDUDeaggregate(rxPSDU, cfgVHTRx);fprintf中(A-MPDU中mpd的数量:%d\n',numel(mpduList));
的MPDU存在于A-MPDU的数目:1

mpduList包含的MPDU的解聚名单。列表中的每个MPDU被传递到wlanMPDUDecode这验证了FCS和MPDU解码。

对于i = 1:numel(mpduList) [macCfg,有效载荷,decodeStatus] = wlanMPDUDecode(mpduList{i}, cfgVHTRx,...“DataFormat”“八位字节”);如果STRCMP(decodeStatus,“FCSFailed”)流('** MPDU-%d **\n' FCS失败, 一世);其他的fprintf中('FCS过去了MPDU-%d \ N', 一世);结束结束
FCS通过了MPDU-1

附录

这个例子使用了以下的帮助函数:

选择的参考书目

  1. IEEE标准802.11ac的™-2013 IEEE信息技术标准 - 本地和城域网 - - 具体要求 - 第11部分系统间远程通信和信息交换:无线局域网媒体访问控制(MAC)和物理层(PHY)规范 - 修正案4:对于非常高通量操作中低于6 GHz频段增强。