В этом примере показано, как обнаружить пакет и декодировать биты полезной нагрузки в полученной форме волны IEEE® 802.11ax™. Приемник восстанавливает параметры формата пакета с полей преамбулы, чтобы декодировать поле данных и систему координат MAC.
В 802.11ax пакет параметры передачи сообщены к приемнику с помощью L-SIG, "SIG HE", и поля преамбулы HE-SIG-B [1]:
Поле L-SIG содержит информацию, чтобы позволить приемнику определять время передачи пакета.
Поле HE-SIG-A содержит общие параметры передачи для пользователей HE-MU и все параметры передачи для пакетов HE-EXT-SU и HE-SU.
Комбинация информации о длине в поле L-SIG, типе модуляции и количестве символов OFDM в поле HE-SIG-A определяет формат пакета HE.
Поле HE-SIG-B содержит информацию о выделении Модуля ресурса (RU) и параметры передачи для пользователей в пакете HE-MU.
В этом примере мы обнаруживаем и декодируем пакет HE-MU в сгенерированной форме волны. Этот пример может также восстановить пакеты HE-EXT-SU и HE-SU. Все параметры передачи кроме пропускной способности канала приняты, чтобы быть неизвестными и поэтому получены из декодируемого L-SIG, "SIG HE", и поля преамбулы HE-SIG-B. Восстановленные параметры передачи используются, чтобы декодировать Поле данных HE. Кроме того, следующий анализ выполняется:
Форма волны обнаруженного пакета восстановлена и отображена.
Спектр обнаруженного пакета восстановлен и отображен.
Созвездие компенсируемых символов данных для всех пространственных потоков отображено.
Величина вектора ошибок (EVM) каждого поля измеряется.
A-MPDU обнаруживается, и Последовательность проверки системы координат (FCS) определяется для восстановленной системы координат MAC.
EVM на символ данных и пространственный поток, усредненный по поднесущим, отображен.
EVM на поднесущую данных и пространственный поток, усредненный по символам, отображен.
В этом примере 802.11ax синтезируется форма волны HE-MU, но можно использовать полученную форму волны. Можно использовать MATLAB®, чтобы получить данные I/Q из широкого спектра инструментов с платформами программно определяемого радио и Instrument Control Toolbox™.
Синтезируемой форме волны повреждают 2x2 TGax внутренний исчезающий канал, аддитивный белый Гауссов шум и смещение несущей частоты. Чтобы сгенерировать форму волны HE-MU, мы конфигурируем wlanHEMUConfig объекта настройки формата HE-MU. Обратите внимание на то, что wlanHEMUConfig объект настройки используется в стороне передатчика только. Приемник сформулирует объект настройки восстановления HE wlanHERecoveryConfig. Неизвестные свойства объекта настройки восстановления HE установлены после декодирования информационных битов в L-SIG, "SIG HE", и поля HE-SIG-B. Функция помощника heSigRecGenerateWaveform генерирует форму волны, которой повреждают. Выполняющие шаги обработки выполняются:
Случайная полезная нагрузка MSDUs создается для системы координат MAC, которая закодирована в пакет HE-MU.
Форма волны передается через внутреннюю исчезающую модель канала TGax.
Несущая частота возмещена (CFO) и Аддитивный белый Гауссов шум (AWGN) добавляются к форме волны.
% A mixed OFDMA and MU-MIMO configuration is defined for an HE-MU packet. % The allocation index 17 defines two 52-tone RUs, with one user in each % RU, and one 106-tone RU. The 106-tone RU has two users in a MU-MIMO % configuration. cfgMU = wlanHEMUConfig(17); cfgMU.NumTransmitAntennas = 2; % Configure RU 1 and user 1 cfgMU.RU{1}.SpatialMapping = 'Direct'; cfgMU.User{1}.STAID = 1; cfgMU.User{1}.APEPLength = 1e3; cfgMU.User{1}.MCS = 5; cfgMU.User{1}.NumSpaceTimeStreams = 2; cfgMU.User{1}.ChannelCoding = 'LDPC'; % Configure RU 2 and user 2 cfgMU.RU{2}.SpatialMapping = 'Fourier'; cfgMU.User{2}.STAID = 2; cfgMU.User{2}.APEPLength = 500; cfgMU.User{2}.MCS = 4; cfgMU.User{2}.NumSpaceTimeStreams = 1; cfgMU.User{2}.ChannelCoding = 'BCC'; % Configure RU 3 and user 1 cfgMU.RU{3}.SpatialMapping = 'Fourier'; cfgMU.User{3}.STAID = 3; cfgMU.User{3}.APEPLength = 100; cfgMU.User{3}.MCS = 2; cfgMU.User{3}.NumSpaceTimeStreams = 1; cfgMU.User{3}.ChannelCoding = 'BCC'; % Configure RU 3 and user 2 cfgMU.User{4}.STAID = 4; cfgMU.User{4}.APEPLength = 500; cfgMU.User{4}.MCS = 3; cfgMU.User{4}.NumSpaceTimeStreams = 1; cfgMU.User{4}.ChannelCoding = 'LDPC'; % Specify propagation channel numRx = 2; % Number of receive antennas delayProfile = 'Model-D'; % TGax channel delay profile % Specify impairments noisePower = -40; % Noise power to apply in dBW cfo = 62e3; % Carrier frequency offset Hz % Generate waveform rx = heSigRecGenerateWaveform(cfgMU,numRx,delayProfile,noisePower,cfo);
Сигнал обработать хранится в переменной rx
. Обработка продвигается, чтобы восстановиться, пакет:
Объект настройки восстановления HE, wlanHERecoveryConfig создается. Свойства объектов обновляются, когда поля преамбулы декодируются.
Пакет обнаруживается и синхронизируется.
L-LTF извлекается и демодулируется. Демодулируемые символы L-LTF не включают тональное вращение для каждого сегмента на 20 МГц как описано в [2], разделяют 21.3.7.5.
Демодулируемые символы L-LTF используются для канала и шумовых оценок.
Сигнал временной области, содержащий выборки, эквивалентные четырем символам OFDM сразу после L-LTF, используется, чтобы определить формат пакета HE. Формат пакета обновляется в объекте wlanHERecoveryConfig.
L-LTF демодулируется. Демодулируемые символы L-LTF включают тональное вращение для каждого сегмента на 20 МГц как описано в [2], разделяют 21.3.7.5. Оценки канала L-LTF (с тональным вращением) используются, чтобы декодировать pre-HE-LTF.
Поля L-SIG и RL-SIG извлечены. Канал оценивается на дополнительных четырех поднесущие на подканал в полях L-SIG и RL-SIG. Оценки канала L-LTF обновляются, чтобы включать оценки канала на дополнительных поднесущих.
Информационные биты в поле L-SIG восстанавливаются, чтобы определить длину пакета в микросекундах.
После декодирования "SIG HE", объект настройки восстановления обновляется общими параметрами передачи для пакета HE-MU и всеми параметрами передачи для пакетов HE-EXT-SU и HE-SU.
Для формата пакета HE-MU декодируется поле HE-SIG-B. Для несжатой формы волны SIGB общее поле HE-SIG-B декодируется сначала сопровождаемое пользовательским полем HE-SIG-B. Для сжатой формы волны SIGB только декодируется пользовательское поле HE-SIG-B.
Для формата HE-MU без сжатия SIGB выделение RU и пользовательские параметры передачи восстанавливаются с поля HE-SIG-B. Для сжатой формы волны SIGB информация о выделении RU выведена из поля HE-SIG-A, и пользовательские параметры передачи определяются из пользовательских полевых битов HE-SIG-B.
Объект wlanHERecoveryConfig создается с помощью восстановленных параметров передачи для каждого пользователя после декодирования HE-SIG-B.
Поле HE-LTF извлекается и демодулируется. Демодулируемые символы используются для оценки канала поднесущих, выделенных пользователю интереса. Оценки канала MIMO используются, чтобы декодировать Поле данных HE.
Поле данных HE извлечено, и биты PSDU восстанавливаются с помощью объекта wlanHERecoveryConfig для каждого пользователя.
Обнаружьте A-MPDU в восстановленном PSDU и проверяйте FCS на восстановленную систему координат MAC.
В этом примере все параметры передачи кроме пропускной способности канала приняты, чтобы быть неизвестными и будут восстановлены. Объект настройки восстановления, wlanHERecoveryConfig, создается, чтобы хранить восстановленную информацию в L-SIG, "SIG HE", и поля преамбулы HE-SIG-B. Свойства передачи в wlanHERecoveryConfig обновляются после последующего декодирования полей преамбулы. Следующий код конфигурирует объекты и переменные для обработки.
chanBW = cfgMU.ChannelBandwidth; % Assume channel bandwidth is known sr = wlanSampleRate(cfgMU); % Sample rate % Specify pilot tracking method for recovering the data field. This can be: % 'Joint' - use joint common phase error and sample rate offset tracking % 'CPE' - use only common phase error tracking % When recovering 26-tone RUs only CPE tracking is used as the joint % tracking algorithm is susceptible to noise. pilotTracking = 'Joint'; % Create an HE recovery configuration object and set the channel bandwidth cfgRx = wlanHERecoveryConfig; cfgRx.ChannelBandwidth = chanBW; % The recovery configuration object is used to get the start and end % indices of the pre-HE-SIG-B field. ind = wlanFieldIndices(cfgRx); % Setup plots for the example [spectrumAnalyzer,timeScope,ConstellationDiagram,EVMPerSubcarrier,EVMPerSymbol] = heSigRecSetupPlots(sr); % Minimum packet length is 10 OFDM symbols lstfLength = double(ind.LSTF(2)); minPktLen = lstfLength*5; % Number of samples in L-STF rxWaveLen = size(rx,1);
Обработка фронтенда состоит из пакетного обнаружения, крупной коррекции смещения несущей частоты, временной синхронизации и прекрасной коррекции смещения несущей частоты. while
цикл используется, чтобы обнаружить и синхронизировать пакет в полученной форме волны. Выборка возместила searchOffset
используется, чтобы индексировать в rx
обнаружить пакет. Первый пакет в rx
обнаруживается и обрабатывается. Если сбои синхронизации для обнаруженного пакета, демонстрационный индекс возместил searchOffset
постепенно увеличивается, чтобы переместиться вне обработанного пакета в rx
. Это повторяется, пока пакет успешно не обнаруживался и синхронизировался.
searchOffset = 0; % Offset from start of waveform in samples while (searchOffset + minPktLen) <= rxWaveLen % Packet detection pktOffset = wlanPacketDetect(rx,chanBW,searchOffset); % Adjust packet offset pktOffset = searchOffset + pktOffset; if isempty(pktOffset) || (pktOffset + ind.LSIG(2) > rxWaveLen) error('** No packet detected **'); end % Coarse frequency offset estimation and correction using L-STF rxLSTF = rx(pktOffset+(ind.LSTF(1):ind.LSTF(2)), :); coarseFreqOffset = wlanCoarseCFOEstimate(rxLSTF,chanBW); rx = helperFrequencyOffset(rx,sr,-coarseFreqOffset); % Symbol timing synchronization searchBufferLLTF = rx(pktOffset+(ind.LSTF(1):ind.LSIG(2)),:); pktOffset = pktOffset+wlanSymbolTimingEstimate(searchBufferLLTF,chanBW); % Fine frequency offset estimation and correction using L-STF rxLLTF = rx(pktOffset+(ind.LLTF(1):ind.LLTF(2)),:); fineFreqOffset = wlanFineCFOEstimate(rxLLTF,chanBW); rx = helperFrequencyOffset(rx,sr,-fineFreqOffset); % Timing synchronization complete: packet detected fprintf('Packet detected at index %d\n',pktOffset + 1); % Display estimated carrier frequency offset cfoCorrection = coarseFreqOffset + fineFreqOffset; % Total CFO fprintf('Estimated CFO: %5.1f Hz\n\n',cfoCorrection); break; % Front-end processing complete, stop searching for a packet end % Scale the waveform based on L-STF power (AGC) gain = 1./(sqrt(mean(rxLSTF.*conj(rxLSTF)))); rx = rx.*gain;
Packet detected at index 404 Estimated CFO: 61942.9 Hz
Выборки временного интервала, эквивалентные четырем символам OFDM сразу после L-LTF, используются, чтобы определить формат пакета HE [1 фигура. 27-63]. L-LTF извлекается и демодулируется. Для обнаружения формата демодулируемые символы L-LTF не должны включать тональное вращение для каждого сегмента на 20 МГц как описано в [2], разделять 21.3.7.5. Демодулируемый L-LTF используется для канала и шумовой оценки. Канал L-LTF (без тонального вращения) и шумовые оценки степени используется, чтобы обнаружить формат пакета.
rxLLTF = rx(pktOffset+(ind.LLTF(1):ind.LLTF(2)),:); lltfDemod = wlanLLTFDemodulate(rxLLTF,chanBW); lltfChanEst = wlanLLTFChannelEstimate(lltfDemod,chanBW); noiseVar = helperNoiseEstimate(lltfDemod); disp('Detect packet format...'); rxSIGA = rx(pktOffset+(ind.LSIG(1):ind.HESIGA(2)),:); pktFormat = wlanFormatDetect(rxSIGA,lltfChanEst,noiseVar,chanBW); fprintf(' %s packet detected\n\n',pktFormat); % Set the packet format in the recovery object and update the field indices cfgRx.PacketFormat = pktFormat; ind = wlanFieldIndices(cfgRx);
Detect packet format... HE-MU packet detected
Демодулируйте L-LTF и выполните оценку канала. Демодулируемые символы L-LTF включают тональное вращение для каждого сегмента на 20 МГц как описано в [2], разделяют 21.3.7.5. Оценки канала L-LTF (с тональным вращением) используются, чтобы компенсировать и декодировать поля pre-HE-LTF.
lltfDemod = wlanHEDemodulate(rxLLTF,'L-LTF',chanBW);
lltfChanEst = wlanLLTFChannelEstimate(lltfDemod,chanBW);
Поле L-SIG используется, чтобы определить получить время или RXTIME, пакета. RXTIME вычисляется с помощью битов длины полезной нагрузки L-SIG. Поля L-SIG и RL-SIG восстанавливаются, чтобы выполнить оценку канала на дополнительных поднесущих в полях L-SIG и RL-SIG. lltfChanEst
оценки канала обновляются, чтобы включать оценки канала на дополнительных поднесущих в полях L-SIG и RL-SIG. Полезная нагрузка L-SIG декодируется с помощью оценки канала и шумовой степени, полученной из поля L-LTF. Свойство длины L-SIG в wlanHERecoveryConfig обновляется после декодирования L-SIG.
disp('Decoding L-SIG... '); % Extract L-SIG and RL-SIG fields rxLSIG = rx(pktOffset+(ind.LSIG(1):ind.RLSIG(2)),:); % OFDM demodulate helsigDemod = wlanHEDemodulate(rxLSIG,'L-SIG',chanBW); % Estimate CPE and phase correct symbols helsigDemod = preHECommonPhaseErrorTracking(helsigDemod,lltfChanEst,'L-SIG',chanBW); % Estimate channel on extra 4 subcarriers per subchannel and create full % channel estimate preheInfo = wlanHEOFDMInfo('L-SIG',chanBW); preHEChanEst = preHEChannelEstimate(helsigDemod,lltfChanEst,preheInfo.NumSubchannels); % Average L-SIG and RL-SIG before equalization helsigDemod = mean(helsigDemod,2); % Equalize data carrying subcarriers, merging 20 MHz subchannels [eqLSIGSym,csi] = preHESymbolEqualize(helsigDemod(preheInfo.DataIndices,:,:), ... preHEChanEst(preheInfo.DataIndices,:,:),noiseVar,preheInfo.NumSubchannels); % Decode L-SIG field [~,failCheck,lsigInfo] = wlanLSIGBitRecover(eqLSIGSym,noiseVar,csi); if failCheck disp(' ** L-SIG check fail **'); else disp(' L-SIG check pass'); end % Get the length information from the recovered L-SIG bits and update the % L-SIG length property of the recovery configuration object lsigLength = lsigInfo.Length; cfgRx.LSIGLength = lsigLength; % Measure EVM of L-SIG symbols EVM = comm.EVM; EVM.ReferenceSignalSource = 'Estimated from reference constellation'; EVM.Normalization = 'Average constellation power'; EVM.ReferenceConstellation = wlanReferenceSymbols('BPSK'); rmsEVM = EVM(eqLSIGSym); fprintf(' L-SIG EVM: %2.2fdB\n\n',20*log10(rmsEVM/100)); % Calculate the receive time and corresponding number of samples in the % packet RXTime = ceil((lsigLength + 3)/3) * 4 + 20; % In microseconds numRxSamples = round(RXTime * 1e-6 * sr); % Number of samples in time fprintf(' RXTIME: %dus\n',RXTime); fprintf(' Number of samples in the packet: %d\n\n',numRxSamples);
Decoding L-SIG... L-SIG check pass L-SIG EVM: -36.91dB RXTIME: 536us Number of samples in the packet: 10720
Форма волны и спектр обнаруженного пакета в rx
отображен, учитывая расчетный RXTIME и соответствующее количество выборок.
sampleOffset = max((-lstfLength + pktOffset),1); % First index to plot sampleSpan = numRxSamples + 2*lstfLength; % Number samples to plot % Plot as much of the packet (and extra samples) as we can plotIdx = sampleOffset:min(sampleOffset + sampleSpan,rxWaveLen); % Configure timeScope to display the packet timeScope.TimeSpan = sampleSpan/sr; timeScope.TimeDisplayOffset = sampleOffset/sr; timeScope.YLimits = [0 max(abs(rx(:)))]; timeScope(abs(rx(plotIdx,:))); release(timeScope); % Display the spectrum of the detected packet spectrumAnalyzer(rx(pktOffset + (1:numRxSamples),:)); release(spectrumAnalyzer);
Поле HE-SIG-A содержит настройку передачи пакета HE. Оценка канала и шумовой степени, полученной из L-LTF, требуется, чтобы декодировать поле HE-SIG-A.
disp('Decoding HE-SIG-A...') rxSIGA = rx(pktOffset+(ind.HESIGA(1):ind.HESIGA(2)),:); sigaDemod = wlanHEDemodulate(rxSIGA,'HE-SIG-A',chanBW); hesigaDemod = preHECommonPhaseErrorTracking(sigaDemod,preHEChanEst,'HE-SIG-A',chanBW); % Equalize data carrying subcarriers, merging 20 MHz subchannels preheInfo = wlanHEOFDMInfo('HE-SIG-A',chanBW); [eqSIGASym,csi] = preHESymbolEqualize(hesigaDemod(preheInfo.DataIndices,:,:), ... preHEChanEst(preheInfo.DataIndices,:,:), ... noiseVar,preheInfo.NumSubchannels); % Recover HE-SIG-A bits [sigaBits,failCRC] = wlanHESIGABitRecover(eqSIGASym,noiseVar,csi); % Perform the CRC on HE-SIG-A bits if failCRC disp(' ** HE-SIG-A CRC fail **'); else disp(' HE-SIG-A CRC pass'); end % Measure EVM of HE-SIG-A symbols release(EVM); if strcmp(pktFormat,'HE-EXT-SU') % The second symbol of an HE-SIG-A field for an HE-EXT-SU packet is % QBPSK. EVM.ReferenceConstellation = wlanReferenceSymbols('BPSK',[0 pi/2 0 0]); % Account for scaling of L-LTF for an HE-EXT-SU packet rmsEVM = EVM(eqSIGASym*sqrt(2)); else EVM.ReferenceConstellation = wlanReferenceSymbols('BPSK'); rmsEVM = EVM(eqSIGASym); end fprintf(' HE-SIG-A EVM: %2.2fdB\n\n',20*log10(mean(rmsEVM)/100));
Decoding HE-SIG-A... HE-SIG-A CRC pass HE-SIG-A EVM: -35.17dB
Объект wlanHERecoveryConfig обновляется после интерпретации восстановленных битов "SIG HE".
cfgRx = interpretHESIGABits(cfgRx,sigaBits);
ind = wlanFieldIndices(cfgRx); % Update field indices
Отобразите общую настройку передачи, полученную из поля HE-SIG-A для пакета HE-MU. Свойства, обозначенные-1, неизвестны или не определены. Связанные с неизвестным пользователем свойства обновляются после успешного декодирования поля HE-SIG-B.
disp(cfgRx)
wlanHERecoveryConfig with properties: PacketFormat: 'HE-MU' ChannelBandwidth: 'CBW20' LSIGLength: 383 SIGBCompression: 0 SIGBMCS: 0 SIGBDCM: 0 NumSIGBSymbolsSignaled: 5 STBC: 0 LDPCExtraSymbol: 0 PreFECPaddingFactor: 4 PEDisambiguity: 0 GuardInterval: 3.2000 HELTFType: 4 NumHELTFSymbols: 2 UplinkIndication: 0 BSSColor: 0 SpatialReuse: 0 TXOPDuration: 127 HighDoppler: 0 AllocationIndex: -1 NumUsersPerContentChannel: -1 RUTotalSpaceTimeStreams: -1 RUSize: -1 RUIndex: -1 STAID: -1 MCS: -1 DCM: -1 ChannelCoding: 'Unknown' Beamforming: -1 NumSpaceTimeStreams: -1 SpaceTimeStreamStartingIndex: -1
Для пакета HE-MU поле HE-SIG-B содержит:
Информация о выделении RU для несжатой формы волны SIGB выведена из поля HE-SIG-B Common [1 Таблица. 27-23]. Для сжатой формы волны SIGB информация о выделении RU выведена из восстановленных битов "SIG HE".
Для несжатой формы волны SIGB количество символов HE-SIG-B обновляются в объекте wlanHERecoveryConfig. Символы только обновляются, если номер символов HE-SIG-B, обозначенных в поле HE-SIG-A, определяется к 15, и все каналы содержимого передают CRC. Количество символов HE-SIG-B, обозначенных в поле HE-SIG-A, не обновляется, если какое-либо довольное HE-SIG-B канал приводит CRC к сбою.
Пользовательские параметры передачи и для SIGB сжатые и для несжатые формы волны выведены из пользовательского поля HE-SIG-B [1 Таблица. 27-25, 27-26].
Оценка канала и шумовой степени, полученной из L-LTF, требуется, чтобы декодировать поле HE-SIG-B.
if strcmp(pktFormat,'HE-MU') fprintf('Decoding HE-SIG-B...\n'); if ~cfgRx.SIGBCompression fprintf(' Decoding HE-SIG-B common field...\n'); s = getSIGBLength(cfgRx); % Get common field symbols. The start of HE-SIG-B field is known rxSym = rx(pktOffset+(ind.HESIGA(2)+(1:s.NumSIGBCommonFieldSamples)),:); % Decode HE-SIG-B common field [status,cfgRx] = heSIGBCommonFieldDecode(rxSym,preHEChanEst,noiseVar,cfgRx); % CRC on HE-SIG-B content channels if strcmp(status,'Success') fprintf(' HE-SIG-B (common field) CRC pass\n'); elseif strcmp(status,'ContentChannel1CRCFail') fprintf(' ** HE-SIG-B CRC fail for content channel-1\n **'); elseif strcmp(status,'ContentChannel2CRCFail') fprintf(' ** HE-SIG-B CRC fail for content channel-2\n **'); elseif any(strcmp(status,{'UnknownNumUsersContentChannel1','UnknownNumUsersContentChannel2'})) error(' ** Unknown packet length, discard packet\n **'); else % Discard the packet if all HE-SIG-B content channels fail error(' ** HE-SIG-B CRC fail **'); end % Update field indices as the number of HE-SIG-B symbols are % updated ind = wlanFieldIndices(cfgRx); end % Get complete HE-SIG-B field samples rxSIGB = rx(pktOffset+(ind.HESIGB(1):ind.HESIGB(2)),:); fprintf(' Decoding HE-SIG-B user field... \n'); % Decode HE-SIG-B user field [failCRC,cfgUsers] = heSIGBUserFieldDecode(rxSIGB,preHEChanEst,noiseVar,cfgRx); % CRC on HE-SIG-B users if ~all(failCRC) fprintf(' HE-SIG-B (user field) CRC pass\n\n'); numUsers = numel(cfgUsers); elseif all(failCRC) % Discard the packet if all users fail the CRC error(' ** HE-SIG-B CRC fail for all users **'); else fprintf(' ** HE-SIG-B CRC fail for at least one user\n **'); % Only process users with valid CRC numUsers = numel(cfgUsers); end else % HE-SU, HE-EXT-SU cfgUsers = {cfgRx}; numUsers = 1; end
Decoding HE-SIG-B... Decoding HE-SIG-B common field... HE-SIG-B (common field) CRC pass Decoding HE-SIG-B user field... HE-SIG-B (user field) CRC pass
Обновленный объект wlanHERecoveryConfig для каждого пользователя может затем использоваться, чтобы восстановить биты PSDU для каждого пользователя в Поле данных HE.
cfgDataRec = trackingRecoveryConfig; cfgDataRec.PilotTracking = pilotTracking; fprintf('Decoding HE-Data...\n'); for iu = 1:numUsers % Get recovery configuration object for each user user = cfgUsers{iu}; if strcmp(pktFormat,'HE-MU') fprintf(' Decoding User:%d, STAID:%d, RUSize:%d\n',iu,user.STAID,user.RUSize); else fprintf(' Decoding RUSize:%d\n',user.RUSize); end heInfo = wlanHEOFDMInfo('HE-Data',chanBW,user.GuardInterval,[user.RUSize user.RUIndex]); % HE-LTF demodulation and channel estimation rxHELTF = rx(pktOffset+(ind.HELTF(1):ind.HELTF(2)),:); heltfDemod = wlanHEDemodulate(rxHELTF,'HE-LTF',chanBW,user.GuardInterval, ... user.HELTFType,[user.RUSize user.RUIndex]); [chanEst,pilotEst] = heLTFChannelEstimate(heltfDemod,user); % Number of expected data OFDM symbols symLen = heInfo.FFTLength+heInfo.CPLength; numOFDMSym = (ind.HEData(2)-ind.HEData(1)+1)/symLen; % HE-Data demodulation with pilot phase and timing tracking % Account for extra samples when extracting data field from the packet % for sample rate offset tracking. Extra samples may be required if the % receiver clock is significantly faster than the transmitter. maxSRO = 120; % Parts per million Ne = ceil(numRxSamples*maxSRO*1e-6); % Number of extra samples Ne = min(Ne,rxWaveLen-numRxSamples); % Limited to length of waveform numRxSamplesProcess = numRxSamples+Ne; rxData = rx(pktOffset+(ind.HEData(1):numRxSamplesProcess),:); if user.RUSize==26 % Force CPE only tracking for 26-tone RU as algorithm susceptible % to noise cfgDataRec.PilotTracking = 'CPE'; else cfgDataRec.PilotTracking = pilotTracking; end [demodSym,cpe,peg] = heTrackingOFDMDemodulate(rxData,chanEst,numOFDMSym,user,cfgDataRec); % Estimate noise power in HE fields demodPilotSym = demodSym(heInfo.PilotIndices,:,:); nVarEst = heNoiseEstimate(demodPilotSym,pilotEst,user); % Equalize [eqSym,csi] = heEqualizeCombine(demodSym,chanEst,nVarEst,user); % Discard pilot subcarriers eqSymUser = eqSym(heInfo.DataIndices,:,:); csiData = csi(heInfo.DataIndices,:); % Demap and decode bits rxPSDU = wlanHEDataBitRecover(eqSymUser,nVarEst,csiData,user,'LDPCDecodingMethod','layered-bp'); % Deaggregate the A-MPDU [mpduList,~,status] = wlanAMPDUDeaggregate(rxPSDU,wlanHESUConfig); if strcmp(status,'Success') fprintf(' A-MPDU deaggregation successful \n'); else fprintf(' A-MPDU deaggregation unsuccessful \n'); end % Decode the list of MPDUs and check the FCS for each MPDU for i = 1:numel(mpduList) [~,~,status] = wlanMPDUDecode(mpduList{i},wlanHESUConfig,'DataFormat','octets'); if strcmp(status,'Success') fprintf(' FCS pass for MPDU:%d\n',i); else fprintf(' FCS fail for MPDU:%d\n',i); end end % Plot equalized constellation of the recovered HE data symbols for all % spatial streams per user hePlotEQConstellation(eqSymUser,user,ConstellationDiagram,iu,numUsers); % Measure EVM of HE-Data symbols release(EVM); EVM.ReferenceConstellation = wlanReferenceSymbols(user); rmsEVM = EVM(eqSymUser(:)); fprintf(' HE-Data EVM:%2.2fdB\n\n',20*log10(rmsEVM/100)); % Plot EVM per symbol of the recovered HE data symbols hePlotEVMPerSymbol(eqSymUser,user,EVMPerSymbol,iu,numUsers); % Plot EVM per subcarrier of the recovered HE data symbols hePlotEVMPerSubcarrier(eqSymUser,user,EVMPerSubcarrier,iu,numUsers); end
Decoding HE-Data... Decoding User:1, STAID:1, RUSize:52 A-MPDU deaggregation successful FCS pass for MPDU:1 HE-Data EVM:-28.61dB Decoding User:2, STAID:2, RUSize:52 A-MPDU deaggregation successful FCS pass for MPDU:1 HE-Data EVM:-39.94dB Decoding User:3, STAID:3, RUSize:106 A-MPDU deaggregation successful FCS pass for MPDU:1 HE-Data EVM:-28.22dB Decoding User:4, STAID:4, RUSize:106 A-MPDU deaggregation successful FCS pass for MPDU:1 HE-Data EVM:-31.44dB
Этот пример использует следующие функции помощника:
Черновой Стандарт IEEE P802.11ax™/D4.1 для Информационных технологий - Телекоммуникаций и обмена информацией между системами - Локальными сетями и городскими компьютерными сетями - Конкретными требованиями - Часть 11: Беспроводное Среднее управление доступом (MAC) LAN и Физический уровень (PHY) Технические требования - Поправка 6: Улучшения для Высокой эффективности WLAN.
Станд. IEEE 802.11™-2016 Стандарт IEEE для Информационных технологий - Телекоммуникаций и обмена информацией между системами - Локальными сетями и городскими компьютерными сетями - Конкретными требованиями - Часть 11: Беспроводное Среднее управление доступом (MAC) LAN и Физический уровень (PHY) Технические требования.