В этом примере показано, как измерить частоту ошибок пакетов в канале IEEE ® 802.11ax™ высоким КПД (HE) однопользовательского формата.
В этом примере сквозное моделирование используется для определения частоты ошибок пакетов для линии связи в формате 802.11ax [1] одного пользователя для выбора точек SNR. В каждой точке SNR несколько пакетов передаются через шумный канал TGax в помещении, демодулируются и PSDU восстанавливаются. Блоки PSDU сравниваются с переданными блоками для определения частоты ошибок пакетов. Обработка для каждого пакета суммирована на следующей диаграмме.

Однопользовательский пакет (SU) HE представляет собой полнополосную передачу одному пользователю. Параметры передачи для формата HE SU конфигурируются с использованием wlanHESUConfig объект. Свойства объекта содержат конфигурацию. В этом примере объект настроен для пропускной способности канала на 20 МГц, 2 передают антенны, 2 пространственно-временных потока, никакое космическое блочное кодирование времени и 16-QAM rate-1/2 (МГЦ 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. Модель-В считается NLOS, когда расстояние между передатчиком и приемником больше или равно 5 метрам. Это описано далее в wlanTGaxChannel. В этом примере моделируется канал 2x2 MIMO.
% 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 генерируют, пропускают через канал и демодулируют вектор, чтобы определить частоту ошибок пакета.
snr = 10:5:35;
Количество пакетов, протестированных в каждой точке SNR, контролируется двумя параметрами:
maxNumErrors - максимальное количество ошибок пакетов, моделируемых в каждой точке SNR. Когда количество ошибок пакетов достигает этого предела, моделирование в этой точке SNR завершается.
maxNumPackets является максимальным количеством пакетов, моделируемых в каждой точке SNR, и ограничивает продолжительность моделирования, если предел ошибок пакета не достигнут.
Выбранные в этом примере числа приведут к очень короткому моделированию. Для статистически значимых результатов мы рекомендуем увеличить эти числа.
maxNumErrors = 10; % The maximum number of packet errors at an SNR point maxNumPackets = 100; % The Maximum number of packets at an SNR point
Для каждой точки SNR тестируется количество пакетов и вычисляется частота ошибок пакетов. Преамбула pre-HE стандарта 802.11ax обратно совместима с 802.11ac™, поэтому в этом примере компоненты входной синхронизации для сигнала VHT используются для синхронизации сигнала HE в приемнике. Для каждого пакета выполняются следующие шаги обработки:
PSDU создается и кодируется для создания сигнала одного пакета.
Сигнал пропускают через внутреннюю модель канала TGax. Различные реализации канала моделируются для различных пакетов.
AWGN добавляется к принятой форме сигнала для создания требуемого среднего SNR на поднесущую после демодуляции OFDM. comm.AWGNChannel объект сконфигурирован для обеспечения правильного SNR. Конфигурация учитывает нормализацию в канале по количеству приемных антенн и энергии шума в неиспользуемых поднесущих, которые удаляются во время демодуляции OFDM.
Пакет обнаружен.
Грубый сдвиг несущей частоты оценивается и корректируется.
Устанавливается точная синхронизация по времени. Выборки L-STF, L-LTF и L-SIG предусмотрены для точной синхронизации, чтобы обеспечить возможность обнаружения пакетов в начале или конце L-STF.
Оценивают и корректируют точный сдвиг несущей частоты.
HE-LTF извлекается из синхронизированного принятого сигнала. HE-LTF демодулируется OFDM и выполняется оценка канала.
Поле данных извлекают из синхронизированного принятого сигнала и демодулируют OFDM.
Отслеживание пилот-сигнала с общей фазовой ошибкой выполняется для отслеживания любого остаточного сдвига несущей частоты.
Оценка шума выполняется с использованием пилот-сигналов демодулированного поля данных и оценки однопоточного канала на пилотных поднесущих.
Скорректированные по фазе символы OFDM выравниваются с оценкой канала.
Выровненные символы демодулируются и декодируются для восстановления PSDU.
A parfor шлейф может использоваться для параллельной обработки точек SNR, поэтому для каждой точки SNR создается и конфигурируется канал 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));

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

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