Симуляция частоты ошибок пакета 802.11ax для однопользовательского формата

В этом примере показано, как измерить частоту ошибок пакета для одной ссылки в формате пользователя IEEE ® 802.11ax™ высокой эффективностью (HE).

Введение

В этом примере сквозная симуляция используется, чтобы определить частоту ошибок пакета для одной ссылки пользовательского формата 802.11ax [1] для выбора точек ОСШ. В каждой точке ОСШ несколько пакетов передаются через шумный внутренний канал TGax, демодулируются и PSDU восстанавливаются. Блоки PSDU сравниваются с переданными для определения частоты ошибок пакета. Обработка для каждого пакета суммирована в следующей схеме.

Строение формы волны

Один пакет HE (SU) является полнополосной передачей одному пользователю. Параметры передачи для формата HE SU конфигурируются с помощью wlanHESUConfig объект. Свойства объекта содержат строение. В этом примере объект сконфигурирован для полосы пропускания канала 20 МГц, 2 передающих антенны, 2 пространственно-временных потока, отсутствия пространственного временного блочного кодирования и скорости 16-QAM-1/2 (MCS 3).

cfgHE = wlanHESUConfig;
cfgHE.ChannelBandwidth = 'CBW20';  % Channel bandwidth
cfgHE.NumSpaceTimeStreams = 2;     % Number of space-time streams
cfgHE.NumTransmitAntennas = 2;     % Number of transmit antennas
cfgHE.APEPLength = 1e3;            % Payload length in bytes
cfgHE.ExtendedRange = false;       % Do not use extended range format
cfgHE.Upper106ToneRU = false;      % Do not use upper 106 tone RU
cfgHE.PreHESpatialMapping = false; % Spatial mapping of pre-HE fields
cfgHE.GuardInterval = 0.8;         % Guard interval duration
cfgHE.HELTFType = 4;               % HE-LTF compression mode
cfgHE.ChannelCoding = 'LDPC';      % Channel coding
cfgHE.MCS = 3;                     % Modulation and coding scheme

Строение канала

В этом примере модель закрытого канала TGax NLOS используется с профилем задержки Model-B. Модель-B рассматривается как NLOS, когда расстояние между передатчиком и приемником больше или равно 5 метрам. Это описано далее в wlanTGaxChannel. В этом примере моделируется канал MIMO 2x2.

% Create and configure the TGax channel
chanBW = cfgHE.ChannelBandwidth;
tgaxChannel = wlanTGaxChannel;
tgaxChannel.DelayProfile = 'Model-B';
tgaxChannel.NumTransmitAntennas = cfgHE.NumTransmitAntennas;
tgaxChannel.NumReceiveAntennas = 2;
tgaxChannel.TransmitReceiveDistance = 5; % Distance in meters for NLOS
tgaxChannel.ChannelBandwidth = chanBW;
tgaxChannel.LargeScaleFadingEffect = 'None';
fs = wlanSampleRate(cfgHE);
tgaxChannel.SampleRate = fs;

Параметры симуляции

Для каждой точки ОСШ (дБ) в snr вектор генерируют, передают через канал и демодулируют, чтобы определить частоту ошибок пакета.

snr = 10:5:35;

Количество пакетов, протестированных в каждой точке ОСШ, управляется двумя параметрами:

  1. maxNumErrors - максимальное количество ошибок пакета, моделируемых в каждой точке ОСШ. Когда количество ошибок пакета достигает этого предела, симуляция в этой точке ОСШ завершена.

  2. maxNumPackets является максимальным количеством пакетов, моделируемых в каждой точке ОСШ, и ограничивает длину симуляции, если предел ошибки пакета не достигнут.

Числа, выбранные в этом примере, приведут к очень короткой симуляции. Для статистически значимых результатов мы рекомендуем увеличить эти цифры.

maxNumErrors = 10;   % The maximum number of packet errors at an SNR point
maxNumPackets = 100; % The Maximum number of packets at an SNR point

Обработка точек ОСШ

Для каждой точки ОСШ проверяется количество пакетов и вычисляется вероятность ошибки пакета. Преамбула pre-HE 802.11ax обратно совместима с 802.11ac™, поэтому в этом примере компоненты синхронизации front-end для формы волны VHT используются для синхронизации формы волны HE в приемнике. Для каждого пакета выполняются следующие шаги обработки:

  1. PSDU создается и кодируется, чтобы создать одну форму волны пакета.

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

  3. AWGN добавляют к принятой форме волны, чтобы создать желаемый средний ОСШ на поднесущую после демодуляции OFDM. The comm.AWGNChannel объект сконфигурирован для предоставления правильного ОСШ. Строение учитывает нормализацию в канале по количеству приемных антенн и энергии шума в неиспользованных поднесущих, которые удаляются во время демодуляции OFDM.

  4. Пакет обнаружен.

  5. Грубое смещение несущей частоты оценивают и корректируют.

  6. Установлена точная временная синхронизация. Выборки L-STF, L-LTF и L-SIG предусмотрены для точной синхронизации, чтобы обеспечить обнаружение пакетов в начале или конце L-STF.

  7. Хорошее смещение частоты несущей оценивается и корректируется.

  8. HE-LTF извлекается из синхронизированной принятой формы волны. HE-LTF является демодулированным OFDM, и выполняется оценка канала.

  9. Поле данных извлекается из синхронизированной принятой формы волны и демодулируется OFDM.

  10. Отслеживание пилот-сигнала общей фазы ошибки выполняется, чтобы отслеживать любое остаточное смещение частоты несущей.

  11. Оценка шума выполняется с использованием пилотных сигналов демодулированного поля данных и оценки канала с одним потоком на поднесущих пилот-сигнала.

  12. Исправленные по фазе символы OFDM выравниваются с оценкой канала.

  13. Уравненные символы демодулируются и декодируются, чтобы восстановить PSDU.

A parfor цикл может использоваться для параллелизации обработки точек ОСШ, поэтому для каждой точки ОСШ создается и конфигурируется канал AWGN при помощи comm.AWGNChannel объект. Чтобы обеспечить возможность использования параллельных вычислений для повышения скорости, закомментируйте оператора 'for' и раскомментируйте оператора 'parfor' ниже.

numSNR = numel(snr); % Number of SNR points
packetErrorRate = zeros(1,numSNR);

% Get occupied subcarrier indices and OFDM parameters
ofdmInfo = wlanHEOFDMInfo('HE-Data',cfgHE);

% Indices to extract fields from the PPDU
ind = wlanFieldIndices(cfgHE);

%parfor isnr = 1:numSNR % Use 'parfor' to speed up the simulation
for isnr = 1:numSNR
    % Set random substream index per iteration to ensure that each
    % iteration uses a repeatable set of random numbers
    stream = RandStream('combRecursive','Seed',99);
    stream.Substream = isnr;
    RandStream.setGlobalStream(stream);

    % Create an instance of the AWGN channel per SNR point simulated
    awgnChannel = comm.AWGNChannel;
    awgnChannel.NoiseMethod = 'Signal to noise ratio (SNR)';
    awgnChannel.SignalPower = 1/tgaxChannel.NumReceiveAntennas;
    % Account for noise energy in nulls so the SNR is defined per
    % active subcarrier
    awgnChannel.SNR = snr(isnr)-10*log10(ofdmInfo.FFTLength/ofdmInfo.NumTones);

    % Loop to simulate multiple packets
    numPacketErrors = 0;
    numPkt = 1; % Index of packet transmitted
    while numPacketErrors<=maxNumErrors && numPkt<=maxNumPackets
        % Generate a packet with random PSDU
        psduLength = getPSDULength(cfgHE); % PSDU length in bytes
        txPSDU = randi([0 1],psduLength*8,1);
        tx = wlanWaveformGenerator(txPSDU,cfgHE);

        % Add trailing zeros to allow for channel delay
        txPad = [tx; zeros(50,cfgHE.NumTransmitAntennas)];

        % Pass through a fading indoor TGax channel
        reset(tgaxChannel); % Reset channel for different realization
        rx = tgaxChannel(txPad);

        % Pass the waveform through AWGN channel
        rx = awgnChannel(rx);

        % Packet detect and determine coarse packet offset
        coarsePktOffset = wlanPacketDetect(rx,chanBW);
        if isempty(coarsePktOffset) % If empty no L-STF detected; packet error
            numPacketErrors = numPacketErrors+1;
            numPkt = numPkt+1;
            continue; % Go to next loop iteration
        end

        % Extract L-STF and perform coarse frequency offset correction
        lstf = rx(coarsePktOffset+(ind.LSTF(1):ind.LSTF(2)),:);
        coarseFreqOff = wlanCoarseCFOEstimate(lstf,chanBW);
        rx = helperFrequencyOffset(rx,fs,-coarseFreqOff);

        % Extract the non-HT fields and determine fine packet offset
        nonhtfields = rx(coarsePktOffset+(ind.LSTF(1):ind.LSIG(2)),:);
        finePktOffset = wlanSymbolTimingEstimate(nonhtfields,chanBW);

        % Determine final packet offset
        pktOffset = coarsePktOffset+finePktOffset;

        % If packet detected outwith the range of expected delays from
        % the channel modeling; packet error
        if pktOffset>50
            numPacketErrors = numPacketErrors+1;
            numPkt = numPkt+1;
            continue; % Go to next loop iteration
        end

        % Extract L-LTF and perform fine frequency offset correction
        rxLLTF = rx(pktOffset+(ind.LLTF(1):ind.LLTF(2)),:);
        fineFreqOff = wlanFineCFOEstimate(rxLLTF,chanBW);
        rx = helperFrequencyOffset(rx,fs,-fineFreqOff);

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

        % Data demodulate
        rxData = rx(pktOffset+(ind.HEData(1):ind.HEData(2)),:);
        demodSym = wlanHEDemodulate(rxData,'HE-Data',cfgHE);

        % Pilot phase tracking
        demodSym = heCommonPhaseErrorTracking(demodSym,chanEst,cfgHE);

        % Estimate noise power in HE fields
        nVarEst = heNoiseEstimate(demodSym(ofdmInfo.PilotIndices,:,:),pilotEst,cfgHE);

        % Extract data subcarriers from demodulated symbols and channel
        % estimate
        demodDataSym = demodSym(ofdmInfo.DataIndices,:,:);
        chanEstData = chanEst(ofdmInfo.DataIndices,:,:);

        % Equalization and STBC combining
        [eqDataSym,csi] = heEqualizeCombine(demodDataSym,chanEstData,nVarEst,cfgHE);

        % Recover data
        rxPSDU = wlanHEDataBitRecover(eqDataSym,nVarEst,csi,cfgHE,'LDPCDecodingMethod','layered-bp');

        % Determine if any bits are in error, i.e. a packet error
        packetError = ~isequal(txPSDU,rxPSDU);
        numPacketErrors = numPacketErrors+packetError;
        numPkt = numPkt+1;
    end

    % Calculate packet error rate (PER) at SNR point
    packetErrorRate(isnr) = numPacketErrors/(numPkt-1);
    disp(['MCS ' num2str(cfgHE.MCS) ','...
          ' SNR ' num2str(snr(isnr)) ...
          ' completed after ' num2str(numPkt-1) ' packets,'...
          ' PER:' num2str(packetErrorRate(isnr))]);
end
MCS 3, SNR 10 completed after 11 packets, PER:1
MCS 3, SNR 15 completed after 17 packets, PER:0.64706
MCS 3, SNR 20 completed after 52 packets, PER:0.21154
MCS 3, SNR 25 completed after 100 packets, PER:0.02
MCS 3, SNR 30 completed after 100 packets, PER:0
MCS 3, SNR 35 completed after 100 packets, PER:0

Постройте график частоты ошибок пакета по сравнению с ОСШ

figure;
semilogy(snr,packetErrorRate,'-*');
hold on;
grid on;
xlabel('SNR (dB)');
ylabel('PER');
dataStr = arrayfun(@(x)sprintf('MCS %d',x),cfgHE.MCS,'UniformOutput',false);
legend(dataStr);
title(sprintf('PER for HE Channel %s, %s, %s, PSDULength: %d',tgaxChannel.DelayProfile,cfgHE.ChannelBandwidth,cfgHE.ChannelCoding,cfgHE.APEPLength));

Количество пакетов, протестированных в каждой точке ОСШ, управляется двумя параметрами: maxNumErrors и maxNumPackets. Для значимых результатов эти значения должны быть больше, чем значения, представленные в этом примере. В качестве примера рисунок ниже был создан путем выполнения более длительной симуляции с maxNumErrors: 1e3 и maxNumPackets:1e4.

Приложение

В этом примере используются следующие вспомогательные функции:

Избранная библиография

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