Декодируйте WLAN LDPC, передающий данные потоком

В этом примере показано, как симулировать блок WLAN LDPC Decoder и сравнить оптимизированные оборудованием результаты с результатами Коммуникации функция Toolbox™.

Сгенерируйте вход с блоком с помощью Коммуникационной функции Тулбокса ldpcEncode. Обеспечьте сгенерированные данные как вход с блоком WLAN LDPC Decoder и Коммуникационной функцией Тулбокса ldpcDecode. Сравните выход блока с выходом ldpcDecode функция. Этот пример содержит две модели Simulink®. Одна модель сконфигурирована, чтобы поддержать стандарты WLAN IEEE 802.11 n/ac/ax, и другая модель сконфигурирована, чтобы поддержать стандартное объявление IEEE 802.11. Когда вы запускаете скрипт, соответствующая модель выбрана на основе значения, которое вы задаете для переменной standard упомянутый в скрипте.

Настройте входные переменные

Выберите серию входных значений для длины блока и скорости кода согласно стандарту WLAN. Можно изменить значения переменных в этом разделе на основе требований.

standard = 'IEEE 802.11 n/ac/ax';  % IEEE 802.11 n/ac/ax or IEEE 802.11 ad
codeRateIdx = [0; 1; 2; 3];        % Code rate index
blkLenIdx = [0; 1; 2; 0];          % Block length index
numFrames = 4;
scalar = false;                    % true for scalar inputs and false
                                   % for vector inputs
algorithm = 'Min-sum';             % Min-sum or Normalized min-sum
niter = 8;                         % Number of iterations

if strcmpi(algorithm,'Min-sum')
    alpha = 1;
else
    alpha = 0.75;                  % Scaling factor, which must be in
                                   % the range [0.5:0.0625:1]
end

Сгенерируйте входные данные

Сгенерируйте входные параметры для ldpcEncode функция с заданной длиной блока и переменными скорости кода. Используйте закодированные данные из ldpcEncode функционируйте, модулируйте данные с помощью функции модулятора, добавьте шум с помощью Системы канала object™ и сгенерируйте значения отношения логарифмической правдоподобности (LLR) с помощью функции демодулятора символа. После этого введите эти значения LLR как вход к ldpcDecode функция.

Создайте векторы из индекса длины блока и индекса скорости кода с помощью blockLenIdx и codeRateIdx переменные, соответственно. Преобразуйте системы координат значений LLR к выборкам с сигналом шины управления, который указывает на контуры системы координат. Обеспечьте эти векторы и шину управления как вход с блоком WLAN LDPC Decoder.

decFrameGap переменная в скрипте вмещает задержку блока WLAN LDPC Decoder для заданной длины блока, скорости кода и количества итераций. Используйте nextFrame выходной сигнал, чтобы определить, когда блок будет готов принять запуск следующего входного кадра.

% Initialize inputs
msg = {numFrames};                 % Input to |ldpcEncode| function
rxLLR = cell(1,numFrames);         % Input to |ldpcDecode| function
refOut = cell(1,numFrames);        % Output of |ldpcDecode| function

decSampleIn = [];
decStartIn = [];
decEndIn = [];
decValidIn = [];
decBlkLenIdxIn = [];
decCodeRateIdxIn = [];

for ii = 1:numFrames
    if strcmpi(standard,'IEEE 802.11 n/ac/ax')
        blockLenSet = [648,1296,1944];
        rateSet = {'1/2','2/3','3/4','5/6'};

        blkLen = blockLenSet(blkLenIdx(ii)+1);
        codeRate = rateSet{codeRateIdx(ii)+1};
        modelName = 'HDLWLANLDPCDecoderStd11ac';
    else
        rateSet = {'1/2','5/8','3/4','13/16'};
        blkLen = 672;
        codeRate = rateSet{codeRateIdx(ii)+1};
        modelName = 'HDLWLANLDPCDecoderStd11ad';
    end

    [rxLLR{ii},refOut{ii},msg{ii}] = inputGenForWLANLDPCDec(blkLen,codeRate,niter,alpha);

    if scalar
        decFrameGap = niter*1000 + length(msg{ii}); %#ok
        vecSize = 1;
        len = length(rxLLR{ii});
     else
        len = length(rxLLR{ii})/8;
        vecSize = 8;
        decFrameGap = niter*1000 + ceil(length(msg{ii})/8);
     end

     decIn = reshape(rxLLR{ii},vecSize,[]);

    decSampleIn = [decSampleIn decIn zeros(size(decIn,1),decFrameGap)]; %#ok<*AGROW>
    decStartIn = logical([decStartIn 1 zeros(1,len-1) zeros(1,decFrameGap)]);
    decEndIn = logical([decEndIn zeros(1,len-1) 1 zeros(1,decFrameGap)]);
    decValidIn = logical([decValidIn ones(1,len) zeros(1,decFrameGap)]);
    decBlkLenIdxIn = ([decBlkLenIdxIn repmat(blkLenIdx(ii),1,len) zeros(1,decFrameGap)]);
    decCodeRateIdxIn = ([decCodeRateIdxIn repmat(codeRateIdx(ii),1,len) zeros(1,decFrameGap)]);
end

dataIn = timeseries(fi(decSampleIn',1,4,0));
startIn = timeseries(decStartIn);
endIn = timeseries(decEndIn);
validIn = timeseries(decValidIn);

if strcmpi(standard,'IEEE 802.11 n/ac/ax')
    blockLenIdx = timeseries(fi(decBlkLenIdxIn,0,2,0));
end
codeRateIdx = timeseries(fi(decCodeRateIdxIn,0,2,0)); % For the standard
                                                      % IEEE 802.11 ad

simTime = length(decValidIn);

Запустите модель Simulink

HDL WLAN LDPC Decoder подсистема содержит блок WLAN LDPC Decoder. Выполнение модели импортирует переменные dataIn входного сигнала, startIn, endIn, validIn, blockLenIdx, codeRateIdx, niter, и simTime с блоком из скрипта и экспорта поток декодируемых выходных выборок dataOut и шина управления, содержащая startOut, endOut, и validOut сигналы от блока до рабочего пространства MATLAB.

open_system(modelName);
if alpha ~= 1
    set_param([modelName '/HDL WLAN LDPC Decoder/WLAN LDPC Decoder'], ...
        'Algorithm','Normalized min-sum');
    set_param([modelName '/HDL WLAN LDPC Decoder/WLAN LDPC Decoder'], ...
        'ScalingFactor',num2str(alpha));
else
    set_param([modelName '/HDL WLAN LDPC Decoder/WLAN LDPC Decoder'], ...
        'Algorithm','Min-sum');
end
sim(modelName);

Сравните блок Simulink Выход с функцией MATLAB Выход

Преобразуйте вывод данных потоковой передачи блока WLAN LDPC Decoder к системам координат. Сравните системы координат с выходом ldpcDecode функция.

startIdx = find(squeeze(startOut));
endIdx = find(squeeze(endOut));
dec = squeeze(dataOut);

decHDL = {numFrames};
for ii = 1:numFrames
    idx = startIdx(ii):endIdx(ii);
    if scalar
        decHDL{ii} = dec(idx);
    else
        decHDL{ii} = dec(:,idx);
    end
    HDLOutput = decHDL{ii}(1:length(refOut{ii}));
    error = sum(abs(double(refOut{ii})-HDLOutput(:)));
   fprintf(['Decoded frame %d: Output data differs by %d bits\n'],ii,error);
end
Decoded frame 1: Output data differs by 0 bits
Decoded frame 2: Output data differs by 0 bits
Decoded frame 3: Output data differs by 0 bits
Decoded frame 4: Output data differs by 0 bits

Смотрите также

Блоки

Функции