wlanHEDataBitRecover

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

Описание

пример

dataBits = wlanHEDataBitRecover(rxDataSym,noiseVarEst,cfgHE) восстанавливает dataBits, вектор-столбец битов, от rxDataSym, компенсируемые символы OFDM, которые включают Поле данных HE однопользовательской высокой эффективности (SU HE) передача. Функция восстанавливает dataBits при помощи шумового отклонения оценивают noiseVarEst и параметры передачи HE cfgHE.

пример

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

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

пример

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

пример

dataBits = wlanHEDataBitRecover(___,Name,Value) задает опции алгоритма при помощи одного или нескольких аргументов пары "имя-значение", в дополнение к любой комбинации входных аргументов от предыдущих синтаксисов. Например, 'LDPCDecodingMethod','layered-bp' задает многоуровневый алгоритм декодирования имеющей малую плотность проверки четности (LDPC) распространения веры.

Примеры

свернуть все

Восстановите биты с Поля данных HE передачи SU HE.

Сконфигурируйте передачу SU HE путем создания объекта настройки с заданной модуляцией и кодирования схемы (MCS). Извлеките пропускную способность канала.

cfgHESU = wlanHESUConfig('MCS',0);
cbw = cfgHESU.ChannelBandwidth;       % Channel bandwidth of transmission

Создайте последовательность битов данных и сгенерируйте форму волны SU HE.

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

Создайте объект настройки восстановления WLAN, задав известную пропускную способность канала и формат пакета.

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, принимая бесшумный канал, и используйте поле длины, чтобы обновить объект восстановления.

noiseVarEst = 0;
[~,~,lsigInfo] = wlanLSIGBitRecover(lsig,noiseVarEst);
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" и получите обновленные полевые индексы.

cfgHE = interpretHESIGABits(cfgRX,sigaBits);
ind = wlanFieldIndices(cfgHE);

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

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

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

isequal(bits,dataBits)
ans = logical
   1

Восстановите биты с Поля данных HE формы волны SU HE, переданной хотя канал аддитивного белого Гауссова шума (AWGN).

cfgHE = wlanHESUConfig('MCS',11);

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

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

Установите отношение сигнал-шум (SNR) 30 дБ и передайте форму волны через канал AWGN.

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

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

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

Выполните демодуляцию OFDM на полученном Поле данных HE.

sym = wlanHEDemodulate(rxData,'HE-Data',cfgHE);

Получите поднесущие данных из полученных символов.

info = wlanHEOFDMInfo('HE-Data',cfgHE);
rxDataSym = sym(info.DataIndices);

Восстановите биты с Поля данных HE для соответствующей шумовой оценки отклонения, приняв оценку CSI из единиц.

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

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

isequal(bits,dataBits)
ans = logical
   1

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

Сконфигурируйте HE передача МУ для двух пользователей, задав пропускную способность канала 20 МГц и два модуля ресурса с 106 тонами (RU).

AllocationIndex = 96;
cfgHE = wlanHEMUConfig(AllocationIndex);

Задайте MCS для обоих пользователей и длину APEP для второго пользователя.

cfgHE.User{1}.MCS = 4;
cfgHE.User{2}.APEPLength = 1e3;
cfgHE.User{2}.MCS = 7;

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

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

Сгенерируйте форму волны OFDMA и передайте через канал AWGN для заданного ОСШ.

waveform = wlanWaveformGenerator(bits,cfgHE);
snr = 25;
noiseVarEst = 10^(-snr/10);
rx = awgn(waveform,snr);

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

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

Выполните демодуляцию OFDM на полученном Поле данных HE для каждого RU, получите поднесущие данных и восстановите биты для каждого пользователя.

allocationInfo = ruInfo(cfgHE);
for userIdx = 1:allocationInfo.NumUsers
    ruNumber = allocationInfo.RUNumbers(userIdx);
    sym = wlanHEDemodulate(rxData,'HE-Data',cfgHE,ruNumber);

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

    sf = sqrt(sum(allocationInfo.RUSizes)/allocationInfo.RUSizes(userIdx));
    symScaled = sf*sym;

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

    ofdmInfo = wlanHEOFDMInfo('HE-Data',cfgHE,ruNumber);
    rxDataSym = symScaled(ofdmInfo.DataIndices,:,:);

Примите оценку CSI из всех единиц и восстановите биты, подтвердив, что восстановленные биты совпадают с переданными битами.

    csi = ones(length(rxDataSym),1);
    dataBits = wlanHEDataBitRecover(rxDataSym,noiseVarEst,csi,cfgHE,userIdx);
    disp(isequal(dataBits,bits{userIdx}))
end
   1

   1

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

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

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

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

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

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

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

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

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

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

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

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

isequal(dataBits,bits)
ans = logical
   1

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

свернуть все

Демодулируемое Поле данных HE для пользователя в виде массива с комплексным знаком размера SD N NSym NSS.

  • SD N является количеством поднесущих данных в Поле данных HE.

  • N Sym является количеством символов OFDM.

  • N SS является количеством пространственных потоков.

Содержимое и размер этого входа зависят от формата HE, заданного в cfgHE входной параметр.

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

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

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

Информация о состоянии канала в виде массива с действительным знаком размера N SD-by-NSS.

  • SD N является количеством поднесущих данных в Поле данных HE.

  • 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 декодирование алгоритма в виде разделенной запятой пары, состоящей из 'LDPCDecodingMethod' и одно из этих значений:

Примечание

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

Зависимости

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

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

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

Зависимости

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

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

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

Зависимости

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

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

Максимальное количество LDPC декодирование итераций в виде разделенной запятой пары, состоящей из 'MaximumLDPCIterationCount' и положительное целое число.

Зависимости

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

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

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

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

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

Зависимости

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

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

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

свернуть все

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

Типы данных: 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.

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

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

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

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

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

Для получения дополнительной информации смотрите Структуру WLAN PPDU и 802.11ax Параметризация для Генерации сигналов и Симуляции.

Алгоритмы

свернуть все

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

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

Функция реализует алгоритм 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' аргумент пары "имя-значение".

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

Функция реализует многоуровневый алгоритм 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

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

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

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

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

Функция реализует алгоритм декодирования суммы 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] Джингу Чен, Р.М. Таннер, К. Джонс и Ян Ли. "Улучшенные Алгоритмы Декодирования Суммы Min для Неправильных Кодов LDPC". В Продолжениях. Международный Симпозиум по Теории информации, 2005. ISIT 2005., 449-53, 2005. https://doi.org/10.1109/ISIT.2005.1523374.

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

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

Введенный в R2018b