В этом примере показано, как обнаружить пакет и декодировать биты полезной нагрузки в принятом сигнале IEEE ® 802.11ac™ VHT. Приемник восстанавливает параметры формата пакета из полей преамбулы для декодирования данных.
В однопользовательском пакете 802.11ac параметры передачи передаются в приемник с использованием полей преамбулы L-SIG и VHT-SIG-A [1]:
Поле L-SIG содержит информацию, позволяющую приемнику определять время передачи пакета.
Поле VHT-SIG-A содержит параметры передачи, включая схему модуляции и кодирования, количество пространственно-временных потоков и канальное кодирование.
В этом примере мы обнаруживаем и декодируем пакет в сформированной форме сигнала, содержащей допустимый кадр MAC с контрольной последовательностью кадров (FCS). Все параметры передачи, кроме полосы пропускания канала, считаются неизвестными и поэтому извлекаются из декодированных полей преамбулы L-SIG и VHT-SIG-A в каждом пакете. Извлеченная конфигурация передачи используется для декодирования полей данных VHT-SIG-B и VHT. Дополнительно проводят следующий анализ:
Отображается форма сигнала обнаруженного пакета.
Отображается спектр обнаруженного пакета.
Отображается совокупность выровненных символов данных на пространственный поток.
Измеряют величину вектора ошибки (EVM) каждого поля.
В этом примере однопользовательский сигнал VHT 802.11ac генерируется локально, но может использоваться захваченный сигнал. MATLAB ® может использоваться для получения данных I/Q от широкого спектра приборов с помощью Toolbox™ управления приборами и программно-определяемых радиоплатформ.
Локально генерируемая форма сигнала ухудшается посредством канала с замиранием 3x3 TGac, аддитивного белого гауссова шума и смещения несущей частоты. Для локальной генерации формы сигнала мы конфигурируем объект конфигурации формата пакета VHT. Следует отметить, что объект конфигурации пакета VHT используется только на стороне передатчика. Приемник будет динамически формулировать другой объект конфигурации VHT, когда пакет декодируется. Вспомогательная функция vhtSigRecGenerateWaveform генерирует нарушенную форму сигнала локально. В функции помощника выполняются следующие шаги обработки:
Правильный кадр MAC генерируется и кодируется в форму сигнала VHT.
Сигнал пропускают через модель канала с замиранием TGac.
Смещение несущей частоты добавляется к форме сигнала.
К форме сигнала добавляется аддитивный белый гауссов шум.
% VHT link parameters cfgVHTTx = wlanVHTConfig( ... 'ChannelBandwidth', 'CBW80', ... 'NumTransmitAntennas', 3, ... 'NumSpaceTimeStreams', 2, ... 'SpatialMapping', 'Hadamard', ... 'STBC', true, ... 'MCS', 5, ... 'GuardInterval', 'Long', ... 'APEPLength', 1052); % Propagation channel numRx = 3; % Number of receive antennas delayProfile = 'Model-C'; % TGac channel delay profile % Impairments noisePower = -30; % Noise power to apply in dBW cfo = 62e3; % Carrier frequency offset (Hz) % Generated waveform parameters numTxPkt = 1; % Number of transmitted packets idleTime = 20e-6; % Idle time before and after each packet % Generate waveform rx = vhtSigRecGenerateWaveform(cfgVHTTx, numRx, ... delayProfile, noisePower, cfo, numTxPkt, idleTime);
Сигнал для обработки сохраняется в переменной rx. Этапы обработки для восстановления пакета:
Пакет обнаружен и синхронизирован.
Обнаружен формат пакета.
Поле L-SIG извлекается, и его информационные биты восстанавливаются для определения длины пакета в микросекундах.
Извлекают поле VHT-SIG-A и восстанавливают его информационные биты.
Параметры формата пакета извлекаются из декодированных битов L-SIG и VHT-SIG-A.
Поле VHT-LTF извлекается для выполнения оценки канала MIMO для декодирования полей данных VHT-SIG-B и VHT.
Поле VHT-SIG-B извлекается, и его информационные биты восстанавливаются.
Поле VHT-Data извлекается, и биты PSDU и VHT-SIG-B CRC восстанавливаются, используя извлеченные параметры пакета.
Индексы начала и конца для некоторых полей преамбулы зависят от полосы пропускания канала, но не зависят от всех других параметров передачи. Эти индексы вычисляются с использованием объекта конфигурации передачи по умолчанию с известной полосой пропускания.
cfgVHTRx = wlanVHTConfig('ChannelBandwidth', cfgVHTTx.ChannelBandwidth); idxLSTF = wlanFieldIndices(cfgVHTRx, 'L-STF'); idxLLTF = wlanFieldIndices(cfgVHTRx, 'L-LTF'); idxLSIG = wlanFieldIndices(cfgVHTRx, 'L-SIG'); idxSIGA = wlanFieldIndices(cfgVHTRx, 'VHT-SIG-A');
Следующий код настраивает объекты и переменные для обработки.
chanBW = cfgVHTTx.ChannelBandwidth; sr = wlanSampleRate(cfgVHTTx); % Setup plots for example [spectrumAnalyzer, timeScope, constellationDiagram] = vhtSigRecSetupPlots(sr); % Minimum packet length is 10 OFDM symbols lstfLen = double(idxLSTF(2)); % Number of samples in L-STF minPktLen = lstfLen*5; rxWaveLen = size(rx, 1);
Внешняя обработка состоит из обнаружения пакетов, грубой коррекции смещения несущей частоты, временной синхронизации и точной коррекции смещения несущей частоты. A 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 + idxLSIG(2) > rxWaveLen) error('** No packet detected **'); end % Coarse frequency offset estimation using L-STF LSTF = rx(pktOffset + (idxLSTF(1):idxLSTF(2)), :); coarseFreqOffset = wlanCoarseCFOEstimate(LSTF, chanBW); % Coarse frequency offset compensation rx = helperFrequencyOffset(rx,sr,-coarseFreqOffset); % Symbol timing synchronization LLTFSearchBuffer = rx(pktOffset+(idxLSTF(1):idxLSIG(2)),:); pktOffset = pktOffset+wlanSymbolTimingEstimate(LLTFSearchBuffer,chanBW); if (pktOffset + minPktLen) > rxWaveLen fprintf('** Not enough samples to recover packet **\n\n'); break; end % Timing synchronization complete: packet detected fprintf('Packet detected at index %d\n\n', pktOffset + 1); % Fine frequency offset estimation using L-LTF LLTF = rx(pktOffset + (idxLLTF(1):idxLLTF(2)), :); fineFreqOffset = wlanFineCFOEstimate(LLTF, chanBW); % Fine frequency offset compensation rx = helperFrequencyOffset(rx, sr, -fineFreqOffset); % 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
Packet detected at index 1600 Estimated CFO: 61954.3 Hz
Формат пакета определяется с использованием трех символов OFDM, непосредственно следующих за L-LTF. Требуется оценка мощности канала и шума, полученных от L-LTF.
% Channel estimation using L-LTF LLTF = rx(pktOffset + (idxLLTF(1):idxLLTF(2)), :); demodLLTF = wlanLLTFDemodulate(LLTF, chanBW); chanEstLLTF = wlanLLTFChannelEstimate(demodLLTF, chanBW); % Estimate noise power in non-HT fields noiseVarNonHT = helperNoiseEstimate(demodLLTF); % Detect the format of the packet fmt = wlanFormatDetect(rx(pktOffset + (idxLSIG(1):idxSIGA(2)), :), ... chanEstLLTF, noiseVarNonHT, chanBW); disp([fmt ' format detected']); if ~strcmp(fmt,'VHT') error('** A format other than VHT has been detected **'); end
VHT format detected
При передаче VHT поле L-SIG используется для определения времени приема или RXTIME пакета. RXTIME вычисляется с использованием битов поля полезной нагрузки L-SIG [1 Экв. 22-105]. Количество выборок, содержащих пакет в пределах rx затем можно рассчитать. Полезная нагрузка L-SIG декодируется с использованием оценки мощности канала и шума, полученной из L-LTF.
% Recover L-SIG field bits disp('Decoding L-SIG... '); [rxLSIGBits, failCheck, eqLSIGSym] = wlanLSIGRecover(rx(pktOffset + (idxLSIG(1):idxLSIG(2)), :), ... chanEstLLTF, noiseVarNonHT, chanBW); if failCheck % Skip L-STF length of samples and continue searching disp('** L-SIG check fail **'); else disp('L-SIG check pass'); end % Measure EVM of L-SIG symbol EVM = comm.EVM; EVM.ReferenceSignalSource = 'Estimated from reference constellation'; EVM.ReferenceConstellation = wlanReferenceSymbols('BPSK'); rmsEVM = EVM(eqLSIGSym); fprintf('L-SIG EVM: %2.2f%% RMS\n', rmsEVM); % Calculate the receive time and corresponding number of samples in the % packet lengthBits = rxLSIGBits(6:17).'; RXTime = ceil((bi2de(double(lengthBits)) + 3)/3) * 4 + 20; % us numRxSamples = RXTime * 1e-6 * sr; % Number of samples in receive time fprintf('RXTIME: %dus\n', RXTime); fprintf('Number of samples in packet: %d\n\n', numRxSamples);
Decoding L-SIG... L-SIG check pass L-SIG EVM: 1.83% RMS RXTIME: 84us Number of samples in packet: 6720
Форма сигнала и спектр обнаруженного пакета в пределах rx отображаются для вычисленного RXTIME и соответствующего количества выборок.
sampleOffset = max((-lstfLen + pktOffset), 1); % First index to plot sampleSpan = numRxSamples + 2*lstfLen; % Number of 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 ,:))); % Display the spectrum of the detected packet spectrumAnalyzer(rx(pktOffset + (1:numRxSamples), :));


Поле VHT-SIG-A содержит конфигурацию передачи пакета. Биты VHT-SIG-A восстанавливаются с использованием оценок мощности канала и шума, полученных из L-LTF.
% Recover VHT-SIG-A field bits disp('Decoding VHT-SIG-A... '); [rxSIGABits, failCRC, eqSIGASym] = wlanVHTSIGARecover(rx(pktOffset + (idxSIGA(1):idxSIGA(2)), :), ... chanEstLLTF, noiseVarNonHT, chanBW); if failCRC disp('** VHT-SIG-A CRC fail **'); else disp('VHT-SIG-A CRC pass'); end % Measure EVM of VHT-SIG-A symbols for BPSK and QBPSK modulation schemes release(EVM); EVM.ReferenceConstellation = wlanReferenceSymbols('BPSK'); rmsEVMSym1 = EVM(eqSIGASym(:,1)); release(EVM); EVM.ReferenceConstellation = wlanReferenceSymbols('QBPSK'); rmsEVMSym2 = EVM(eqSIGASym(:,2)); fprintf('VHT-SIG-A EVM: %2.2f%% RMS\n', mean([rmsEVMSym1 rmsEVMSym2]));
Decoding VHT-SIG-A... VHT-SIG-A CRC pass VHT-SIG-A EVM: 2.06% RMS
Вспомогательная функция helperVHTConfigRecover возвращает объект конфигурации формата VHT, cfgVHTRx, на основе восстановленных битов VHT-SIG-A и L-SIG. Свойства, которые не требуются для декодирования формы сигнала, устанавливаются в значения по умолчанию для wlanVHTConfig объект и, следовательно, может отличаться от значения в cfgVHTTx. Примеры таких свойств включают NumTransmitAntennas и SpatialMapping.
% Create a VHT format configuration object by retrieving packet parameters % from the decoded L-SIG and VHT-SIG-A bits cfgVHTRx = helperVHTConfigRecover(rxLSIGBits, rxSIGABits); % Display the transmission configuration obtained from VHT-SIG-A vhtSigRecDisplaySIGAInfo(cfgVHTRx);
Decoded VHT-SIG-A contents:
ChannelBandwidth: 'CBW80'
NumSpaceTimeStreams: 2
STBC: 1
MCS: 5
ChannelCoding: {'BCC'}
GuardInterval: 'Long'
GroupID: 63
PartialAID: 275
Beamforming: 0
PSDULength: 1167
Информация, предоставляемая VHT-SIG-A, позволяет вычислять местоположение последующих полей в принятой форме сигнала.
% Obtain starting and ending indices for VHT-LTF and VHT-Data fields % using retrieved packet parameters idxVHTLTF = wlanFieldIndices(cfgVHTRx, 'VHT-LTF'); idxVHTSIGB = wlanFieldIndices(cfgVHTRx, 'VHT-SIG-B'); idxVHTData = wlanFieldIndices(cfgVHTRx, 'VHT-Data'); % Warn if waveform does not contain whole packet if (pktOffset + double(idxVHTData(2))) > rxWaveLen fprintf('** Not enough samples to recover entire packet **\n\n'); end
Первичное использование VHT-SIG-B предназначено для сигнализации пользовательской информации в многопользовательском пакете. В однопользовательском пакете VHT-SIG-B несет длину пакета, которая также может быть вычислена с использованием L-SIG и VHT-SIG-A (что показано в разделах выше). Несмотря на то, что не требуется декодировать однопользовательский пакет, VHT-SIG-B восстанавливается ниже, и биты интерпретируются. Символы VHT-SIG-B демодулируются с использованием оценки канала MIMO, полученной из VHT-LTF. Обратите внимание, что CRC для VHT-SIG-B переносится в поле VHT Data.
% Estimate MIMO channel using VHT-LTF and retrieved packet parameters demodVHTLTF = wlanVHTLTFDemodulate(rx(pktOffset + (idxVHTLTF(1):idxVHTLTF(2)), :), cfgVHTRx); chanEstVHTLTF = wlanVHTLTFChannelEstimate(demodVHTLTF, cfgVHTRx); % Estimate noise power in VHT-SIG-B fields noiseVarVHT = helperNoiseEstimate(demodLLTF, chanBW, cfgVHTRx.NumSpaceTimeStreams); % VHT-SIG-B Recover disp('Decoding VHT-SIG-B...'); [rxSIGBBits, eqSIGBSym] = wlanVHTSIGBRecover(rx(pktOffset + (idxVHTSIGB(1):idxVHTSIGB(2)),:), ... chanEstVHTLTF, noiseVarVHT, chanBW); % Measure EVM of VHT-SIG-B symbol release(EVM); EVM.ReferenceConstellation = wlanReferenceSymbols('BPSK'); rmsEVM = EVM(eqSIGBSym); fprintf('VHT-SIG-B EVM: %2.2f%% RMS\n', rmsEVM); % Interpret VHT-SIG-B bits to recover the APEP length (rounded up to a % multiple of four bytes) and generate reference CRC bits [refSIGBCRC, sigbAPEPLength] = helperInterpretSIGB(rxSIGBBits, chanBW, true); disp('Decoded VHT-SIG-B contents: '); fprintf(' APEP Length (rounded up to 4 byte multiple): %d bytes\n\n', sigbAPEPLength);
Decoding VHT-SIG-B... VHT-SIG-B EVM: 5.21% RMS Decoded VHT-SIG-B contents: APEP Length (rounded up to 4 byte multiple): 1052 bytes
Реконструированный объект конфигурации VHT может затем использоваться для восстановления поля данных VHT. Это включает в себя биты CRC VHT-SIG-B и PSDU.
Затем восстановленные символы данных VHT могут быть проанализированы по мере необходимости. В этом примере отображается выровненная совокупность восстановленных символов данных VHT на пространственный поток.
% Get single stream channel estimate chanEstSSPilots = vhtSingleStreamChannelEstimate(demodVHTLTF, cfgVHTRx); % Extract VHT Data samples from the waveform vhtdata = rx(pktOffset + (idxVHTData(1):idxVHTData(2)), :); % Estimate the noise power in VHT data field noiseVarVHT = vhtNoiseEstimate(vhtdata, chanEstSSPilots, cfgVHTRx); % Recover PSDU bits using retrieved packet parameters and channel % estimates from VHT-LTF disp('Decoding VHT Data field...'); [rxPSDU, rxSIGBCRC, eqDataSym] = wlanVHTDataRecover(vhtdata, chanEstVHTLTF, noiseVarVHT, cfgVHTRx); % Plot equalized constellation for each spatial stream refConst = wlanReferenceSymbols(cfgVHTRx); [Nsd, Nsym, Nss] = size(eqDataSym); eqDataSymPerSS = reshape(eqDataSym, Nsd*Nsym, Nss); for iss = 1:Nss constellationDiagram{iss}.ReferenceConstellation = refConst; constellationDiagram{iss}(eqDataSymPerSS(:, iss)); end % Measure EVM of VHT-Data symbols release(EVM); EVM.ReferenceConstellation = refConst; rmsEVM = EVM(eqDataSym(:)); fprintf('VHT-Data EVM: %2.2f%% RMS\n', rmsEVM);
Decoding VHT Data field... VHT-Data EVM: 4.68% RMS

Затем биты CRC для VHT-SIG-B, восстановленные в данных VHT, сравниваются с локально сгенерированной ссылкой, чтобы определить, были ли успешно восстановлены биты услуги передачи данных VHT-SIG-B и VHT.
% Test VHT-SIG-B CRC from service bits within VHT Data against % reference calculated with VHT-SIG-B bits if ~isequal(refSIGBCRC, rxSIGBCRC) disp('** VHT-SIG-B CRC fail **'); else disp('VHT-SIG-B CRC pass'); end
VHT-SIG-B CRC pass
FCS в кадрах MAC может быть проверен с помощью wlanMPDUDecode. По мере восстановления кадра формата VHT PSDU содержит A-MPDU. MPDU извлекаются из A-MPDU с помощью wlanAMPDUDeaggregate.
mpduList = wlanAMPDUDeaggregate(rxPSDU, cfgVHTRx);
fprintf('Number of MPDUs present in the A-MPDU: %d\n', numel(mpduList));
Number of MPDUs present in the A-MPDU: 1
mpduList содержит распакованный список MPDU. Каждый MPDU в списке передается wlanMPDUDecode который проверяет FCS и декодирует MPDU.
for i = 1:numel(mpduList) [macCfg, payload, decodeStatus] = wlanMPDUDecode(mpduList{i}, cfgVHTRx, ... 'DataFormat', 'octets'); if strcmp(decodeStatus, 'FCSFailed') fprintf('** FCS failed for MPDU-%d **\n', i); else fprintf('FCS passed for MPDU-%d\n', i); end end
FCS passed for MPDU-1
В этом примере используются следующие вспомогательные функции:
Стандарт IEEE Std 802.11ac™-2013 IEEE для информационных технологий - Связь и обмен информацией между системами - Локальные и городские сети - Особые требования - Часть 11: Спецификации управления доступом к среде беспроводной локальной сети (MAC) и физического уровня (PHY) - Поправка 4: Улучшения для очень высокой пропускной способности для работы в диапазонах ниже 6 GY