wlanHEDataBitRecover

Восстановите биты данных с Поля данных HE

Описание

пример

dataBits = wlanHEDataBitRecover(rxDataSym,noiseVarEst,cfg) восстанавливает dataBits, Биты данных HE в однопользовательской высокой эффективности (SU HE) передача.

Функция восстанавливает dataBits от rxDataSym, компенсируемые символы HE-Data OFDM. cfg введите параметрирует передачу, которая подвергается шумовой оценке отклонения noiseVarEst.

пример

dataBits = wlanHEDataBitRecover(rxDataSym,noiseVarEst,csi,cfg)возвращает восстановленные биты данных с помощью информации о состоянии канала csi улучшать demapping поднесущих OFDM.

dataBits = wlanHEDataBitRecover(rxDataSym,noiseVarEst,cfg,userIdx) возвращает восстановленные биты данных для заданного пользователя многопользовательской высокой эффективности (HE МУ), передача, как определено пользователем индексируют userIdx.

пример

dataBits = wlanHEDataBitRecover(rxDataSym,noiseVarEst,csi,cfg,userIdx) возвращает восстановленные биты данных для заданного пользователя HE передача МУ, с помощью информации о состоянии канала, чтобы улучшить demapping поднесущих OFDM.

пример

dataBits = wlanHEDataBitRecover(___,Name,Value) задает опции алгоритма при помощи одного или нескольких аргументов пары "имя-значение". Когда вы не задаете пару "имя-значение", функция использует значение по умолчанию.

Примеры

свернуть все

Восстановите Поле данных HE для пакета ФОРМАТА SU HE путем декодирования HE сигнальные поля, обновления неизвестных свойств в объекте настройки восстановления и передачи обновленного объекта в функцию Восстановления данных HE.

Создайте объект настройки ФОРМАТА SU HE, задав MCS, и извлеките пропускную способность канала.

cfgHESU = wlanHESUConfig('MCS',0);
cbw = cfgHESU.ChannelBandwidth;

Сгенерируйте форму волны для заданного объекта настройки.

bits = randi([0 1],8*getPSDULength(cfgHESU),1,'int8');
waveform = wlanWaveformGenerator(bits,cfgHESU);

Создайте объект настройки восстановления WLAN, задав известную пропускную способность канала и пакет ФОРМАТА SU HE.

cfgRx = wlanHERecoveryConfig('ChannelBandwidth',cbw,'PacketFormat','HE-SU');

Восстановите HE сигнальные поля путем получения полевых индексов и выполнения соответствующих операций демодуляции.

ind = wlanFieldIndices(cfgRx);
heLSIGandRLSIG = waveform(ind.LSIG(1):ind.RLSIG(2),:);
symLSIG = wlanHEDemodulate(heLSIGandRLSIG,'L-SIG',cbw);
info = wlanHEOFDMInfo('L-SIG',cbw);

Объедините поля L-SIG и RL-SIG для разнообразия и получите поднесущие данных.

symLSIG = mean(symLSIG,2);
lsig = symLSIG(info.DataIndices,:);

Декодируйте поле L-SIG, принимая бесшумный канал, и используйте поле длины, чтобы обновить объект восстановления.

[~,~,lsigInfo] = wlanLSIGBitRecover(lsig,0);
cfgRx.LSIGLength = lsigInfo.Length;

Восстановите и демодулируйте поле HE-SIG-A, получите поднесущие данных и восстановите биты "SIG HE".

heSIGA = waveform(ind.HESIGA(1):ind.HESIGA(2),:);
symSIGA = wlanHEDemodulate(heSIGA,'HE-SIG-A',cbw);
siga = symSIGA(info.DataIndices,:);
[sigaBits,failCRC] = wlanHESIGABitRecover(siga,0);

Обновите объект настройки восстановления с восстановленными битами "SIG HE" и получите обновленные полевые индексы.

cfgRx = interpretHESIGABits(cfgRx,sigaBits);
ind = wlanFieldIndices(cfgRx);

Получите и декодируйте Поле данных HE.

heData = waveform(ind.HEData(1):ind.HEData(2),:);
symData = wlanHEDemodulate(heData,'HE-Data', ... 
    cbw,cfgRx.GuardInterval,[cfgRx.RUSize cfgRx.RUIndex]);
infoData = wlanHEOFDMInfo('HE-Data',cbw,cfgRx.GuardInterval,[cfgRx.RUSize cfgRx.RUIndex]);
data = symData(infoData.DataIndices,:,:);
dataBits = wlanHEDataBitRecover(data,0,cfgRx);

Проверяйте, что возвращенные биты данных совпадают с битами передаваемых данных.

isequal(bits,dataBits)
ans = logical
   1

Восстановите данные о HE из однопользовательской пакетной формы волны HE, переданной, хотя AWGN образовывает канал.

cfgHE = wlanHESUConfig('MCS',11);

Сгенерируйте форму волны передачи, содержащую восемь пакетов данных.

msgLen = getPSDULength(cfgHE)*8;
txBits = randi([0 1],msgLen,1,'int8');
txWaveform = wlanWaveformGenerator(txBits,cfgHE);

Добавьте шум в форму волны.

snr = 30;
rxWaveform = awgn(txWaveform,snr);

Извлеките поле данных.

ind = wlanFieldIndices(cfgHE);
rxData = rxWaveform(ind.HEData(1):ind.HEData(2),:);

Принимая пропускную способность канала на 20 МГц и защитный интервал с 3.2 микросекундами, OFDM демодулируют полученную форму волны и извлекают несущие данные поднесущие.

Nfft = 256; % FFT length (20 MHz)
Ncp = 64;   % Cyclic prefix length (3.2 us at 20 MHz)
pilotSC = [-116; -90; -48; -22; 22; 48; 90; 116]; % Pilot indices
ruSC = [-122:-2 2:122].'; % Active subcarrier indices
nullIdx = setdiff((-Nfft/2:(Nfft/2-1)).',ruSC)+Nfft/2+1;
pilotIdx = pilotSC+Nfft/2+1;
sf = (1/sqrt(numel(ruSC)))*Nfft; % Scaling factor
rxSym = ofdmdemod(rxData,Nfft,Ncp,Ncp,nullIdx,pilotIdx)/sf;

Восстановите биты данных.

csi = ones(length(rxSym),1); % Assume CSI estimate of all ones
nVar = 10^(-snr/10); % Noise variance
rxBits = wlanHEDataBitRecover(rxSym,nVar,csi,cfgHE);

Сравните восстановленные биты с исходными информационными битами.

disp(isequal(txBits,rxBits));
   1

Декодируйте Поле данных HE для каждого пользователя в передаче OFDMA.

Генерация сигналов

Создайте многопользовательский объект HE и пакетную настройку.

allocationIndex = 96; % Two 106-tone RUs, two users, 20 MHz
cfg = wlanHEMUConfig(allocationIndex);
cfg.User{1}.MCS = 4;
cfg.User{2}.APEPLength = 1e3;
cfg.User{2}.MCS = 7;

Сгенерируйте случайные данные на основе определенной длины PSDU на пользователя.

numUsers = numel(cfg.User);
psduLength = getPSDULength(cfg);
txBits = cell(1,numUsers);
for i = 1:numUsers
   txBits{i} = randi([0 1],psduLength(i)*8,1);
end

Сгенерируйте форму волны OFDMA, сигнализируют и добавляют AWGN в сигнал.

txWaveform = wlanWaveformGenerator(txBits,cfg);
snr = 25;
rxWaveform = awgn(txWaveform,snr);

Обработка получателя на пользователя

Используя структуру индексов поля PPDU, извлеките Поле данных HE для каждого пользователя.

ind = wlanFieldIndices(cfg)
ind = struct with fields:
      LSTF: [1 160]
      LLTF: [161 320]
      LSIG: [321 400]
     RLSIG: [401 480]
    HESIGA: [481 640]
    HESIGB: [641 880]
     HESTF: [881 960]
     HELTF: [961 1280]
    HEData: [1281 6720]
      HEPE: [0x2 double]

rxData = rxWaveform(ind.HEData(1):ind.HEData(2),:);       

Для каждого пользователя OFDM демодулируют и извлекают несущие данные поднесущие, принимающие пропускную способность канала на 20 МГц и защитный интервал с 3.2 микросекундами для соответствующего модуля ресурса (RU).

for userIdx = 1:numUsers
   Nfft = 256; % FFT length (20 MHz)
   Ncp = 64;  % Cyclic prefix length (3.2 us at 20 MHz)
   pilotSC = [-116; -90; -48; -22; 22; 48; 90; 116]; % Pilot indices
   if userIdx==1
      ruSC = (-122:-17).'; % Active subcarrier indices RU #1
   else
      ruSC = (17:122).'; % Active subcarrier indices RU #2
   end
   nullIdx = setdiff((-Nfft/2:(Nfft/2-1)).',ruSC)+Nfft/2+1;
   pilotIdx = pilotSC(ismember(pilotSC,ruSC))+Nfft/2+1;
   sf = (1/sqrt(2*numel(ruSC)))*Nfft; % Scaling factor
   rxSym = ofdmdemod(rxData,Nfft,Ncp,Ncp,nullIdx,pilotIdx)/sf;        
  
   % Recover data bits and compare with transmitted
   csi = ones(length(rxSym),1); % Assume CSI estimate of all ones
   nVar = 10^(-snr/10); % Noise variance
   rxBits = wlanHEDataBitRecover(rxSym,nVar,csi,cfg,userIdx);
   disp(isequal(rxBits,txBits{userIdx}))
end
   1

   1

Сгенерируйте пакет Тбайта HE, пройдите через канал AWGN, затем демодулируйте и восстановите Поле данных HE с полученной формы волны.

Сгенерируйте форму волны Тбайта HE WLAN в ответ на систему координат, содержащую подполе управления TRS.

cfgHE = getTRSConfiguration(wlanHETBConfig);
psduLength = 8*getPSDULength(cfgHE);
psdu = randi([0,1],psduLength,1,'int8');
waveform = wlanWaveformGenerator(psdu,cfgHE);

Передайте форму волны через канал AWGN с ОСШ 30 дБ.

snr = 30;
rxWaveform = awgn(waveform,snr);

Извлеките поле данных из полученной формы волны.

ind = wlanFieldIndices(cfgHE);
rxData = rxWaveform(ind.HEData(1):ind.HEData(2),:);

Демодулируйте форму волны и извлеките поднесущие данных.

demod = wlanHEDemodulate(rxData,'HE-Data',cfgHE);
info = wlanHEOFDMInfo('HE-Data',cfgHE);
rxDataSym = demod(info.DataIndices,:,:);

Восстановите биты данных, удовлетворяющие заданным оценкам для CSI и шумового отклонения, реализовав нормированную сумму min декодирование LDPC.

csi = ones(length(rxDataSym),1);
noiseVarEst = 10^(-snr/10);
dataBits = wlanHEDataBitRecover(rxDataSym,noiseVarEst,csi,cfgHE,'LDPCDecodingMethod','norm-min-sum');

Подтвердите, что восстановленные информационные биты совпадают с переданным PSDU.

disp(isequal(dataBits,psdu))
   1

Входные параметры

свернуть все

Компенсируемые символы HE-Data OFDM для пользователя в виде SD N NSym NSS массивом с комплексным знаком. SD N является количеством поднесущих данных в Поле данных HE, N, Sym является количеством символов OFDM и N, SS является количеством пространственных потоков. Содержимое и размер rxDataSym зависьте от HE настройка формата PPDU.

Типы данных: double
Поддержка комплексного числа: Да

Шумовая оценка отклонения в виде неотрицательного скаляра.

Типы данных: double

Информация о состоянии канала в виде ST-by-NSS N матрица с действительным знаком. ST N является количеством поднесущих и N, SS является количеством пространственных потоков.

Типы данных: double

Настройка формата HE в виде объекта типа wlanHESUConfig, wlanHEMUConfig, wlanHETBConfig, или wlanHERecoveryConfig.

Пользовательский индекс в виде целого числа в интервале [1, 8].

Типы данных: double

Аргументы в виде пар имя-значение

Задайте дополнительные разделенные запятой пары Name,Value аргументы. Name имя аргумента и Value соответствующее значение. Name должен появиться в кавычках. Вы можете задать несколько аргументов в виде пар имен и значений в любом порядке, например: Name1, Value1, ..., NameN, ValueN.

Пример: 'MaximumLDPCIterationCount','12','EarlyTermination','false' задает максимум 12 LDPC декодирование итераций и отключает раннее завершение так, чтобы декодер завершил эти 12 итераций.

LDPC декодирование алгоритма в виде одного из этих значений:

Примечание

Когда вы задаете этот вход как 'norm-min-sum' или 'offset-min-sum', wlanHEDataBitRecover функция устанавливает входные значения отношения логарифмической правдоподобности (LLR), которые больше 1e10 или меньше, чем -1e10 к 1e10 и -1e10, соответственно. Функция затем использует эти значения при выполнении LDPC декодирование алгоритма.

Зависимости

Чтобы включить этот аргумент, задайте ChannelCoding свойство cfg введите как 'LDPC' для пользователя, соответствующего userIdx входной параметр.

Типы данных: char | string

Масштабный коэффициент за нормированную сумму min LDPC, декодирующий в виде скаляра в интервале (0, 1].

Зависимости

Чтобы включить этот аргумент, задайте 'LDPCDecodingMethod' аргумент пары "имя-значение" как 'norm-min-sum'.

Типы данных: double

Возместите за сумму min смещения LDPC, декодирующий в виде неотрицательного скаляра.

Зависимости

Чтобы включить этот аргумент, задайте 'LDPCDecodingMethod' аргумент пары "имя-значение" как 'offset-min-sum'.

Типы данных: double

Максимальное количество LDPC декодирование итераций в виде положительного целого числа.

Зависимости

Чтобы включить этот аргумент, установите ChannelCoding свойство cfg аргумент пары "имя-значение" 'LDPC' для пользователя, соответствующего userIdx входной параметр.

Типы данных: double

Включите раннее завершение LDPC, декодирующего в виде 1 TRUE) или 0 ложь).

  • Когда вы устанавливаете это значение к 0 ложь), декодирование LDPC завершает количество итераций, заданных 'MaximumLDPCIterationCount' независимо от состояния проверки четности.

  • Когда вы устанавливаете это значение к 1 TRUE), декодирование LDPC завершает работу, когда всем проверкам четности удовлетворяют.

Зависимости

Чтобы включить этот аргумент, задайте ChannelCoding свойство cfg введите как 'LDPC' для пользователя, соответствующего userIdx входной параметр.

Типы данных: логический

Выходные аргументы

свернуть все

Восстановленные информационные биты в Поле данных HE, возвращенном как 8 LPSDU вектор-столбцом, где L PSDU является длиной PSDU. Можно определить длину PSDU при помощи getPSDULength функция.

Типы данных: int8

Больше о

свернуть все

Поле данных HE

Поле данных HE HE PPDU содержит данные для одного или нескольких пользователей.

Как описано в [1], количество символов OFDM в Поле данных HE определяется значением длины устаревшего поля (L-SIG) сигнала (см. уравнение (27-11)), длительность преамбулы и настройки Размера GI+LTF, Дополнительного Фактора Pre-FEC и полей PE Disambiguity в поле HE-SIG-A (см. 27.3.10.7 (SIG HE)).

  • Символы данных в HE PPDU используют период дискретного преобразования Фурье (DFT) 12,8 μs и интервал поднесущей 78,125 кГц.

  • Символы данных в HE PPDU поддерживают защитную длительность интервала 0,8 μs, 1,6 μs и 3,2 μs.

  • HE PPDUs имеет пилотов единого потока в Поле данных HE.

Когда кодирование BCC используется, Поле данных HE состоит из поля SERVICE, PSDU, предварительного FEC PHY дополнение битов, битов хвоста и дополнительных битов пост-FEC. Пакетное расширение принято, чтобы быть нулем.

Когда кодирование LDPC используется, Поле данных HE состоит из поля SERVICE, PSDU, предварительного FEC PHY дополнение битов, дополнительных битов пост-FEC и пакетного расширения. Никакие биты хвоста не присутствуют, когда кодирование LDPC используется.

Для получения дополнительной информации смотрите HE Структуры и Сборки WLAN PPDU PPDU.

Алгоритмы

свернуть все

wlanHEDataBitRecover функционируйте поддерживает эти четыре LDPC декодирование алгоритмов.

Декодирование распространения веры

wlanHEDataBitRecover функционируйте реализует алгоритм BP на основе алгоритма декодирования, представленного в [2]. Для переданной LDPC-закодированной кодовой комбинации c=(c0,c1,,cn1), вход к декодеру LDPC является LLR, данным

L(ci)=log(Pr(ci=0|channel output for ci)Pr(ci=0|канал выход для ci)).

В каждой итерации функция обновляет ключевые компоненты алгоритма на основе этих уравнений:

L(rji)=2atanh(iVj\{i}tanh(12L(qij))),

L(qij)=L(ci)+j'Ci\{j}L(rji), инициализированный как L(qij)=L(ci) перед первой итерацией, и

L(Qi)=L(ci)+jCiL(rji).

В конце каждой итерации, L(Qi) обновленная оценка значения LLR для переданного бита, ci. Значение L(Qi) мягкое решение выход для ci. Если L(Qi) отрицательно, трудное решение выход для ci 1. В противном случае выход 0.

Индексируйте наборы Ci\{j} и Vj\{i} основаны на PCM, таким образом что наборы Ci и Vj соответствуйте всем ненулевым элементам в столбце i и строка j PCM, соответственно.

Этот рисунок демонстрирует, как вычислить эти наборы индекса для PCM H для случая i = 5 и j = 3.

Чтобы избежать бесконечных чисел в уравнениях алгоритма, atanh (1) и atanh (–1) установлены в 19,07 и –19.07, соответственно. Из-за конечной точности, MATLAB® возвращается 1 для tanh (19.07) и –1 для tanh (–19.07).

Когда вы задаете 'EarlyTermination' аргумент пары "имя-значение" как 0 ложь), декодирование завершает работу после количества итераций, заданных 'MaximumLDPCIterationCount' аргумент пары "имя-значение". Когда вы задаете 'EarlyTermination' аргумент пары "имя-значение" как 1 TRUE), декодирование завершает работу, когда всем проверкам четности удовлетворяют (HcT=0) или после того, как количество итераций задано 'MaximumLDPCIterationCount' аргумент пары "имя-значение".

Многоуровневое декодирование распространения веры

wlanHEDataBitRecover функционируйте реализует многоуровневый алгоритм BP на основе алгоритма декодирования, представленного в Разделе II.A [3]. Цикл декодирования выполняет итерации по подмножествам строк (слои) PCM.

Для каждой строки, m, в слое и каждом битном индексе, j, реализация обновляет ключевые компоненты алгоритма на основе этих уравнений.

(1) L(qmj)=L(qj)Rmj

(2) Ψ(x)=log(|tanh(x/2)|)

(3) Amj=nN(m)\{j}Ψ(L(qmn))

(4) smj=nN(m)\{j}sgn(L(qmn))

(5) Rmj=smjΨ(Amj)

(6) L(qj)=L(qmj)+Rmj

Для каждого слоя уравнение декодирования (6) работает над объединенным входом, полученным из текущих входных параметров LLR, L(qmj), и предыдущие обновления слоя, Rmj.

Поскольку многоуровневый алгоритм BP обновляет только подмножество узлов в слое, этот алгоритм быстрее, чем алгоритм BP. Чтобы достигнуть того же коэффициента ошибок, как достигнуто с декодированием BP, используйте половину количества декодирования итераций при использовании многоуровневого алгоритма BP.

Нормированное декодирование суммы Min

wlanHEDataBitRecover функционируйте реализует нормированный алгоритм декодирования суммы min следующим многоуровневый алгоритм BP уравнением (3) замененный

Amj=minnN(m)\{j}(α|L(qmn)|),

где α является масштабным коэффициентом, заданным 'MinSumScalingFactor' аргумент пары "имя-значение". Это уравнение является адаптацией уравнения (4) представленный в [4].

Возместите декодирование суммы Min

wlanHEDataBitRecover функционируйте реализует алгоритм декодирования суммы min смещения следующим многоуровневый алгоритм BP уравнением (3) замененный

Amj=max(minnN(m)\{j}(|L(qmn)|β), 0),

где β является смещением, заданным 'MinSumOffset' аргумент пары "имя-значение". Это уравнение является адаптацией уравнения (5) представленный в [4].

Ссылки

[1] IEEE P802.11ax™/D4.1. “Часть 11: Беспроводное Среднее управление доступом (MAC) LAN и Физический уровень (PHY) Технические требования. Поправка 1: Улучшения для Высокой эффективности WLAN”. Спроектируйте Стандарт для Информационных технологий — Телекоммуникации и обмен информацией между системами. Локальные сети и городские компьютерные сети — Конкретные требования.

[2] Gallager, Роберт Г. Имеющие малую плотность коды с проверкой четности. Кембридж, MA: нажатие MIT, 1963.

[3] Hocevar, D.E. "Уменьшаемая Архитектура Декодера Сложности через Многоуровневое Декодирование Кодов LDPC". В Семинаре IEEE по Системам Обработки сигналов, 2004. ГЛОТКИ 2004., 107-12. Остин, Техас, США: IEEE, 2004. https://doi.org/10.1109/SIPS.2004.1363033.

[4] Джингу Чен, R.M. Крем для загара, К. Джонс и Ян Ли. "Улучшенные алгоритмы декодирования суммы Min для неправильных кодов LDPC". В продолжениях. Международный симпозиум по теории информации, 2005. ISIT 2005., 449-53, 2005. https://doi.org/10.1109/ISIT.2005.1523374.

Расширенные возможности

Генерация кода C/C++
Генерация кода C и C++ с помощью MATLAB® Coder™.

Введенный в R2018b