В этом примере показано, как обнаружить пакет и декодировать биты полезной нагрузки в полученной форме волны 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) каждого поля измеряется.
В этом примере 802.11ac VHT однопользовательская форма волны сгенерирована локально, но полученная форма волны могла использоваться. MATLAB® может использоваться, чтобы получить данные I/Q из широкого спектра инструментов с помощью платформ программно определяемого радио и Instrument Control 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-поле-данных извлечено и PSDU, и биты CRC VHT-SIG-B восстановили использование полученных пакетных параметров.
Индексы начала и конца для некоторых полей преамбулы зависят от полосы пропускания канала, но независимы от всех других параметров передачи. Эти индексы вычисляются с помощью объекта настройки передачи по умолчанию с известной полосой пропускания.
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);
Обработка фронтенда состоит из пакетного обнаружения, крупной коррекции смещения несущей частоты, временной синхронизации и прекрасной коррекции смещения несущей частоты. 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.
% 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. MPDUs извлечены из 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
содержит de-aggregated список MPDUs. Каждый 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 802.11ac™-2013 Стандарт IEEE для Информационных технологий - Телекоммуникаций и обмена информацией между системами - Локальными сетями и городскими компьютерными сетями - Конкретными требованиями - Часть 11: Беспроводное Среднее управление доступом (MAC) LAN и Физический уровень (PHY) Технические требования - Поправка 4: Улучшения для Очень Высокой Пропускной способности для Операции в Полосах ниже 6 ГГц.