В этом примере показано, как измерить частоту ошибок пакета для одной ссылки в формате пользователя 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;
Количество пакетов, протестированных в каждой точке ОСШ, управляется двумя параметрами:
maxNumErrors
- максимальное количество ошибок пакета, моделируемых в каждой точке ОСШ. Когда количество ошибок пакета достигает этого предела, симуляция в этой точке ОСШ завершена.
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 в приемнике. Для каждого пакета выполняются следующие шаги обработки:
PSDU создается и кодируется, чтобы создать одну форму волны пакета.
Форма волны передается через внутреннюю модель канала TGax. Различные реализации канала моделируются для различных пакетов.
AWGN добавляют к принятой форме волны, чтобы создать желаемый средний ОСШ на поднесущую после демодуляции OFDM. The comm.AWGNChannel
объект сконфигурирован для предоставления правильного ОСШ. Строение учитывает нормализацию в канале по количеству приемных антенн и энергии шума в неиспользованных поднесущих, которые удаляются во время демодуляции OFDM.
Пакет обнаружен.
Грубое смещение несущей частоты оценивают и корректируют.
Установлена точная временная синхронизация. Выборки L-STF, L-LTF и L-SIG предусмотрены для точной синхронизации, чтобы обеспечить обнаружение пакетов в начале или конце L-STF.
Хорошее смещение частоты несущей оценивается и корректируется.
HE-LTF извлекается из синхронизированной принятой формы волны. HE-LTF является демодулированным OFDM, и выполняется оценка канала.
Поле данных извлекается из синхронизированной принятой формы волны и демодулируется OFDM.
Отслеживание пилот-сигнала общей фазы ошибки выполняется, чтобы отслеживать любое остаточное смещение частоты несущей.
Оценка шума выполняется с использованием пилотных сигналов демодулированного поля данных и оценки канала с одним потоком на поднесущих пилот-сигнала.
Исправленные по фазе символы OFDM выравниваются с оценкой канала.
Уравненные символы демодулируются и декодируются, чтобы восстановить 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.
В этом примере используются следующие вспомогательные функции:
IEEE P802.11ax™/D4.1 Проект стандарта на информационные технологии - Телекоммуникации и обмен информацией между системами - Локальные и столичные сети - Особые требования - Часть 11: Спецификации управления доступом к среде беспроводной локальной сети (MAC) и физического Слоя (PHY) - Поправка 6: Усовершенствования для высокой Эффективности WLAN.