В этом примере показано, как использовать несколько скоростей кода, и ранние критерии завершения показывает в блоке 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);
Подсистема Алгоритма 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');
Преобразуйте вывод данных потоковой передачи блока 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
nrLDPCEncode
(5G Toolbox)