Принятые пакеты ухудшаются из-за нарушений радиосвязи и канала. Восстановление содержимого пакета требует коррекции синхронизации символа и сдвига частоты, оценки канала и демодуляции и восстановления преамбулы и полезной нагрузки. Функции Toolbox™ WLAN выполняют эти операции в полях VHT, HT-mixed и не-HT PPDU.
В этом примере показано, как восстановить содержимое из формы сигнала формата VHT.
Генерация сигнала VHT 80 МГц
Создайте объект конфигурации VHT. Набор APEPLength кому 3200 и MCS кому 5. Создайте поток битов передачи для поля данных. Для формы сигнала VHT поле данных содержит PSDULength*8 биты.
cfgVHT = wlanVHTConfig('APEPLength',3200,'MCS',5); txBits = randi([0 1],cfgVHT.PSDULength*8,1);
Создайте поля PPDU по отдельности. Создайте поля преамбулы L-STF, L-LTF, L-SIG, VHT-SIG-A, VHT-STF, VHT-LTF и VHT-SIG-B и поле данных VHT.
lstf = wlanLSTF(cfgVHT); lltf = wlanLLTF(cfgVHT); lsig = wlanLSIG(cfgVHT); vhtSigA = wlanVHTSIGA(cfgVHT); vhtstf = wlanVHTSTF(cfgVHT); vhtltf = wlanVHTLTF(cfgVHT); vhtSigB = wlanVHTSIGB(cfgVHT); vhtData = wlanVHTData(txBits,cfgVHT);
Объедините отдельные поля для создания одной формы сигнала PPDU.
txPPDU = [lstf; lltf; lsig; vhtSigA; vhtstf; vhtltf; vhtSigB; vhtData];
Прохождение сигнала VHT через канал SISO TGac
Создание объектов канала TGac SISO и AWGN.
chBW = cfgVHT.ChannelBandwidth; fs = 80e6; tgac = wlanTGacChannel('SampleRate',fs,'ChannelBandwidth',chBW,... 'LargeScaleFadingEffect','Pathloss and shadowing'); awgnChan = comm.AWGNChannel('NoiseMethod','Variance','VarianceSource','Input port');
Вычислите дисперсию шума для приемника с показателем шума 9 дБ. Дисперсия шума, noiseVar, равно kTBF, где k - постоянная Больцмана, T - температура окружающей среды 290 K, B - полоса пропускания (частота дискретизации), F - показатель шума приемника. Пропускают передаваемый сигнал через шумный канал TGac.
noiseVar = 10^((-228.6 + 10*log10(290) + 10*log10(fs) + 9)/10)
noiseVar = 2.5438e-12
rxPPDU = awgnChan(tgac(txPPDU),noiseVar);
Восстановление содержимого преамбулы VHT из PPDU
В общем, L-STF и L-LTF обрабатываются для выполнения оценки и коррекции сдвига частоты и синхронизации символа. В этом примере несущая частота не смещена, и синхронизация пакета «включена». Поэтому для точной демодуляции определение сдвига несущей частоты и синхронизации символа не требуется.
Найдите индексы начала и остановки для полей PPDU.
fieldInd = wlanFieldIndices(cfgVHT)
fieldInd = struct with fields:
LSTF: [1 640]
LLTF: [641 1280]
LSIG: [1281 1600]
VHTSIGA: [1601 2240]
VHTSTF: [2241 2560]
VHTLTF: [2561 2880]
VHTSIGB: [2881 3200]
VHTData: [3201 12160]
Индекс остановки VHT-SIG-B указывает длину преамбулы в выборках.
numSamples = fieldInd.VHTSIGB(2);
Постройте график преамбулы и начала пакетных данных. Добавьте маркеры и постройте график для разграничения границ поля пакета.
time = ([0:double(numSamples)-1]/fs)*1e6; peak = 1.2*max(abs(rxPPDU(1:numSamples))); fieldMarkers = zeros(numSamples,1); fieldMarkers(fieldInd.LSTF(2)-1,1) = peak; fieldMarkers(fieldInd.LLTF(2)-1,1) = peak; fieldMarkers(fieldInd.LSIG(2)-1,1) = peak; fieldMarkers(fieldInd.VHTSIGA(2)-1,1) = peak; fieldMarkers(fieldInd.VHTSTF(2)-1,1) = peak; fieldMarkers(fieldInd.VHTLTF(2)-1,1) = peak; fieldMarkers(fieldInd.VHTSIGB(2)-1,1) = peak; plot(time,abs(rxPPDU(1:numSamples)),time,fieldMarkers) xlabel ('Time (microseconds)') ylabel('Magnitude') title('VHT Preamble')

Демодулируйте L-LTF и оцените канал.
rxLLTF = rxPPDU(fieldInd.LLTF(1):fieldInd.LLTF(2),:); demodLLTF = wlanLLTFDemodulate(rxLLTF,cfgVHT); chEstLLTF = wlanLLTFChannelEstimate(demodLLTF,cfgVHT);
Извлеките поле L-SIG из принятого PPDU, восстановите его информационные биты и проверьте CRC.
rxLSIG = rxPPDU(fieldInd.LSIG(1):fieldInd.LSIG(2),:); [recLSIG,failCRC] = wlanLSIGRecover(rxLSIG,chEstLLTF,noiseVar,chBW); failCRC
failCRC = logical
0
failCRC = 0 указывает, что был передан CRC.
Для формата VHT биты скорости L-SIG являются постоянными и установлены в значение [1 1 0 1]. Проверьте информацию о скорости передачи L-SIG и убедитесь, что эта постоянная последовательность восстановлена. Для формата VHT установка MCS в VHT-SIG-A2 определяет фактическую скорость передачи данных.
rate = recLSIG(1:4)'
rate = 1x4 int8 row vector
1 1 0 1
Извлеките VHT-SIG-A и подтвердите, что проверка CRC пройдена.
rxVHTSIGA = rxPPDU(fieldInd.VHTSIGA(1):fieldInd.VHTSIGA(2),:);
[recVHTSIGA,failCRC] = wlanVHTSIGARecover(rxVHTSIGA, ...
chEstLLTF,noiseVar,chBW);
failCRCfailCRC = logical
0
Извлеките настройку MCS из VHT-SIG-A. Для однопользовательского VHT MCS располагается в битах VHT-SIG-A2 4 через 7.
recMCSbits = (recVHTSIGA(29:32))'; recMCS = bi2de(double(recMCSbits))
recMCS = 5
isequal(recMCS,cfgVHT.MCS)
ans = logical
1
Восстановленный параметр MCS соответствует значению MCS в объекте конфигурации.
Извлеките и демодулируйте VHT-LTF. Используйте демодулированный сигнал для выполнения оценки канала. Используйте оценку канала для восстановления полей VHT-SIG-B и VHT-Data.
rxVHTLTF = rxPPDU(fieldInd.VHTLTF(1):fieldInd.VHTLTF(2),:); demodVHTLTF = wlanVHTLTFDemodulate(rxVHTLTF,cfgVHT); chEstVHTLTF = wlanVHTLTFChannelEstimate(demodVHTLTF,cfgVHT);
Извлеките и извлеките VHT-SIG-B.
rxVHTSIGB = rxPPDU(fieldInd.VHTSIGB(1):fieldInd.VHTSIGB(2),:); recVHTSIGB = wlanVHTSIGBRecover(rxVHTSIGB,chEstVHTLTF,noiseVar,chBW);
Как описано в IEEE Std 802.11ac-2013, таблица 22-1, значение в поле VHT-SIG-B Length, умноженное на 4, является восстановленной длиной APEP для пакетов, несущих данные. Убедитесь, что длина APEP, содержащаяся в первых 19 битах VHT-SIG-B, соответствует указанной длине APEP.
sigbAPEPbits = recVHTSIGB(1:19)'; sigbAPEPlength = bi2de(double(sigbAPEPbits))*4
sigbAPEPlength = 3200
isequal(sigbAPEPlength,cfgVHT.APEPLength)
ans = logical
1
Восстановленное значение соответствует настроенной длине APEP.
Восстановление выровненных символов с использованием оценок канала из VHT-LTF.
recPSDU = wlanVHTDataRecover(rxPPDU(fieldInd.VHTData(1):fieldInd.VHTData(2),:),...
chEstVHTLTF,noiseVar,cfgVHT);Сравнение передачи и прием битов PSDU.
numErr = biterr(txBits,recPSDU)
numErr = 0
Число битовых ошибок равно нулю.
В этом примере показано, как восстановить содержимое из формы сигнала формата HT.
Генерация сигнала HT 20 МГц
Создайте объект конфигурации HT и передайте PSDU. Набор MCS кому 2. Для сигнала HT поле данных PSDULength*8 биты.
cfgHT = wlanHTConfig('MCS',2);
txPSDU = randi([0 1],cfgHT.PSDULength*8,1);Создайте поля PPDU по отдельности. Создайте поля преамбулы L-STF, L-LTF, L-SIG, HT-SIG, HT-STF и HT-LTF и поле HT-Data.
lstf = wlanLSTF(cfgHT); lltf = wlanLLTF(cfgHT); lsig = wlanLSIG(cfgHT); htsig = wlanHTSIG(cfgHT); htstf = wlanHTSTF(cfgHT); htltf = wlanHTLTF(cfgHT); htData = wlanHTData(txPSDU,cfgHT);
Объедините отдельные поля для создания одной формы сигнала PPDU.
txPPDU = [lstf; lltf; lsig; htsig; htstf; htltf; htData];
Прохождение сигнала HT через канал SISO TGn
Создание объектов канала SISO и AWGN.
fs = 20e6; tgnChan = wlanTGnChannel('SampleRate',fs,'LargeScaleFadingEffect','Pathloss and shadowing'); awgnChan = comm.AWGNChannel('NoiseMethod','Variance','VarianceSource','Input port');
Вычислите дисперсию шума для приемника с показателем шума 9 дБ. Дисперсия шума, noiseVar, равно kTBF, где k - постоянная Больцмана, T - температура окружающей среды 290 K, B - полоса пропускания (частота дискретизации), F - показатель шума приемника. Пропускают передаваемый сигнал через шумный канал TGn.
noiseVar = 10^((-228.6 + 10*log10(290) + 10*log10(fs) + 9)/10); rxPPDU = awgnChan(tgnChan(txPPDU),noiseVar);
Восстановление содержимого преамбулы HT из PPDU
В общем, L-STF и L-LTF обрабатываются для выполнения оценки и коррекции сдвига частоты и синхронизации символа. В этом примере несущая частота не смещена, и синхронизация пакета «включена». Поэтому для точной демодуляции определение сдвига несущей частоты и синхронизации символа не требуется.
Найдите индексы начала и остановки для полей PPDU.
fieldInd = wlanFieldIndices(cfgHT)
fieldInd = struct with fields:
LSTF: [1 160]
LLTF: [161 320]
LSIG: [321 400]
HTSIG: [401 560]
HTSTF: [561 640]
HTLTF: [641 720]
HTData: [721 9200]
Индекс остановки HT-LTF указывает длину преамбулы в выборках.
numSamples = fieldInd.HTLTF(2);
Постройте график преамбулы и начала пакетных данных. Добавьте маркеры и постройте график для разграничения границ поля пакета.
time = ([0:double(numSamples)-1]/fs)*1e6; peak = 1.2*max(abs(rxPPDU(1:numSamples))); fieldMarkers = zeros(numSamples,1); fieldMarkers(fieldInd.LSTF(2)-1,1) = peak; fieldMarkers(fieldInd.LLTF(2)-1,1) = peak; fieldMarkers(fieldInd.LSIG(2)-1,1) = peak; fieldMarkers(fieldInd.HTSIG(2)-1,1) = peak; fieldMarkers(fieldInd.HTSTF(2)-1,1) = peak; fieldMarkers(fieldInd.HTLTF(2)-1,1) = peak; plot(time,abs(rxPPDU(1:numSamples)),time,fieldMarkers) xlabel ('Time (microseconds)') ylabel('Magnitude') title('HT Format Preamble')

Демодулируйте L-LTF и оцените канал.
rxLLTF = rxPPDU(fieldInd.LLTF(1):fieldInd.LLTF(2),:); demodLLTF = wlanLLTFDemodulate(rxLLTF,cfgHT); chEstLLTF = wlanLLTFChannelEstimate(demodLLTF,cfgHT);
Извлеките поле L-SIG из принятого PPDU и восстановите его информационные биты.
rxLSIG = rxPPDU(fieldInd.LSIG(1):fieldInd.LSIG(2),:); [recLSIG,failCRC] = wlanLSIGRecover(rxLSIG,chEstLLTF,noiseVar,cfgHT.ChannelBandwidth); failCRC
failCRC = logical
0
failCRC = 0 указывает, что был передан CRC.
Для формата HT биты скорости L-SIG являются постоянными и установлены в значение [1 1 0 1]. Проверьте информацию о скорости передачи L-SIG и убедитесь, что эта постоянная последовательность восстановлена. Для формата HT установка MCS в HT-SIG определяет фактическую скорость передачи данных.
rate = recLSIG(1:4)'
rate = 1x4 int8 row vector
1 1 0 1
Извлеките HT-SIG и подтвердите, что проверка CRC пройдена.
recHTSIG = rxPPDU(fieldInd.HTSIG(1):fieldInd.HTSIG(2),:); [recHTSIG,failCRC] = wlanHTSIGRecover(recHTSIG,chEstLLTF,noiseVar,cfgHT.ChannelBandwidth); failCRC
failCRC = logical
0
Извлеките настройку MCS из HT-SIG. Для HT MCS находится в битах HT-SIG от 0 до 6.
recMCSbits = (recHTSIG(1:7))'; recMCS = bi2de(double(recMCSbits))
recMCS = 2
isequal(recMCS,cfgHT.MCS)
ans = logical
1
Восстановленный параметр MCS соответствует значению MCS в объекте конфигурации.
Извлеките и демодулируйте HT-LTF. Используйте демодулированный сигнал для выполнения оценки канала. Используйте оценку канала для восстановления поля HT-Data.
rxHTLTF = rxPPDU(fieldInd.HTLTF(1):fieldInd.HTLTF(2),:); demodHTLTF = wlanHTLTFDemodulate(rxHTLTF,cfgHT); chEstHTLTF = wlanHTLTFChannelEstimate(demodHTLTF,cfgHT);
Восстановление содержимого данных HT из PPDU
Восстановление принятых выровненных символов с использованием оценок канала из HT-LTF.
[recPSDU] = wlanHTDataRecover(rxPPDU(fieldInd.HTData(1):fieldInd.HTData(2),:),...
chEstHTLTF,noiseVar,cfgHT);Сравните переданные и принятые биты PSDU и подтвердите, что число битовых ошибок равно нулю.
numErr = biterr(txPSDU,recPSDU)
numErr = 0
В этом примере выполняется восстановление содержимого формы сигнала не в формате HT.
Генерировать сигнал 20 МГц без HT
Создайте объект конфигурации без HT и PSDU передачи. Набор MCS кому 4.Для сигнала без HT поле данных PSDULength*8 биты.
cfgNonHT = wlanNonHTConfig('MCS',4);
txPSDU = randi([0 1],cfgNonHT.PSDULength*8,1);Создайте поля PPDU по отдельности. Используйте содержимое non-HT-Data для проверки частоты битовых ошибок после восстановления. Создайте поля преамбулы L-STF, L-LTF и L-SIG и поле данных без HT.
lstf = wlanLSTF(cfgNonHT); lltf = wlanLLTF(cfgNonHT); lsig = wlanLSIG(cfgNonHT); nhtData = wlanNonHTData(txPSDU,cfgNonHT);
Объедините отдельные поля для создания одной формы сигнала PPDU.
txPPDU = [lstf; lltf; lsig; nhtData];
Прохождение сигнала без HT через канал SISO 802.11g
Вычислите потери в тракте свободного пространства для расстояния между передатчиком и приемником 3 метра. Создайте канал 802.11g с максимальным доплеровским сдвигом 3 Гц и среднеквадратичной задержкой тракта, равной удвоенному времени выборки. Создайте канал AWGN.
dist = 3; pathLoss = 10^(-log10(4*pi*dist*(2.4e9/3e8))); fs = 20e6; trms = 2/fs; maxDoppShift = 3; ch802 = comm.RayleighChannel('SampleRate',fs,'MaximumDopplerShift',maxDoppShift,'PathDelays',trms); awgnChan = comm.AWGNChannel('NoiseMethod','Variance','VarianceSource','Input port');
Вычислите дисперсию шума для приемника с показателем шума 9 дБ. Дисперсия шума, noiseVar, равно kTBF, где k - постоянная Больцмана, T - температура окружающей среды 290 K, B - полоса пропускания (частота дискретизации), F - показатель шума приемника. Пропускайте передаваемый сигнал через шумный канал 802.11g.
noiseVar = 10^((-228.6 + 10*log10(290) + 10*log10(fs) + 9)/10); rxPPDU = awgnChan(ch802(txPPDU),noiseVar) * pathLoss;
Восстановление содержимого преамбулы без HT из PPDU
В общем, L-STF и L-LTF обрабатываются для выполнения оценки и коррекции сдвига частоты и синхронизации символа. В этом примере несущая частота не смещена, и синхронизация пакета «включена». Поэтому для точной демодуляции определение сдвига несущей частоты и синхронизации символа не требуется.
Найдите индексы начала и остановки для полей PPDU.
fieldInd = wlanFieldIndices(cfgNonHT)
fieldInd = struct with fields:
LSTF: [1 160]
LLTF: [161 320]
LSIG: [321 400]
NonHTData: [401 7120]
Индекс остановки поля L-SIG указывает длину преамбулы в выборках.
numSamples = fieldInd.LSIG(2);
Постройте график преамбулы и начала пакетных данных. Добавьте маркеры и постройте график для разграничения границ поля пакета.
time = ((0:double(numSamples)-1)/fs)*1e6; peak = 1.2*max(abs(rxPPDU(1:numSamples))); fieldMarkers = zeros(numSamples,1); fieldMarkers(fieldInd.LSTF(2)-1,1) = peak; fieldMarkers(fieldInd.LLTF(2)-1,1) = peak; fieldMarkers(fieldInd.LSIG(2)-1,1) = peak; plot(time,abs(rxPPDU(1:numSamples)),time,fieldMarkers) xlabel ('Time (microseconds)') ylabel('Magnitude') title('Non-HT Format Preamble')

Демодулируйте L-LTF и оцените канал.
rxLLTF = rxPPDU(fieldInd.LLTF(1):fieldInd.LLTF(2),:); demodLLTF = wlanLLTFDemodulate(rxLLTF,cfgNonHT); chEstLLTF = wlanLLTFChannelEstimate(demodLLTF,cfgNonHT);
Извлеките поле L-SIG из принятого PPDU и восстановите его информационные биты.
rxLSIG = rxPPDU(fieldInd.LSIG(1):fieldInd.LSIG(2),:);
recLSIG = wlanLSIGRecover(rxLSIG,chEstLLTF,noiseVar,'CBW20');Первые четыре бита поля L-SIG, биты от 0 до 3, содержат информацию о скорости. Подтвердите, что последовательность [1 0 0 1] восстанавливают. Эта последовательность соответствует скорости передачи данных 24 МГц для установки MCS без HT 4.
rate = recLSIG(1:4)'
rate = 1x4 int8 row vector
1 0 0 1
Извлеките и демодулируйте L-LTF. Используйте демодулированный сигнал для выполнения оценки канала. Используйте оценку канала для восстановления поля non-HT-Data.
rxLLTF = rxPPDU(fieldInd.LLTF(1):fieldInd.LLTF(2),:); demodLLTF = wlanLLTFDemodulate(rxLLTF,cfgNonHT); chEstLLTF = wlanLLTFChannelEstimate(demodLLTF,cfgNonHT);
Восстановление содержимого данных, не относящихся к HT, из PPDU
Восстановление выровненных символов с использованием оценок канала из HT-LTF, определяя метод выравнивания с нулевым форсированием.
rxPSDU = rxPPDU(fieldInd.NonHTData(1):fieldInd.NonHTData(2),:); [recPSDU,~,eqSym] = wlanNonHTDataRecover(rxPSDU,chEstLLTF,noiseVar,cfgNonHT,'EqualizationMethod','ZF');
Сравните переданные и принятые биты PSDU и подтвердите, что число битовых ошибок равно нулю.
numErr = biterr(txPSDU,recPSDU)
numErr = 0
wlanHTConfig | wlanNonHTConfig | wlanVHTConfig