В этом примере показано, как измерить пакетный коэффициент ошибок IEEE® 802.11be™ Extremely High Throughput, многопользовательского (ЭХТ МУ) ссылка формата пакета с отдельным пользователем.
Этот пример определяет пакетный коэффициент ошибок для 802.11be [1] однопользовательская (SU) ссылка при помощи сквозной симуляции для выбора точек отношения сигнал-шум (SNR). В каждой точке ОСШ пример симулирует передачу нескольких пакетов через шумный внутренний канал TGax, затем демодулирует полученные пакеты и восстанавливает PSDUs. Пример затем сравнивает переданные и полученные пакеты, чтобы определить пакетный коэффициент ошибок. Эта схема показывает шаги обработки для каждого пакета.
Пакет ЭХТ МУ СУ является передачей полной полосы отдельному пользователю. Сконфигурируйте параметры передачи для формата пакета SU при помощи ehtMUConfig
объект. Свойства объекта содержат физический уровень (PHY) настройка.
Создайте объект настройки для передачи ЭХТ МУ, установив полосу пропускания канала 20 МГц, длину APEP 1 000 байтов, две передающих антенны, два пространственно-временных потока и модуляцию и кодируя схему (MCS) значение 13, который задает квадратурную амплитудную (4096-QAM) модуляцию с 4096 точками и уровень кодирования 5/6. Если вы задаете mcs
как вектор, пример выполняет симуляцию для каждого значения индекса MCS.
chanBW = 'CBW20'; % Channel bandwidth cfgEHT = ehtMUConfig(chanBW); cfgEHT.User{1}.APEPLength = 1e3; % APEP length (bytes) numTx = 2; % Number of transmit antennas numRx = 2; % Number of receive antennas cfgEHT.NumTransmitAntennas = numTx; cfgEHT.User{1}.NumSpaceTimeStreams = numTx; % Number of space-time streams mcs = 13; % MCS index
Этот пример использует не угол обзора (NLOS) TGax внутренняя модель канала с Моделью-B профиля задержки. Модель-B рассматривается NLOS, когда расстояние между передатчиком и приемником больше или равно 5 метрам. Для получения дополнительной информации о модели канала TGax, смотрите wlanTGaxChannel
.
% Create and configure a 2x2 MIMO channel. tgaxChannel = wlanTGaxChannel; tgaxChannel.DelayProfile = 'Model-B'; tgaxChannel.NumTransmitAntennas = cfgEHT.NumTransmitAntennas; tgaxChannel.NumReceiveAntennas = numRx; tgaxChannel.TransmitReceiveDistance = 5; % Distance in meters for NLOS tgaxChannel.ChannelBandwidth = chanBW; tgaxChannel.LargeScaleFadingEffect = 'None'; fs = wlanSampleRate(chanBW); tgaxChannel.SampleRate = fs;
Поскольку каждый ОСШ указывает в snrRange
, пример генерирует конкретное количество пакетов, передает пакеты через канал, затем демодулирует полученный сигнал определить пакетный коэффициент ошибок. Установите значения ОСШ в snrRange
параметр, чтобы симулировать переход от всех пакетов, декодируемых по ошибке ко всем пакетам, декодируемым успешно как повышения стоимости ОСШ для MCS 13. Если вы задаете snrRange
как матрица, каждая строка представляет точки ОСШ для соответствующего индекса MCS, заданного в mcs
.
snrRange = 37:5:57; % Set the range of SNR values
Эти параметры управляют количеством пакетов, протестированных на каждую точку ОСШ.
maxNumErrors
: максимальное количество пакетных ошибок симулировано для каждой точки ОСШ. Когда количество пакетных ошибок достигает этого предела, симуляция в этой точке ОСШ завершена.
maxNumPackets
: максимальное количество пакетов симулировало для каждой точки ОСШ, которая ограничивает продолжительность симуляции, если симуляция не достигает пакетного предела погрешности.
Значения параметров по умолчанию приводят к очень короткой симуляции. Для значимых результатов увеличьте эти значения.
maxNumErrors = 10; maxNumPackets = 100;
Этот раздел измеряет пакетный коэффициент ошибок для каждой точки ОСШ путем выполнения этих шагов обработки для конкретного количества пакетов.
Создайте PSDU и закодируйте, чтобы сгенерировать форму волны одно пакета.
Передайте форму волны через внутреннюю модель канала TGax, с помощью различной реализации канала для каждого пакета.
Добавьте AWGN в принятую форму волны, чтобы создать желаемый средний ОСШ на поднесущую после демодуляции OFDM. Настройка составляет нормализацию в канале количеством, получают антенны и шумовую энергию в неиспользованных поднесущих. Пример удаляет неиспользованные поднесущие во время демодуляции OFDM.
Обнаружьте пакет
Оцените и откорректируйте крупную несущую частоту возмещена (CFO)
Выполните прекрасную временную синхронизацию при помощи L-STF, L-LTF и выборок L-SIG. Эта синхронизация включает пакетное обнаружение в запуске или конце L-STF.
Оцените и откорректируйте прекрасный CFO
Извлеките EHT-LTF из синхронизируемой принятой формы волны
OFDM демодулируют EHT-LTF и выполняют оценку канала
Извлеките поле данных из синхронизируемой принятой формы волны и выполните демодуляцию OFDM
Отследите любой остаточный CFO путем выполнения общего ошибочного пилота фазы отслеживание
Выполните шумовую оценку при помощи демодулируемых пилотов поля данных и оценку канала единого потока в пилотных поднесущих
Компенсируйте откорректированные символы фазы OFDM при помощи оценки канала
Восстановите PSDU путем демодуляции и декодирования компенсируемых символов
Этот пример также демонстрирует, как ускорить симуляции при помощи parfor
цикл вместо for
цикл при симуляции каждой точки ОСШ. parfor
функция выполняет обработку для каждого ОСШ параллельно, чтобы уменьшать общее время симуляции. Используйте parfor
цикл, чтобы параллелизировать обработку точек ОСШ. Чтобы использовать параллельные вычисления для увеличенной скорости, закомментируйте for
оператор и некомментарий parfor
оператор в этом коде.
numSNR = size(snrRange,2); % Number of SNR points numMCS = numel(mcs); % Number of MCS packetErrorRate = zeros(numMCS,numSNR); for imcs = 1:numel(mcs) cfgEHT.User{1}.MCS = mcs(imcs); ofdmInfo = ehtOFDMInfo('EHT-Data',cfgEHT); % SNR points to simulate from MCS snr = snrRange(imcs,:); ind = ehtFieldIndices(cfgEHT); %parfor isnr = 1:numSNR % Use parfor to speed up the simulation for isnr = 1:numSNR % Use for to debug the simulation % 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); % Define the SNR per active subcarrier to account for noise energy % in nulls snrValue = 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 waveform txPSDU = randi([0 1],getPSDULength(cfgEHT)*8,1); % PSDULength (bytes) tx = ehtWaveformGenerator(txPSDU,cfgEHT); % Add trailing zeros to allow for channel delay txPad = [tx; zeros(50,cfgEHT.NumTransmitAntennas)]; % Pass through fading indoor TGax channel reset(tgaxChannel); % Reset channel for different realization rx = tgaxChannel(txPad); % Pass waveform through an AWGN channel rx = awgn(rx,snrValue); % Detect packet 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 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); % EHT-LTF demodulation and channel estimation rxHELTF = rx(pktOffset+(ind.EHTLTF(1):ind.EHTLTF(2)),:); heltfDemod = ehtDemodulate(rxHELTF,'EHT-LTF',cfgEHT); [chanEst,pilotEst] = ehtLTFChannelEstimate(heltfDemod,cfgEHT); % Demodulate the Data field rxData = rx(pktOffset+(ind.EHTData(1):ind.EHTData(2)),:); demodSym = ehtDemodulate(rxData,'EHT-Data',cfgEHT); % Perform pilot phase tracking demodSym = ehtCommonPhaseErrorTracking(demodSym,chanEst,cfgEHT); % Estimate noise power in EHT fields nVarEst = ehtNoiseEstimate(demodSym(ofdmInfo.PilotIndices,:,:),pilotEst,cfgEHT); % Extract data subcarriers from demodulated symbols and channel % estimate demodDataSym = demodSym(ofdmInfo.DataIndices,:,:); chanEstData = chanEst(ofdmInfo.DataIndices,:,:); % Equalization [eqSym,csi] = ehtEqualizeCombine(demodDataSym,chanEstData,nVarEst,cfgEHT); % Recover data field bits rxPSDU = ehtDataBitRecover(eqSym,nVarEst,csi,cfgEHT,1,'LDPCDecodingMethod','norm-min-sum'); % Determine if any bits are in error packetError = any(biterr(txPSDU,rxPSDU)); numPacketErrors = numPacketErrors+packetError; numPkt = numPkt+1; end % Calculate PER at SNR point packetErrorRate(imcs,isnr) = numPacketErrors/(numPkt-1); disp(['MCS ' num2str(mcs(imcs)) ','... ' SNR ' num2str(snr(isnr)) ... ' completed after ' num2str(numPkt-1) ' packets,'... ' PER:' num2str(packetErrorRate(imcs,isnr))]); end end
MCS 13, SNR 37 completed after 11 packets, PER:1 MCS 13, SNR 42 completed after 11 packets, PER:1 MCS 13, SNR 47 completed after 20 packets, PER:0.55 MCS 13, SNR 52 completed after 63 packets, PER:0.1746 MCS 13, SNR 57 completed after 100 packets, PER:0.01
markers = 'ox*sd^v><ph+ox*sd^v><ph+'; color = 'bmcrgbrkymcrbmcrgbrkymcr'; figure; for imcs = 1:numMCS semilogy(snrRange(imcs,:),packetErrorRate(imcs,:).',['-' markers(imcs) color(imcs)]); hold on; end grid on; xlabel('SNR (dB)'); ylabel('PER'); dataStr = arrayfun(@(x)sprintf('MCS %d',x),mcs,'UniformOutput',false); legend(dataStr,'Location','NorthEastOutside'); title(['PER (EHT MU), ' num2str(cfgEHT.ChannelBandwidth) ', Model-B, ' num2str(numTx) '-by-' num2str(numRx)]);
maxNumErrors
и maxNumPackets
параметры управляют количеством пакетов, протестированных на каждую точку ОСШ. Для значимых результатов увеличьте эти значения. Например, этот рисунок показывает результаты для полосы пропускания канала 320 МГц, длины APEP 16 000 байтов, значений MCS 0-13, maxNumErrors
значение 100, и maxNumPackets
значение 1 000. Соответствующие значения ОСШ для MCS между 0 и 13:
snrRange = [... 8:1:13; ... % MCS 0 8:2:18; ... % MCS 1 16:2:26; ... % MCS 2 18:2:28; ... % MCS 3 24:2:34; ... % MCS 4 26:2:36; ... % MCS 5 28:2:38; ... % MCS 6 32:2:42; ... % MCS 7 34:2:44; ... % MCS 8 36:2:46; ... % MCS 9 38:2:48; ... % MCS 10 42:2:52; ... % MCS 11 44:2:54; ... % MCS 12 45:3:60]; ...% MCS 13
Станд. IEEE Черновой Стандарт 802.11be™/D1.0 для Информационных технологий - Телекоммуникаций и обмена информацией между системными Локальными сетями и городскими компьютерными сетями - Конкретными требованиями - Часть 11: Беспроводное Среднее управление доступом (MAC) LAN и Физический уровень (PHY) Технические требования. Поправка 8: Улучшения для Чрезвычайно Высокой пропускной способности (EHT).