802.11ax восстановление сигнала с декодированием преамбулы

Этот пример показывает, как обнаружить пакет и декодировать биты полезной нагрузки в полученной форме волны IEEE® 802.11ax™. Получатель восстанавливает параметры формата пакета с полей преамбулы, чтобы декодировать поле данных и кадр MAC.

Введение

В 802.11ax пакет параметры передачи сообщены к получателю с помощью L-SIG, "SIG HE", и поля преамбулы HE-SIG-B [1]:

  • Поле L-SIG содержит информацию, чтобы позволить получателю определять время передачи пакета.

  • Поле HE-SIG-A содержит общие параметры передачи для пользователей HE-MU и все параметры передачи для пакетов HE-EXT-SU и HE-SU.

  • Комбинация информации о длине в поле L-SIG, типе модуляции и количестве символов OFDM в поле HE-SIG-A определяет формат пакета HE.

  • Поле HE-SIG-B содержит информацию о выделении Модуля ресурса (RU) и параметры передачи для пользователей в пакете HE-MU.

В этом примере мы обнаруживаем и декодируем пакет HE-MU в сгенерированной форме волны. Этот пример может также восстановить пакеты HE-EXT-SU и HE-SU. Все параметры передачи кроме пропускной способности канала приняты, чтобы быть неизвестными и поэтому получены из декодируемого L-SIG, "SIG HE", и поля преамбулы HE-SIG-B. Восстановленные параметры передачи используются, чтобы декодировать Поле данных HE. Кроме того, следующий анализ выполняется:

  • Форма волны обнаруженного пакета восстановлена и отображена.

  • Спектр обнаруженного пакета восстановлен и отображен.

  • Совокупность компенсируемых символов данных для всех пространственных потоков отображена.

  • Значение вектора ошибок (EVM) каждого поля измеряется.

  • AMPDU обнаруживается, и Последовательность проверки кадра (FCS) определяется для восстановленного кадра MAC.

Передача формы волны

В этом примере 802.11ax форма волны HE-MU сгенерирована локально, но можно использовать полученную форму волны. Можно использовать MATLAB®, чтобы получить данные I/Q из широкого спектра инструментов с платформами программно определяемого радио и Instrument Control Toolbox™.

Локально сгенерированной форме волны повреждают 2x2 TGax внутренний исчезающий канал, аддитивный белый Гауссов шум и смещение несущей частоты. Чтобы сгенерировать форму волны HE-MU локально, мы конфигурируем wlanHEMUConfig объекта настройки формата HE-MU. Обратите внимание на то, что wlanHEMUConfig объект настройки используется в стороне передатчика только. Получатель сформулирует объект настройки восстановления HE wlanHERecoveryConfig. Неизвестные свойства объекта настройки восстановления HE установлены после декодирования информационных битов в L-SIG, "SIG HE", и поля HE-SIG-B. Функция помощника heSigRecGenerateWaveform генерирует форму волны, которой повреждают, локально. Выполняющие шаги обработки выполняются:

  • Случайная полезная нагрузка MSDUs создается для кадра MAC, который закодирован в пакет HE-MU.

  • Форма волны передается через внутреннюю исчезающую модель канала TGax.

  • Несущая частота смещается (CFO) и Аддитивный белый гауссов шум (AWGN) добавляются к форме волны.

% A mixed OFDMA and MU-MIMO configuration is defined for an HE-MU packet.
% The allocation index 17 defines two 52-tone RUs, with one user in each
% RU, and one 106-tone RU. The 106-tone RU has two users in a MU-MIMO
% configuration.
cfgMU = wlanHEMUConfig(17);
cfgMU.NumTransmitAntennas = 2;

% Configure RU 1 and user 1
cfgMU.RU{1}.SpatialMapping = 'Direct';
cfgMU.User{1}.STAID = 1;
cfgMU.User{1}.APEPLength = 1e3;
cfgMU.User{1}.MCS = 5;
cfgMU.User{1}.NumSpaceTimeStreams = 2;
cfgMU.User{1}.ChannelCoding = 'LDPC';

% Configure RU 2 and user 2
cfgMU.RU{2}.SpatialMapping = 'Fourier';
cfgMU.User{2}.STAID = 2;
cfgMU.User{2}.APEPLength = 500;
cfgMU.User{2}.MCS = 4;
cfgMU.User{2}.NumSpaceTimeStreams = 1;
cfgMU.User{2}.ChannelCoding = 'BCC';

% Configure RU 3 and user 1
cfgMU.RU{3}.SpatialMapping = 'Fourier';
cfgMU.User{3}.STAID = 3;
cfgMU.User{3}.APEPLength = 100;
cfgMU.User{3}.MCS = 2;
cfgMU.User{3}.NumSpaceTimeStreams = 1;
cfgMU.User{3}.ChannelCoding = 'BCC';

% Configure RU 3 and user 2
cfgMU.User{4}.STAID = 4;
cfgMU.User{4}.APEPLength = 500;
cfgMU.User{4}.MCS = 3;
cfgMU.User{4}.NumSpaceTimeStreams = 1;
cfgMU.User{4}.ChannelCoding = 'LDPC';

% Specify propagation channel
numRx = 2; % Number of receive antennas
delayProfile = 'Model-D'; % TGax channel delay profile

% Specify impairments
noisePower = -40; % Noise power to apply in dBW
cfo = 62e3;       % Carrier frequency offset Hz

% Specify waveform parameters
numTxPkt = 1;     % Number of transmitted packets
idleTime = 20e-6; % Idle time before and after each packet

% Generate waveform
rx = heSigRecGenerateWaveform(cfgMU,numRx,delayProfile,noisePower,cfo,numTxPkt,idleTime);

Пакетное восстановление

Сигнал обработать хранится в переменной rx. Обработка продвигается, чтобы восстановиться, пакет:

  • Объект настройки восстановления HE, wlanHERecoveryConfig создается. Свойства объектов обновляются, когда поля преамбулы декодируются.

  • Пакет обнаруживается и синхронизируется.

  • L-LTF извлечен, чтобы определить канал и шумовые оценки.

  • Поля L-SIG и RL-SIG извлечены. Канал оценивается на дополнительных четырех поднесущие на подканал в полях L-SIG и RL-SIG. Оценки канала L-LTF обновляются, чтобы включать оценки канала на дополнительных поднесущих.

  • Информационные биты в поле L-SIG восстанавливаются, чтобы определить длину пакета в микросекундах.

  • Поле HE-SIG-A извлечено. Оба демодулируемых символа "SIG HE" и информация о длине в поле L-SIG используются, чтобы определить формат пакета HE. Формат пакета обновляется в объекте wlanHERecoveryConfig.

  • После декодирования "SIG HE", объект настройки восстановления обновляется с общими параметрами передачи для пакета HE-MU и всеми параметрами передачи для пакетов HE-EXT-SU и HE-SU.

  • Для формата пакета HE-MU декодируется поле HE-SIG-B. Для несжатой формы волны SIGB общее поле HE-SIG-B декодируется сначала сопровождаемое пользовательским полем HE-SIG-B. Для сжатой формы волны SIGB только декодируется пользовательское поле HE-SIG-B.

  • Для формата HE-MU без сжатия SIGB выделение RU и пользовательские параметры передачи восстанавливаются с поля HE-SIG-B. Для сжатой формы волны SIGB информация о выделении RU выведена из поля HE-SIG-A, и пользовательские параметры передачи определяются от пользовательских полевых битов HE-SIG-B.

  • Объект wlanHERecoveryConfig создается с помощью восстановленных параметров передачи для каждого пользователя после декодирования HE-SIG-B.

  • Поле HE-LTF извлечено, и канал оценивается на поднесущей, выделенной пользователю интереса. Оценки канала MIMO используются, чтобы декодировать Поле данных HE.

  • Поле данных HE извлечено, и биты PSDU восстанавливаются с помощью объекта wlanHERecoveryConfig для каждого пользователя.

  • Обнаружьте AMPDU в восстановленном PSDU и проверяйте FCS на восстановленный кадр MAC.

Параметры восстановления формы волны Setup

В этом примере все параметры передачи кроме пропускной способности канала приняты, чтобы быть неизвестными и будут восстановлены. Объект настройки восстановления, wlanHERecoveryConfig, создается, чтобы хранить восстановленную информацию в L-SIG, "SIG HE", и поля преамбулы HE-SIG-B. Свойства передачи в wlanHERecoveryConfig обновляются после последующего декодирования полей преамбулы. Следующий код конфигурирует объекты и переменные для обработки.

chanBW = cfgMU.ChannelBandwidth; % Assume channel bandwidth is known
sr = wlanSampleRate(cfgMU); % Sample rate

% Create an HE recovery configuration object and set the channel bandwidth
cfgRx = wlanHERecoveryConfig;
cfgRx.ChannelBandwidth = chanBW;

% The recovery configuration object is used to get the start and end
% indices of the pre-HE-SIG-B field.
ind = wlanFieldIndices(cfgRx);

% Setup plots for the example
[spectrumAnalyzer,timeScope] = heSigRecSetupPlots(sr);

% Minimum packet length is 10 OFDM symbols
lstfLength = double(ind.LSTF(2));
minPktLen = lstfLength*5; % Number of samples in L-STF

rxWaveLen = size(rx,1);

Выйдите напрямую обработку

Обработка фронтенда состоит из пакетного обнаружения, крупного исправления смещения несущей частоты, синхронизируя синхронизацию и прекрасное исправление смещения несущей частоты. Цикл while используется, чтобы обнаружить и синхронизировать пакет в полученной форме волны. Демонстрационное смещение searchOffset используется, чтобы индексировать в rx, чтобы обнаружить пакет. Первый пакет в rx обнаруживается и обрабатывается. Если сбои синхронизации для обнаруженного пакета, демонстрационное индексное смещение searchOffset постепенно увеличивается, чтобы переместиться вне обработанного пакета в rx. Это повторяется, пока пакет успешно не обнаруживался и синхронизировался.

searchOffset = 0; % Offset from start of waveform in samples
while (searchOffset + minPktLen) <= rxWaveLen
    % Packet detection
    pktOffset = wlanPacketDetect(rx,chanBW,searchOffset);

    % Adjust packet offset
    pktOffset = searchOffset + pktOffset;
    if isempty(pktOffset) || (pktOffset + ind.LSIG(2) > rxWaveLen)
        error('** No packet detected **');
    end

    % Coarse frequency offset estimation and correction using L-STF
    LSTF = rx(pktOffset+(ind.LSTF(1):ind.LSTF(2)), :);
    coarseFreqOffset = wlanCoarseCFOEstimate(LSTF,chanBW);
    rx = helperFrequencyOffset(rx,sr,-coarseFreqOffset);

    % Symbol timing synchronization
    searchBufferLLTF = rx(pktOffset+(ind.LSTF(1):ind.LSIG(2)),:);
    pktOffset = pktOffset+wlanSymbolTimingEstimate(searchBufferLLTF,chanBW);

    % Fine frequency offset estimation and correction using L-STF
    rxLLTF = rx(pktOffset+(ind.LLTF(1):ind.LLTF(2)),:);
    fineFreqOffset = wlanFineCFOEstimate(rxLLTF,chanBW);
    rx = helperFrequencyOffset(rx,sr,-fineFreqOffset);

    % Timing synchronization complete: packet detected
    fprintf('Packet detected at index %d\n',pktOffset + 1);

    % Display estimated carrier frequency offset
    cfoCorrection = coarseFreqOffset + fineFreqOffset; % Total CFO
    fprintf('Estimated CFO: %5.1f Hz\n\n',cfoCorrection);

    break; % Front-end processing complete, stop searching for a packet
end
Packet detected at index 404
Estimated CFO: 61942.9 Hz

Канал L-LTF и шумовая оценка степени

Извлеките и демодулируйте L-LTF и выполните канал и шумовую оценку степени. Канал L-LTF и шумовые оценки степени используются, чтобы декодировать пред HE-LTF.

rxLLTF = rx(pktOffset+(ind.LLTF(1):ind.LLTF(2)),:);
lltfDemod = wlanHEDemodulate(rxLLTF,'L-LTF',chanBW);
lltfChanEst = wlanLLTFChannelEstimate(lltfDemod,chanBW);
noiseVar = helperNoiseEstimate(lltfDemod);

L-SIG и декодирование RL-SIG

Поле L-SIG используется, чтобы определить получить время или RXTIME, пакета. RXTIME вычисляется с помощью битов длины полезной нагрузки L-SIG. Поля L-SIG и RL-SIG восстанавливаются, чтобы выполнить оценку канала на дополнительных поднесущих в полях L-SIG и RL-SIG. Оценки канала lltfChanEst обновляются, чтобы включать оценки канала на дополнительных поднесущих в полях L-SIG и RL-SIG. Полезная нагрузка L-SIG декодируется с помощью оценки канала и шумовой степени, полученной из поля L-LTF. Свойство длины L-SIG в wlanHERecoveryConfig обновляется после декодирования L-SIG.

disp('Decoding L-SIG... ');
% Extract L-SIG and RL-SIG fields
rxLSIG = rx(pktOffset+(ind.LSIG(1):ind.RLSIG(2)),:);

% OFDM demodulate
helsigDemod = wlanHEDemodulate(rxLSIG,'L-SIG',chanBW);

% Estimate CPE and phase correct symbols
helsigDemod = preHECommonPhaseErrorTracking(helsigDemod,lltfChanEst,'L-SIG',chanBW);

% Estimate channel on extra 4 subcarriers per subchannel and create full
% channel estimate
preheInfo = wlanHEOFDMInfo('L-SIG',chanBW);
preHEChanEst = preHEChannelEstimate(helsigDemod,lltfChanEst,preheInfo.NumSubchannels);

% Average L-SIG and RL-SIG before equalization
helsigDemod = mean(helsigDemod,2);

% Equalize data carrying subcarriers, merging 20 MHz subchannels
[eqLSIGSym,csi] = preHESymbolEqualize(helsigDemod(preheInfo.DataIndices,:,:), ...
    preHEChanEst(preheInfo.DataIndices,:,:),noiseVar,preheInfo.NumSubchannels);

% Decode L-SIG field
[~,failCheck,lsigInfo] = wlanLSIGBitRecover(eqLSIGSym,noiseVar,csi);

if failCheck
    disp(' ** L-SIG check fail **');
else
    disp(' L-SIG check pass');
end
% Get the length information from the recovered L-SIG bits and update the
% L-SIG length property of the recovery configuration object
lsigLength = lsigInfo.Length;
cfgRx.LSIGLength = lsigLength;

% Measure EVM of L-SIG symbols
EVM = comm.EVM;
EVM.ReferenceSignalSource = 'Estimated from reference constellation';
EVM.Normalization = 'Average constellation power';
EVM.ReferenceConstellation = wlanReferenceSymbols('BPSK');
rmsEVM = EVM(eqLSIGSym);
fprintf(' L-SIG EVM: %2.2fdB\n\n',20*log10(rmsEVM/100));

% Calculate the receive time and corresponding number of samples in the
% packet
RXTime = ceil((lsigLength + 3)/3) * 4 + 20; % In microseconds
numRxSamples = round(RXTime * 1e-6 * sr);   % Number of samples in time

fprintf(' RXTIME: %dus\n',RXTime);
fprintf(' Number of samples in the packet: %d\n\n',numRxSamples);
Decoding L-SIG... 
 L-SIG check pass
 L-SIG EVM: -36.90dB

 RXTIME: 536us
 Number of samples in the packet: 10720

Форма волны и спектр обнаруженного пакета в rx отображены, учитывая расчетный RXTIME и соответствующее количество выборок.

sampleOffset = max((-lstfLength + pktOffset),1); % First index to plot
sampleSpan = numRxSamples + 2*lstfLength; % Number samples to plot
% Plot as much of the packet (and extra samples) as we can
plotIdx = sampleOffset:min(sampleOffset + sampleSpan,rxWaveLen);

% Configure timeScope to display the packet
timeScope.TimeSpan = sampleSpan/sr;
timeScope.TimeDisplayOffset = sampleOffset/sr;
timeScope.YLimits = [0 max(abs(rx(:)))];
timeScope(abs(rx(plotIdx,:)));
release(timeScope);

% Display the spectrum of the detected packet
spectrumAnalyzer(rx(pktOffset + (1:numRxSamples),:));
release(spectrumAnalyzer);

Обнаружение формата пакета

Информация о длине в поле L-SIG и четырех символах OFDM сразу после поля RL-SIG используется, чтобы определить формат пакета HE [1 фигура. 28-62].

disp('Detect packet format...');
rxSIGA = rx(pktOffset+(ind.HESIGA(1):ind.HESIGA(2)),:);
pktFormat = hePacketFormat(rxSIGA,preHEChanEst,lsigLength,noiseVar,chanBW);
fprintf('  %s packet detected\n\n',pktFormat);

% Update the packet format in the recovery object and recompute the field
% indices
cfgRx.PacketFormat = pktFormat;
ind = wlanFieldIndices(cfgRx);
Detect packet format...
  HE-MU packet detected

Декодирование "SIG HE"

Поле HE-SIG-A содержит настройку передачи пакета HE [1 Таблица. 28-19]. Оценка канала и шумовой степени, полученной из L-LTF, требуется, чтобы декодировать поле HE-SIG-A.

disp('Decoding HE-SIG-A...')
rxSIGA = rx(pktOffset+(ind.HESIGA(1):ind.HESIGA(2)),:);
sigaDemod = wlanHEDemodulate(rxSIGA,'HE-SIG-A',chanBW);
hesigaDemod = preHECommonPhaseErrorTracking(sigaDemod,preHEChanEst,'HE-SIG-A',chanBW);

% Equalize data carrying subcarriers, merging 20 MHz subchannels
preheInfo = wlanHEOFDMInfo('HE-SIG-A',chanBW);
[eqSIGASym,csi] = preHESymbolEqualize(hesigaDemod(preheInfo.DataIndices,:,:), ...
                                      preHEChanEst(preheInfo.DataIndices,:,:), ...
                                      noiseVar,preheInfo.NumSubchannels);
% Recover HE-SIG-A bits
[sigaBits,failCRC] = wlanHESIGABitRecover(eqSIGASym,noiseVar,csi);

% Perform the CRC on HE-SIG-A bits
if failCRC
    disp(' ** HE-SIG-A CRC fail **');
else
    disp(' HE-SIG-A CRC pass');
end

% Measure EVM of HE-SIG-A symbols
release(EVM);
if strcmp(pktFormat,'HE-EXT-SU')
    % The second symbol of an HE-SIG-A field for an HE-EXT-SU packet is
    % QBPSK.
    EVM.ReferenceConstellation = wlanReferenceSymbols('BPSK',[0 pi/2 0 0]);
    % Account for scaling of L-LTF for an HE-EXT-SU packet
    rmsEVM = EVM(eqSIGASym*sqrt(2));
else
    EVM.ReferenceConstellation = wlanReferenceSymbols('BPSK');
    rmsEVM = EVM(eqSIGASym);
end
fprintf(' HE-SIG-A EVM: %2.2fdB\n\n',20*log10(mean(rmsEVM)/100));
Decoding HE-SIG-A...
 HE-SIG-A CRC pass
 HE-SIG-A EVM: -35.19dB

Интерпретируйте Восстановленные биты "SIG HE"

Объект wlanHERecoveryConfig обновляется после интерпретации восстановленных битов "SIG HE" [1 Таблица. 28-19].

cfgRx = interpretHESIGABits(cfgRx,sigaBits);
ind = wlanFieldIndices(cfgRx); % Update field indices

Отобразите общую настройку передачи, полученную из поля HE-SIG-A для пакета HE-MU. Свойства, обозначенные-1, неизвестны или не определены. Связанные с неизвестным пользователем свойства обновляются после успешного декодирования поля HE-SIG-B.

disp(cfgRx)
  wlanHERecoveryConfig with properties:

                    PacketFormat: 'HE-MU'
                ChannelBandwidth: 'CBW20'
                      LSIGLength: 383
                 SIGBCompression: 0
                         SIGBMCS: 0
                         SIGBDCM: 0
          NumSIGBSymbolsSignaled: 5
                            STBC: 0
                 LDPCExtraSymbol: 0
             PreFECPaddingFactor: 4
                  PEDisambiguity: 0
                   GuardInterval: 3.2000
                       HELTFType: 4
                 NumHELTFSymbols: 2
                UplinkIndication: 0
                        BSSColor: 0
                    SpatialReuse: 0
                    TXOPDuration: 127
                     HighDoppler: 0
                 AllocationIndex: -1
       NumUsersPerContentChannel: -1
         RUTotalSpaceTimeStreams: -1
                          RUSize: -1
                         RUIndex: -1
                           STAID: -1
                             MCS: -1
                             DCM: -1
                   ChannelCoding: 'Unknown'
                     Beamforming: -1
             NumSpaceTimeStreams: -1
    SpaceTimeStreamStartingIndex: -1

Декодирование HE-SIG-B

Для пакета HE-MU поле HE-SIG-B содержит:

  • Информация о выделении RU для несжатой формы волны SIGB выведена из поля HE-SIG-B Common [1 Таблица. 28-23]. Для сжатой формы волны SIGB информация о выделении RU выведена из восстановленных битов "SIG HE".

  • Для несжатой формы волны SIGB количество символов HE-SIG-B обновляются в объекте wlanHERecoveryConfig. Символы только обновляются, если номер символов HE-SIG-B, обозначенных в поле HE-SIG-A, определяется к 15, и все каналы содержимого передают CRC. Количество символов HE-SIG-B, обозначенных в поле HE-SIG-A, не обновляется, если какое-либо довольное HE-SIG-B канал приводит CRC к сбою.

  • Пользовательские параметры передачи и для SIGB сжатые и для несжатые формы волны выведены из пользовательского поля HE-SIG-B [1 Таблица. 28-25, 28-26].

Оценка канала и шумовой степени, полученной из L-LTF, требуется, чтобы декодировать поле HE-SIG-B.

if strcmp(pktFormat,'HE-MU')
    fprintf('Decoding HE-SIG-B...\n');
    if ~cfgRx.SIGBCompression
        fprintf(' Decoding HE-SIG-B common field...\n');
        s = getSIGBLength(cfgRx);
        % Get common field symbols. The start of HE-SIG-B field is known
        rxSym = rx(pktOffset+(ind.HESIGA(2)+(1:s.NumSIGBCommonFieldSamples)),:);
        % Decode HE-SIG-B common field
        [status,cfgRx] = heSIGBCommonFieldDecode(rxSym,preHEChanEst,noiseVar,cfgRx);

        % CRC on HE-SIG-B content channels
        if strcmp(status,'Success')
            fprintf('  HE-SIG-B (common field) CRC pass\n');
        elseif strcmp(status,'ContentChannel1CRCFail')
            fprintf('  ** HE-SIG-B CRC fail for content channel-1\n **');
        elseif strcmp(status,'ContentChannel2CRCFail')
            fprintf('  ** HE-SIG-B CRC fail for content channel-2\n **');
        elseif any(strcmp(status,{'UnknownNumUsersContentChannel1','UnknownNumUsersContentChannel2'}))
            error('  ** Unknown packet length, discard packet\n **');
        else
            % Discard the packet if all HE-SIG-B content channels fail
            error('  ** HE-SIG-B CRC fail **');
        end
        % Update field indices as the number of HE-SIG-B symbols are
        % updated
        ind = wlanFieldIndices(cfgRx);
    end

    % Get complete HE-SIG-B field samples
    rxSigB = rx(pktOffset+(ind.HESIGB(1):ind.HESIGB(2)),:);
    fprintf(' Decoding HE-SIG-B user field... \n');
    % Decode HE-SIG-B user field
    [failCRC,cfgUsers] = heSIGBUserFieldDecode(rxSigB,preHEChanEst,noiseVar,cfgRx);

    % CRC on HE-SIG-B users
    if ~all(failCRC)
        fprintf('  HE-SIG-B (user field) CRC pass\n\n');
        numUsers = sum(cfgRx.NumUsersPerContentChannel);
    elseif all(failCRC)
        % Discard the packet if all users fail the CRC
        error('  ** HE-SIG-B CRC fail for all users **');
    else
        fprintf('  ** HE-SIG-B CRC fail for at least one user\n **');
        % Only process users with valid CRC
        numUsers = numel(cfgUsers);
    end

else % HE-SU, HE-EXT-SU
    cfgUsers = {cfgRx};
    numUsers = 1;
end
Decoding HE-SIG-B...
 Decoding HE-SIG-B common field...
  HE-SIG-B (common field) CRC pass
 Decoding HE-SIG-B user field... 
  HE-SIG-B (user field) CRC pass

Декодирование данных HE

Обновленный объект wlanHERecoveryConfig для каждого пользователя может затем использоваться, чтобы восстановить биты PSDU для каждого пользователя в Поле данных HE.

Восстановленные символы Данных HE могут анализироваться как требуется. В этом примере отображена компенсируемая совокупность восстановленных символов данных о HE для всех пользователей.

constellationDiagram = heSigEqualizeSetupPlots(numUsers);
fprintf('Decoding HE-Data...\n');
for iu = 1:numUsers
    % Get recovery configuration object for each user
    user = cfgUsers{iu};
    if strcmp(pktFormat,'HE-MU')
        fprintf(' Decoding User:%d, STAID:%d, RUSize:%d\n',iu,user.STAID,user.RUSize);
    else
        fprintf(' Decoding RUSize:%d\n',user.RUSize);
    end

    % HE-LTF demodulation and channel estimation
    rxHELTF = rx(pktOffset+(ind.HELTF(1):ind.HELTF(2)),:);
    heltfDemod = wlanHEDemodulate(rxHELTF,'HE-LTF',chanBW,user.GuardInterval, ...
        user.HELTFType,[user.RUSize user.RUIndex]);
    [chanEst,pilotEst] = heLTFChannelEstimate(heltfDemod,user);

    % HE-Data demodulate
    rxData = rx(pktOffset+(ind.HEData(1):ind.HEData(2)),:);
    demodSym = wlanHEDemodulate(rxData,'HE-Data',chanBW,user.GuardInterval, ...
        [user.RUSize user.RUIndex]);

    % Pilot phase tracking. Average single-stream pilot estimates over
    % symbols (2nd dimension)
    pilotEstTrack = mean(pilotEst,2);
    demodSym = heCommonPhaseErrorTracking(demodSym,pilotEstTrack,user);

    % Estimate noise power in HE fields
    preheInfo = wlanHEOFDMInfo('HE-Data',chanBW,user.GuardInterval,[user.RUSize user.RUIndex]);
    demodPilotSym = demodSym(preheInfo.PilotIndices,:,:);
    nVarEst = heNoiseEstimate(demodPilotSym,pilotEst,user);

    % Equalize
    [eqSym,csi] = heEqualizeCombine(demodSym,chanEst,nVarEst,user);

    % Discard pilot subcarriers
    eqSymUser = eqSym(preheInfo.DataIndices,:,:);
    csiData = csi(preheInfo.DataIndices,:);

    % Demap and decode bits
    rxPSDU = wlanHEDataBitRecover(eqSymUser,nVarEst,csiData,user);

    % Deaggregate the A-MPDU
    [mpduList,~,status] = wlanAMPDUDeaggregate(rxPSDU,wlanHESUConfig);
    if strcmp(status,'Success')
        fprintf('  AMPDU deaggregation successful \n');
    else
        fprintf('  AMPDU deaggregation unsuccessful \n');
    end

    % Decode the list of MPDUs and check the FCS for each MPDU
    for i = 1:numel(mpduList)
        [~,~,status] = wlanMPDUDecode(mpduList{i},wlanHESUConfig,'DataFormat','octets');
        if strcmp(status,'Success')
            fprintf('  FCS pass for MPDU:%d\n',i);
        else
            fprintf('  Decode fail for MPDU:%d\n',i);
        end
    end

    % Plot equalized constellation for all users
    modScheme = heModulationScheme(user);
    refConst = wlanReferenceSymbols(modScheme);
    [Nsd,Nsym,Nss] = size(eqSymUser);
    eqDataSymPerSS = reshape(eqSymUser,Nsd*Nsym,Nss);
    constellationDiagram{iu}.ReferenceConstellation = refConst;
    constellationDiagram{iu}(eqDataSymPerSS);
    release(constellationDiagram{iu});

    % Measure EVM of HE-Data symbols
    release(EVM);
    EVM.ReferenceConstellation = refConst;
    rmsEVM = EVM(eqSymUser(:));
    fprintf('  HE-Data EVM:%2.2fdB\n\n',20*log10(rmsEVM/100));
end
Decoding HE-Data...
 Decoding User:1, STAID:1, RUSize:52
  AMPDU deaggregation successful 
  FCS pass for MPDU:1
  HE-Data EVM:-28.85dB

 Decoding User:2, STAID:2, RUSize:52
  AMPDU deaggregation successful 
  FCS pass for MPDU:1
  HE-Data EVM:-39.68dB

 Decoding User:3, STAID:3, RUSize:106
  AMPDU deaggregation successful 
  FCS pass for MPDU:1
  HE-Data EVM:-28.22dB

 Decoding User:4, STAID:4, RUSize:106
  AMPDU deaggregation successful 
  FCS pass for MPDU:1
  HE-Data EVM:-31.69dB

Приложение

Этот пример использует следующие функции помощника:

Выбранная библиография

  1. Черновой Стандарт IEEE P802.11ax™/D3.1 для Информационных технологий - Телекоммуникаций и обмена информацией между системами - Локальными сетями и городскими компьютерными сетями - Конкретными требованиями - Часть 11: Беспроводное Среднее управление доступом (MAC) LAN и Физический уровень (PHY) Спецификации - Поправка 6: Улучшения для Высокой эффективности WLAN.

Для просмотра документации необходимо авторизоваться на сайте