主要内容

802.11ac报文的恢复过程

本示例演示如何检测数据包并解码接收到的IEEE®802.11ac™VHT波形中的有效负载位。接收端从前导字段恢复数据包格式参数以解码数据。

简介

在单用户802.11ac包中,传输参数使用L-SIG和VHT-SIG-A前导字段发送给接收器[1]:

  • L-SIG字段包含接收方判断报文传输时间的信息。

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

在本例中,我们检测并解码一个包含有效MAC帧的生成波形中的包,并使用帧检查序列(FCS)。除了信道带宽之外的所有传输参数都假定是未知的,因此从每个包中解码的L-SIG和VHT-SIG-A前导字段中检索。检索到的传输配置用于解码VHT- sig - b和VHT数据字段。此外,还进行了以下分析:

  • 显示检测到的报文波形。

  • 显示检测到的报文的频谱。

  • 显示每个空间流的均衡数据符号的星座。

  • 测量了各场的误差矢量幅度(EVM)。

波形传播

在本例中,本地生成802.11ac VHT单用户波形,但可以使用捕获波形。MATLAB®可以使用仪器控制工具箱™和软件定义的无线电平台从各种仪器中获取I/Q数据。

局部生成的波形受到3x3 TGac衰落信道、加性高斯白噪声和载波频率偏移的损害。为了在本地生成波形,我们配置了一个VHT包格式配置对象。注意VHT包配置对象只在发送端使用。当包被解码时,接收方将动态地制定另一个VHT配置对象。辅助函数vhtSigRecGenerateWaveform局部生成受损波形。helper函数中的处理步骤是:

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

  • 波形通过TGac衰落信道模型传递。

  • 波形中加入载波频率偏移量。

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

% VHT链路参数cfgVHTTx = wlanVHTConfig(...“ChannelBandwidth”“CBW80”...“NumTransmitAntennas”3,...“NumSpaceTimeStreams”, 2,...“SpatialMapping”“阿达玛”...“摘要”,真的,...“主持人”5,...“GuardInterval”“长”...“APEPLength”, 1052);%传播信道numRx = 3;%接收天线个数delayProfile =型号c的% TGac通道延迟配置文件%障碍noisePower = -30;%噪声功率适用于dBWCfo = 62e3;载频偏移百分比(Hz)生成的波形参数numTxPkt = 1;%发送的报文数idleTime = 20e-6;%每个包前后的空闲时间生成波形rx = vhtsigrecgenerate波形(cfgVHTTx, numRx,...delayProfile, noisePower, cfo, numTxPkt, idleTime);

包复苏

要处理的信号存储在变量中处方.恢复报文的处理步骤如下:

  • 检测并同步报文。

  • 日志含义检测报文格式。

  • 提取L-SIG字段并恢复其信息位,以确定以微秒为单位的数据包长度。

  • 提取VHT-SIG-A字段并恢复其信息位。

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

  • 提取VHT- ltf字段以执行MIMO信道估计,以解码VHT- sig - b和VHT Data字段。

  • 提取VHT-SIG-B字段并恢复其信息位。

  • 提取VHT-Data字段,并使用检索到的数据包参数恢复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, timeScope, constellationDiagram] = vhtSigRecSetupPlots(sr);最小包长度为10个OFDM符号lstfLen = double(idxLSTF(2));% L-STF中的样本数minPktLen = lstfLen*5;rxwaven = size(rx, 1);

前端处理

前端处理包括报文检测、粗载波频偏校正、定时同步和细载波频偏校正。一个循环用于检测和同步接收波形中的数据包。样本偏移量searchOffset用于索引数组中的元素处方检测报文。第一个包处方进行检测和处理。如果检测到的数据包同步失败,则采样索引偏移searchOffset是递增到超出处理的数据包处方.重复此过程,直到成功检测并同步数据包。

searchOffset = 0;%样本中波形开始的偏移量(searchOffset + minPktLen) <= rxwaven包检测pktOffset = wlanPacketDetect(rx, chanBW, searchOffset);调整数据包偏移量pktOffset = searchOffset + pktOffset;如果isempty(pktOffset) || (pktOffset + idxLSIG(2) > rxwaven) error('**未检测到数据包**');结束使用L-STF估计粗频偏LSTF = rx(pktOffset + (idxLSTF(1):idxLSTF(2)),:);coarseFreqOffset = wlanCoarseCFOEstimate(LSTF, chanBW);粗频偏补偿rx = frequencyOffset(rx,sr,-粗频偏移);符号定时同步LLTFSearchBuffer = rx(pktOffset+(idxLSTF(1):idxLSIG(2)),:);pktOffset = pktOffset+wlanSymbolTimingEstimate(LLTFSearchBuffer,chanBW);如果(pktOffset + minPktLen) > rxwaven fprintf('**没有足够的样本来恢复数据包**\n\n');打破结束%定时同步完成:检测到报文流('在索引%d\n\n检测到数据包', pktOffset + 1);使用L-LTF精细频偏估计LLTF = rx(pktOffset + (idxLLTF(1):idxLLTF(2)),:);fineFreqOffset = wlanFineCFOEstimate(LLTF, chanBW);%优良的频偏补偿rx = frequencyOffset(rx, sr, -fineFreqOffset);显示估计载波频率偏移cfoCorrection =粗freqoffset +细frereqoffset;CFO总数流('估计CFO: %5.1f Hz\n\n', cfoCorrection);打破前端处理完成,停止查找报文结束
估计CFO: 61954.3 Hz

格式检测

包的格式是使用紧接在L-LTF后面的三个OFDM符号来检测的。需要估计从L-LTF获得的信道和噪声功率。

使用L-LTF的信道估计LLTF = rx(pktOffset + (idxLLTF(1):idxLLTF(2)),:);demodLLTF = wlanLLTFDemodulate(LLTF, 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-LTF获得的信道功率和噪声功率的估计来解码L-SIG有效载荷。

恢复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符号EVMEVM = com .EVM;维生素。ReferenceSignalSource =“从参考星座估计”;维生素。ReferenceConstellation = wlanreferencesymbles (“BPSK”);rmsEVM = EVM(eqLSIGSym);流('L-SIG EVM: %2.2f%% RMS\n', rmsEVM);计算接收时间和相应的样本数量%包lengthBits = rxLSIGBits(6:17).';RXTime = ceil((bi2de(double(lengthBits)) + 3)/3) * 4 + 20;%的美国numRxSamples = RXTime * 1e-6 * sr;%接收时间内样品数量流(“RXTIME: % du \ n”, RXTime);流('包中的样本数:%d\n\n', numRxSamples);
解码L-SIG……L-SIG check pass L-SIG EVM: 1.83% RMS RXTIME: 84us packet中的采样数量:6720

内检测包的波形和频谱处方显示计算出的RXTIME和相应的样本数。

sampleOffset = max((-lstfLen + pktOffset), 1);绘制的第一个索引sampleSpan = numRxSamples + 2*lstfLen;%要绘图的样本数绘制尽可能多的包(和额外的样本)plotIdx = sampleOffset:min(sampleOffset + sampleSpan, rxwaven);%配置timeScope显示报文timeScope。TimeSpan = sampleSpan/sr;timeScope。TimeDisplayOffset = sampleOffset/sr;timeScope。YLimits = [0 max(abs(rx(:)))];timeScope (abs (rx (plotIdx,:)));显示检测到的报文的频谱频谱分析仪(rx(pktOffset + (1:numRxSamples),:));

VHT-SIG-A解码

VHT-SIG-A字段包含报文的传输配置。VHT-SIG-A位是使用从L-LTF获得的信道和噪声功率估计来恢复的。

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

辅助函数helperVHTConfigRecover返回VHT格式配置对象,cfgVHTRx,基于恢复的VHT-SIG-A和L-SIG比特。属性被设置为波形解码所不需要的默认值wlanVHTConfig对象的值,因此可能与cfgVHTTx.此类属性的示例包括NumTransmitAntennas而且SpatialMapping

通过检索报文参数创建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: 'Long' GroupID: 63 PartialAID: 275波束形成:0 PSDULength: 1167

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

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

VHT-SIG-B解码

VHT-SIG-B的主要用途是在多用户包中发送用户信息。在单用户包中,VHT-SIG-B携带包的长度,也可以使用L-SIG和VHT-SIG-A计算包的长度(在上面的部分中演示)。尽管不需要解码单用户数据包,VHT-SIG-B在下面被恢复并解释比特。使用从VHT-LTF获得的MIMO信道估计解调VHT-SIG-B符号。注意VHT- sig - b的CRC在VHT数据字段中携带。

使用VHT-LTF和检索的数据包参数估计MIMO通道demodVHTLTF = wlanVHTLTFDemodulate(rx(pktOffset + (idxVHTLTF(1):idxVHTLTF(2)),:), cfgVHTRx);chanEstVHTLTF = wlanVHTLTFChannelEstimate(demodVHTLTF, cfgVHTRx);估计VHT-SIG-B场的噪声功率noisevvht = helperNoiseEstimate(demodLLTF, chanBW, cfgVHTRx.NumSpaceTimeStreams);恢复disp (“解码VHT-SIG-B…”);[rxSIGBBits, eqSIGBSym] = wlanVHTSIGBRecover(rx(pktOffset + (idxVHTSIGB(1):idxVHTSIGB(2)),:),,...chanEstVHTLTF, noiseVarVHT, chanBW);测量VHT-SIG-B符号的EVM释放(维生素);维生素。ReferenceConstellation = wlanreferencesymbles (“BPSK”);rmsEVM = EVM(eqSIGBSym);流('VHT-SIG-B EVM: %2.2f%% RMS\n', rmsEVM);解析VHT-SIG-B位以恢复APEP长度(四舍五入到a%四个字节的倍数)并生成参考CRC位[refSIGBCRC, sigbAPEPLength] = helperInterpretSIGB(rxSIGBBits, chanBW, true);disp (解码的VHT-SIG-B内容);流(' APEP长度(四舍五入到4字节倍数):%d字节\n\n', sigbAPEPLength);
解码VHT-SIG-B……VHT-SIG-B EVM: 5.21% RMS解码的VHT-SIG-B内容:APEP长度(四舍五入到4字节倍数):1052字节

VHT数据解码

然后可以使用重构的VHT配置对象恢复VHT Data字段。这包括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-LTFdisp (“解码VHT数据域……”);[rxPSDU, rxSIGBCRC, eqDataSym] = wlanVHTDataRecover(vhtdata, chanEstVHTLTF, noisevvht, cfgVHTRx);为每个空间流绘制均衡星座refConst = wlanReferenceSymbols(cfgVHTRx);[Nsd, Nsym, Nss] = size(eqDataSym);eqDataSymPerSS =重塑(eqDataSym, Nsd*Nsym, Nss);iss = 1:Nss星座图{iss}。ReferenceConstellation = refConst;constellationDiagram{空间站}(eqDataSymPerSS (:, iss));结束测量VHT-Data符号的EVM释放(维生素);维生素。ReferenceConstellation = refConst;rmsEVM = EVM(eqDataSym(:));流('VHT-Data EVM: %2.2f%% RMS\n', rmsEVM);
解码VHT数据场…VHT-Data EVM: RMS为4.68%

然后将在VHT数据中恢复的VHT- sig - b的CRC位与本地生成的参考进行比较,以确定VHT- sig - b和VHT数据服务位是否已成功恢复。

从VHT数据内的服务位测试VHT- sig - b CRC%参考计算与VHT-SIG-B位如果~isequal(refSIGBCRC, rxSIGBCRC)'** 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);流(A-MPDU中存在的mpdu数量:%d\n元素个数(mpduList));
A-MPDU中mpdu个数:1

mpduList包含mpdu的去聚合列表。列表中的每个MPDU都被传递给wlanMPDUDecode它验证FCS并解码MPDU。

i = 1: nummel (mpduList) [macCfg, payload, decodeStatus] = wlanmpduecode (mpduList{i}, cfgVHTRx,...“DataFormat”“八位位组”);如果比较字符串(decodeStatus“FCSFailed”)流('** MPDU FCS失败-%d **\n',我);其他的流('FCS通过MPDU-%d\n',我);结束结束
FCS通过了MPDU-1

附录

本例使用了以下helper函数:

选定的参考书目

  1. IEEE Std 802.11™-2020。IEEE信息技术标准。系统间的电信和信息交换。局域网和城域网。特殊要求。第11部分:无线局域网介质访问控制(MAC)和物理层(PHY)规范。