Этот пример показывает, как обнаружить пакет и декодировать биты полезной нагрузки в принятой форме волны 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 Data. Дополнительно проводят следующий анализ:
Отображается форма волны обнаруженного пакета.
Отображается спектр обнаруженного пакета.
Отображается созвездие уравненных символов данных на каждый пространственный поток.
Измеряется величина вектора ошибок (EVM) каждого поля.
В этом примере однопользовательская форма волны VHT 802.11ac генерируется локально, но можно использовать захваченную форму волны. MATLAB ® может использоваться для получения данных I/Q из широкой области значений приборов с помощью Instrument Control Toolbox™ и программно определенных радиоплатформ.
Локально сгенерированная форма волны нарушается каналом 3x3 TGac с замираниями, аддитивным белым Гауссовым шумом и смещением несущей частоты. Чтобы сгенерировать сигнал локально, мы конфигурируем объект строения формата пакета VHT. Обратите внимание, что объект строения пакета VHT используется только на стороне передатчика. Приемник динамически формулирует другой объект строения VHT, когда пакет декодируется. Функция helper vhtSigRecGenerateWaveform генерирует ослабленную форму волны локально. Шаги обработки в функции helper:
Действительный 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 Data.
Поле 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 Eq. 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 Data. Сюда входят биты 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
The 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: Улучшения для очень высокой пропускной способности