Этот пример показывает, как измерить пакетный коэффициент ошибок высокоэффективной (HE) ссылки формата отдельного пользователя IEEE® 802.11ax™.
В этом примере сквозная симуляция используется, чтобы определить пакетный коэффициент ошибок для 802.11ax [1] ссылка формата отдельного пользователя для выбора точек ОСШ. В каждой точке ОСШ несколько пакетов передаются через шумный внутренний канал TGax, демодулируемый и восстановленный PSDUs. PSDUs сравниваются с переданными, чтобы определить пакетный коэффициент ошибок. Обработка для каждого пакета получена в итоге в следующей схеме.
Пакет отдельного пользователя (SU) HE является передачей полной полосы отдельному пользователю. Параметры передачи для формата HE-SU сконфигурированы с помощью объекта wlanHESUConfig. Свойства объекта содержат настройку. В этом примере объект сконфигурирован для пропускной способности канала на 20 МГц, 2 антенн передачи, 2 пространственно-временных потоков, никакого блочного кодирования времени пробела и 16-QAM rate-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 внутренняя модель канала используется с Моделью-B профиля задержки. Модель-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 = 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
Поскольку каждый ОСШ указывает, что много пакетов тестируются и пакетный вычисленный коэффициент ошибок. Преамбула предHE 802.11ax назад совместима с 802.11ac™, поэтому в этом примере, компоненты синхронизации фронтенда для формы волны VHT используются, чтобы синхронизировать форму волны HE в получателе. Для каждого пакета происходят выполняющие шаги обработки:
PSDU создается и кодируется, чтобы создать одну пакетную форму волны.
Форма волны передается через внутреннюю модель канала TGax. Различная реализация канала моделируется для различных пакетов.
AWGN добавляется к полученной форме волны, чтобы создать желаемый средний ОСШ на поднесущую после демодуляции OFDM. коммуникация. AWGNChannel сконфигурирован, чтобы обеспечить правильный ОСШ. Настройка составляет нормализацию в канале количеством, получают антенны и шумовую энергию в неиспользованных поднесущих, которые удалены во время демодуляции OFDM.
Пакет обнаруживается.
Крупное смещение несущей частоты оценивается и исправляется.
Прекрасная синхронизация синхронизации устанавливается. L-STF, L-LTF и выборки L-SIG обеспечиваются для прекрасной синхронизации, чтобы допускать пакетное обнаружение в запуске или конце L-STF.
Прекрасное смещение несущей частоты оценивается и исправляется.
HE-LTF извлечен от синхронизируемой полученной формы волны. HE-LTF является демодулируемым OFDM, и оценка канала выполняется.
Поле данных извлечено от синхронизируемой полученной формы волны и демодулируемого OFDM.
Общий ошибочный пилот фазы отслеживание выполняется, чтобы отследить любое остаточное смещение несущей частоты.
Шумовая оценка выполняется с помощью демодулируемых пилотов поля данных и оценки канала единого потока в экспериментальных поднесущих.
Исправленные символы фазы OFDM компенсируются с оценкой канала.
Компенсируемые символы демодулируются и декодируются, чтобы восстановить PSDU.
Цикл parfor может использоваться, чтобы параллелизировать обработку точек ОСШ, поэтому для каждой точки ОСШ, что канал AWGN создается и конфигурируется с коммуникацией. AWGNChannel. Чтобы включить использование параллельных вычислений для увеличенной скорости комментируют 'для' оператора и не комментируют '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); % 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 37 packets, PER:0.2973 MCS 3, SNR 25 completed after 100 packets, PER:0.03 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™/D3.1 для Информационных технологий - Телекоммуникаций и обмена информацией между системами - Локальными сетями и городскими компьютерными сетями - Конкретными требованиями - Часть 11: Беспроводное Среднее управление доступом (MAC) LAN и Физический уровень (PHY) Спецификации - Поправка 6: Улучшения для Высокой эффективности WLAN.