В этом примере показано, как использовать несколько кодовых скоростей и функции критериев раннего завершения в блоке NR LDPC Decoder Simulink ®. Вход в блок генерируется с помощью nrLDPCDecode (5G Toolbox) Функция MATLAB ® и вывод блока сравниваются с входом функции. В этом примере можно выбрать либо алгоритм минимальной суммы, либо нормализованный алгоритм минимальной суммы для операции декодирования.
Выберите ряд входных значений для базового номера графика (bgn) и параметра Размер (Size) в соответствии со стандартом 5G NR и создайте соответствующие входные векторы для этих значений. Использовать закодированные данные из nrLDPCEncode функция формирования входных значений отношения логарифмического правдоподобия (LLR) для блока декодера NR LDPC. Используйте объекты канала, модулятора и демодулятора System для добавления шума в сигнал. Снова создайте векторы bgn и liftingSizeи затем преобразуют кадры данных в LLR с помощью управляющего сигнала, который указывает границы кадра. decFrameGap адаптирует задержку блока декодера NR LDPC для числа базовых графов, размера и количества итераций. Используйте выходной сигнал 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);
Подсистема алгоритма HDL содержит блок декодера NR LDPC. При запуске модели импортируются переменные входного сигнала decSampleIn, decStartIn, decEndIn, decValidIn, decbgnIn, decliftingSizeIn, numIter, sampleTime, и 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');

Преобразование потоковых данных, выводимых блоком декодера NR LDPC, в кадры, а затем сравнение кадров с входными данными 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
nrLDPCEncode (5G Панель инструментов)