В этом примере показано, как измерить частоту ошибок пакета для линии связи формата IEEE ® 802.11ax™ с высоким КПД одиночного пользователя (HE SU) с различными уровнями квантования обратной связи формирования луча.
Формирование луча передачи фокусирует энергию в направлении приемника для улучшения SNR линии связи. В этой схеме передатчик называется формирователем луча, а приемник - формирователем луча. Матрица управления используется формирователем луча для направления энергии на формирователь луча. Матрица управления вычисляется с использованием информации о состоянии канала, полученной посредством измерений канала. Эти измерения получают путем зондирования канала между формирователем луча и формирователем луча. Для звучания канала формирователь луча посылает нулевой пакет данных (NDP) в формирователь луча. Формирователь луча измеряет информацию канала во время зондирования для вычисления матрицы обратной связи. Эта матрица сжимается в виде квантованных углов (phi и psi) и подается обратно в формирователь луча. Формирователь луча может затем вычислять матрицу обратной связи из квантованных углов, чтобы создать управляющую матрицу и передачи формы луча в формирователь луча. Процесс формирования матрицы управления показан в стандарте 802.11ac Transmit Beamforing.
В этом примере рассматривается конфигурация 4x2 MIMO между передатчиком и приемником с двумя пространственно-временными потоками, используемыми для каждой передачи пакета данных. Сквозное моделирование используется для определения частоты ошибок пакета (PER) для линии связи в формате 802.11ax [1] одного пользователя (SU) со сжатым квантованием обратной связи формирования луча для различных уровней квантования и выбора точек SNR. Формируется график, показывающий кривую PER vs SNR для каждого разрешения квантования. В этом примере группирование поднесущих не рассматривается (см. раздел 9.4.1.65 в [1]).

Пакет HE-SU представляет собой полнополосную передачу одному пользователю. Параметры передачи для формата HE-SU конфигурируются с использованием wlanHESUConfig объект. Свойства объекта содержат конфигурацию. В этом примере объект настроен для пропускной способности канала на 20 МГц, 4 передают антенны, 2 пространственно-временных потока и 16-QAM rate-1/2 (МГЦ 3).
NumTxAnts = 4; % Number of transmit antennas NumSTS = 2; % Number of space-time streams NumRxAnts = 2; % Number of receive antennas cfgHEBase = wlanHESUConfig; cfgHEBase.ChannelBandwidth = 'CBW20'; % Channel bandwidth cfgHEBase.NumSpaceTimeStreams = NumSTS; % Number of space-time streams cfgHEBase.NumTransmitAntennas = NumTxAnts; % Number of transmit antennas cfgHEBase.APEPLength = 1e3; % Payload length in bytes cfgHEBase.ExtendedRange = false; % Do not use extended range format cfgHEBase.Upper106ToneRU = false; % Do not use upper 106 tone RU cfgHEBase.PreHESpatialMapping = false; % Spatial mapping of pre-HE fields cfgHEBase.GuardInterval = 0.8; % Guard interval duration cfgHEBase.HELTFType = 4; % HE-LTF compression mode cfgHEBase.ChannelCoding = 'LDPC'; % Channel coding cfgHEBase.MCS = 3; % Modulation and coding scheme cfgHEBase.SpatialMapping = 'Custom'; % Custom for beamforming
Передача NDP сконфигурирована так, чтобы иметь нулевую длину данных. Поскольку NDP используется для получения информации о состоянии канала, количество пространственно-временных потоков равно количеству передающих антенн. Это приводит к прямому отображению каждого пространственно-временного потока на передающую антенну.
cfgNDP = cfgHEBase; cfgNDP.APEPLength = 0; % NDP has no data cfgNDP.NumSpaceTimeStreams = NumTxAnts; % For feedback matrix calculation cfgNDP.SpatialMapping = 'Direct'; % Each TxAnt carries a STS
В этом примере модель внутреннего канала TGax NLOS используется с профилем задержки Model-B. Профиль Model-B считается NLOS, когда расстояние между передатчиком и приемником больше или равно 5 метрам. Это описано далее в wlanTGaxChannel. В этом примере моделируется канал 4x2 MIMO.
% Create and configure the TGax channel chanBW = cfgHEBase.ChannelBandwidth; tgaxChannel = wlanTGaxChannel; tgaxChannel.DelayProfile = 'Model-B'; tgaxChannel.NumTransmitAntennas = NumTxAnts; tgaxChannel.NumReceiveAntennas = NumRxAnts; tgaxChannel.TransmitReceiveDistance = 5; % Distance in meters for NLOS tgaxChannel.ChannelBandwidth = chanBW; tgaxChannel.LargeScaleFadingEffect = 'None'; fs = wlanSampleRate(cfgHEBase); tgaxChannel.SampleRate = fs;
Этот пример сравнивает производительность формирования луча с двумя различными разрешениями квантования сжатия и без сжатия. Для каждого разрешения квантования выполняется моделирование от конца к концу с различными значениями SNR для определения частоты ошибок пакета. Проект 802.11ax 4.1 определяет только два набора разрешения квантования для формирования луча одного пользователя (таблица 9-31а в [1]). Значение codeBookSize определяет количество битов, используемых для квантования углов обратной связи формирования луча (phi и psi) в этом моделировании. Когда codeBookSize является Inf, сжатие не выполняется. Уровни квантования, выбранные codeBookSize показаны в таблице ниже:
codeBookSize Compression Configuration
--------------------------------------------------------
0 NumBitsphi = 4; NumBitspsi = 2
1 NumBitsphi = 6; NumBitspsi = 4
Inf No compression
--------------------------------------------------------codeBookSize = [0 1 Inf];
Количество пакетов генерируется, передается через канал и демодулируется для определения частоты ошибок пакетов для каждой конфигурации сжатия при каждом значении SNR (dB) в snr вектор.
snr = 10:2:18;
Количество пакетов, протестированных в каждой точке SNR, ограничено maxNumErrors или maxNumPackets:
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 в приемнике. Для каждого пакета выполняются следующие шаги обработки.
Формирователь луча получает управляющую матрицу путем передачи NDP, который обрабатывается формирователем луча для создания матрицы обратной связи:
Сигнал NDP передается через внутреннюю модель канала TGax. Различные реализации канала моделируются для различных пакетов.
AWGN добавляется к принятой форме сигнала для создания требуемого среднего SNR на поднесущую после демодуляции OFDM. comm.AWGNChannel сконфигурирован для обеспечения правильного SNR. Конфигурация учитывает нормализацию в канале по количеству приемных антенн и энергии шума в неиспользуемых поднесущих, которые удаляются во время демодуляции OFDM.
Пакет обнаруживается в виде луча.
Грубый сдвиг несущей частоты оценивается и корректируется.
Устанавливается точная синхронизация по времени. Выборки L-STF, L-LTF и L-SIG предусмотрены для точной синхронизации, чтобы обеспечить возможность обнаружения пакетов в начале или конце L-STF.
Оценивают и корректируют точный сдвиг несущей частоты.
HE-LTF извлекается из синхронизированного принятого сигнала. HE-LTF демодулируется OFDM и выполняется оценка канала.
Выполняют разложение сингулярного значения по оцененному каналу и вычисляют матрицу обратной связи формирования луча, V.
Если сжатие отсутствует, эта матрица обратной связи V будет использоваться в качестве матрицы управления формирователем луча.
Если используется сжатие, матрица обратной связи V будет сжата и квантована для создания набора углов, как указано в стандарте.
Формирователь луча передает пакет данных, используя восстановленную матрицу управления, и формирователь луча декодирует передачу данных в виде луча для восстановления PSDU:
Поскольку текущий пример предполагает нулевую задержку при получении обратной связи формирования луча от формирователя луча, квантованные углы преобразуются обратно в матрицу обратной связи формирования луча, V.
PSDU создается и кодируется для создания сигнала одного пакета с матрицей управления, установленной на матрицу обратной связи формирования луча, V.
Сигнал пропускается через тот же внутренний канал TGax, что и передача NDP.
AWGN добавляется к принятой форме сигнала.
Как и в случае NDP, выполняется синхронизация и оценка канала HE.
Поле данных извлекают из синхронизированного принятого сигнала и демодулируют OFDM.
Отслеживание пилот-сигнала с общей фазовой ошибкой выполняется для отслеживания любого остаточного сдвига несущей частоты.
Оценка шума выполняется с использованием пилот-сигналов демодулированного поля данных и оценки однопоточного канала на пилотных поднесущих.
Скорректированные по фазе символы OFDM выравниваются с оценкой канала.
Выровненные символы демодулируются и декодируются для восстановления PSDU.
A parfor шлейф может использоваться для параллельной обработки точек SNR. Чтобы разрешить использование параллельных вычислений для увеличения скорости комментировать оператор «for» и раскомментировать оператор «parfor» ниже.
numQuant = numel(codeBookSize); numSNR = numel(snr); % Number of SNR points packetErrorRate = zeros(numQuant,numSNR); % Get occupied subcarrier indices and OFDM parameters ofdmInfo = wlanHEOFDMInfo('HE-Data',cfgHEBase); % Indices to extract fields from the PPDU ind = wlanFieldIndices(cfgHEBase); indSound = wlanFieldIndices(cfgNDP); for ibf = 1:numQuant switch codeBookSize(ibf) % See P802.11ax/D4.1 Section 9.4.1.64 case 0 NumBitsPsi = 2; % Number of bits for psi NumBitsPhi = 4; % Number of bits for phi disp('End-to-End simulation with compressed beamforming quantization with'); disp(['Number of Bits for phi = ' num2str(NumBitsPhi) ... ' and Number of Bits for psi = ' num2str(NumBitsPsi)]); case 1 NumBitsPsi = 4; % Number of bits for psi NumBitsPhi = 6; % Number of bits for phi disp('End-to-End simulation with compressed beamforming quantization with'); disp(['Number of Bits for phi = ' num2str(NumBitsPhi) ... ' and Number of Bits for psi = ' num2str(NumBitsPsi)]); otherwise disp('End-to-End simulation with non-compressed beamforming'); end %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',100); 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); % Create an instance of the HE configuration object per SNR point % simulated. This will enable to use parfor cfgHE = cfgHEBase; % Loop to simulate multiple packets numPacketErrors = 0; numPkt = 1; % Index of packet transmitted while numPacketErrors<=maxNumErrors && numPkt<=maxNumPackets % Null data packet transmission tx = wlanWaveformGenerator([],cfgNDP); % Add trailing zeros to allow for channel delay txPad = [tx; zeros(50,cfgNDP.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); % Calculate the steering matrix at the beamformee V = heUserBeamformingFeedback(rx,cfgNDP,true); if isempty(V) % User feedback failed, packet error numPacketErrors = numPacketErrors+1; numPkt = numPkt+1; continue; % Go to next loop iteration end if ~isinf(codeBookSize(ibf)) % Find quantized angles of the beamforming feedback matrix angidx = bfCompressQuantize(V(:,1:NumSTS,:),NumBitsPhi,NumBitsPsi); % Calculate steering matrix from the quantized angles at % beamformer: % Assuming zero delay in transmitting the quantized angles % from beamformee to beamformer, the steering matrix is % calculated from the quantized angles and is used in the % data transmission of beamformer. [~,Nc,Nr] = size(V(1,1:NumSTS,:)); V = bfDecompress(angidx,Nr,Nc,NumBitsPhi,NumBitsPsi); end steeringMat = V(:,1:NumSTS,:); % Beamformed data transmission psduLength = getPSDULength(cfgHE); % PSDU length in bytes txPSDU = randi([0 1],psduLength*8,1); % Generate random PSDU cfgHE.SpatialMappingMatrix = steeringMat; 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 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 % Average single-stream pilot estimates over symbols (2nd dimension) pilotEstTrack = mean(pilotEst,2); demodSym = heCommonPhaseErrorTracking(demodSym,pilotEstTrack,cfgHE); % Estimate noise power in HE fields nVarEst = heNoiseEstimate(demodSym(ofdmInfo.PilotIndices,:,:),pilotEstTrack,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(ibf,isnr) = numPacketErrors/(numPkt-1); disp(['MCS ' num2str(cfgHE.MCS) ','... ' SNR ' num2str(snr(isnr)) ... ' completed after ' num2str(numPkt-1) ' packets,'... ' PER:' num2str(packetErrorRate(ibf,isnr))]); end disp(newline); end
End-to-End simulation with compressed beamforming quantization with Number of Bits for phi = 4 and Number of Bits for psi = 2 MCS 3, SNR 10 completed after 13 packets, PER:0.84615 MCS 3, SNR 12 completed after 54 packets, PER:0.2037 MCS 3, SNR 14 completed after 100 packets, PER:0.07 MCS 3, SNR 16 completed after 100 packets, PER:0 MCS 3, SNR 18 completed after 100 packets, PER:0 End-to-End simulation with compressed beamforming quantization with Number of Bits for phi = 6 and Number of Bits for psi = 4 MCS 3, SNR 10 completed after 13 packets, PER:0.84615 MCS 3, SNR 12 completed after 54 packets, PER:0.2037 MCS 3, SNR 14 completed after 100 packets, PER:0.06 MCS 3, SNR 16 completed after 100 packets, PER:0 MCS 3, SNR 18 completed after 100 packets, PER:0 End-to-End simulation with non-compressed beamforming MCS 3, SNR 10 completed after 13 packets, PER:0.84615 MCS 3, SNR 12 completed after 59 packets, PER:0.18644 MCS 3, SNR 14 completed after 100 packets, PER:0.06 MCS 3, SNR 16 completed after 100 packets, PER:0 MCS 3, SNR 18 completed after 100 packets, PER:0
figure; lineTypes = ["k-o" "b-s" "r-*"]; semilogy(snr,packetErrorRate(1,:),lineTypes(1)); hold on; grid on; xlabel('SNR (dB)'); ylabel('PER'); for ibf = 2:numQuant semilogy(snr,packetErrorRate(ibf,:),lineTypes(ibf)); end dataStr = [string(['Compressed Beamforming, ' newline ... 'NumBitsPhi = 4, NumBitsPsi = 2' newline])... string(['Compressed Beamforming, ' newline ... 'NumBitsPhi = 6, NumBitsPsi = 4' newline]) ... "Non-Compressed Beamforming"]; legend(dataStr); title(sprintf('802.11ax Beamforming PER for Channel %s, %s, %s',tgaxChannel.DelayProfile,cfgHEBase.ChannelBandwidth,cfgHEBase.ChannelCoding));

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

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