LDPC декодируют данные о потоковой передаче для нескольких скоростей кода с ранним завершением

В этом примере показано, как использовать несколько скоростей кода, и ранние критерии завершения показывает в блоке NR LDPC Decoder Simulink®. Вход с блоком сгенерирован с помощью nrLDPCEncode (5G Toolbox) функция MATLAB® и выход блока по сравнению с входом функции. В этом примере можно выбрать или сумму min или нормированный алгоритм суммы min для операции декодирования.

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

Выберите серию входных значений для основного номера графика (bgn) и liftingSize согласно 5G стандарт NR и сгенерируйте соответствующие входные векторы для тех значений. Используйте закодированные данные из nrLDPCEncode функция, чтобы сгенерировать входные значения отношения логарифмической правдоподобности (LLR) для блока NR LDPC Decoder. Используйте канал, модулятор и Системные объекты демодулятора, чтобы добавить шум в сигнал. Снова, создайте векторы из bgn и liftingSize, и затем преобразуйте системы координат данных к LLRs с управляющим сигналом, который указывает на контуры системы координат. decFrameGap вмещает задержку блока NR LDPC Decoder для основного номера графика, liftingSize, и количества итераций. Используйте nextFrame выходной сигнал, чтобы определить, когда блок будет готов принять запуск следующего входного кадра.

bgn = [1; 0; 0; 1];
liftingSize = [4; 384; 144; 208];
numRows = [6; 38; 24; 10];
numFrames = 4;
serial = false;  % true for serial inputs and false for parallel inputs

msg = {numFrames};
K = [];
N = [];
for ii = 1:numFrames
    if bgn(ii) == 0
        K(ii) = 22;
    else
        K(ii) = 10;
    end
    N(ii) = numRows(ii) + K(ii)-2;
    frameLen = liftingSize(ii)*K(ii);
    msg{ii} = randi([0 1],frameLen,1);

    encTmp = nrLDPCEncode(msg{ii},bgn(ii)+1);
    encOut{ii} = encTmp(1:N(ii)*liftingSize(ii));
end
nVar = 0.5;
chan = comm.AWGNChannel('NoiseMethod','Variance','Variance',nVar);
bpskMod = comm.BPSKModulator;
bpskDemod = comm.BPSKDemodulator('DecisionMethod', ...
    'Approximate log-likelihood ratio','Variance',nVar);

algo = 'Min-sum'; % min-sum, 'normalized min-sum'
if strcmpi(algo,'Min-sum')
    alpha = 1;
else
    alpha = 0.75;
end

numIter = 8;
decbgnIn = [];
decliftingSizeIn = [];
rxLLR = {numFrames};
decSampleIn = [];
decStartIn = [];
decEndIn = [];
decValidIn = [];
decnumRows = [];

for ii=1:numFrames
    mod = bpskMod(double(encOut{ii}));
    rSig = chan(mod);
    rxLLR{ii} = fi(bpskDemod(rSig),1,4,0);

    if serial
        len = N(ii)*liftingSize(ii); %#ok<*UNRCH>
        decFrameGap = numIter*7000 + liftingSize(ii)*K(ii);
     else
        len = N(ii)*ceil(liftingSize(ii)/64);
        decFrameGap = numIter*1200;
     end

    decIn = ldpc_dataFormation(rxLLR{ii}',liftingSize(ii),N(ii),serial);

    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)]);
    decbgnIn = logical([decbgnIn repmat(bgn(ii),1,len) zeros(1,decFrameGap)]);
    decliftingSizeIn = uint16([decliftingSizeIn repmat(liftingSize(ii),1,len) zeros(1,decFrameGap)]);
    decnumRows = fi([decnumRows repmat(numRows(ii),1,len) zeros(1,decFrameGap)],0,6,0);
end

decSampleIn = timeseries(fi(decSampleIn',1,4,0));
sampleTime = 1;

simTime = length(decValidIn);

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

Подсистема Алгоритма HDL содержит блок NR LDPC Decoder. Выполнение модели импортирует переменные decSampleIn входного сигнала, decStartIn, decEndIn, decValidIn, decbgnIn, decliftingSizeIn, numIterРазмер шага, и simTime и экспортирует поток декодируемых выходных выборок sampleOut наряду с управляющим сигналом ctrlOut к рабочему пространству MATLAB.

open_system('NRLDPCDecoderCodeRateHDL');
if alpha ~= 1
    set_param('NRLDPCDecoderCodeRateHDL/HDL Algorithm/NR LDPC Decoder','Algorithm','Normalized min-sum');
else
    set_param('NRLDPCDecoderCodeRateHDL/HDL Algorithm/NR LDPC Decoder','Algorithm','Min-sum');
end
decOut = sim('NRLDPCDecoderCodeRateHDL');

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

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

startIdx = find(decOut.ctrlOut.start.Data);
endIdx = find(decOut.ctrlOut.end.Data);

for ii = 1:numFrames
   decHDL{ii} = ldpc_dataExtraction(decOut.sampleOut.Data,liftingSize(ii),startIdx(ii),endIdx(ii),K(ii),serial); %#ok<*SAGROW>
   error = sum(abs(double(msg{ii})-decHDL{ii}));
   fprintf(['Decoded frame %d: Output data differs by %d bits\n'],ii,error);
   iter_tmp = squeeze(decOut.actIter.Data);
   actIter{ii} = iter_tmp(startIdx(ii));
   fprintf(['Actual iterations taken to decode the frame: %d \n'],actIter{ii});
end
Decoded frame 1: Output data differs by 0 bits
Actual iterations taken to decode the frame: 2 
Decoded frame 2: Output data differs by 0 bits
Actual iterations taken to decode the frame: 2 
Decoded frame 3: Output data differs by 0 bits
Actual iterations taken to decode the frame: 2 
Decoded frame 4: Output data differs by 0 bits
Actual iterations taken to decode the frame: 3 

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

Блоки

Функции