В этом примере показано, как использовать множественные скорости кода и функции раннего завершения в блоке NR LDPC Decoder Simulink ®. Вход в блок генерируется с помощью nrLDPCDecode
(5G Toolbox) Функция MATLAB ® и выход блока сравнивается со входом функции. В этом примере можно выбрать либо min-sum, либо нормализованный алгоритм min-sum для операции декодирования.
Выберите серию значений входа для базового числа графика (bgn) и liftingSize согласно 5G стандарту NR и сгенерируйте соответствующие векторы входа для этих значений. Используйте закодированные данные из nrLDPCEncode
функция для генерации входных значений логарифмического отношения логарифмической правдоподобности (LLR) для блока NR LDPC Decoder. Используйте Системных объектов канала, модулятора и демодулятора, чтобы добавить шум к сигналу. Снова создайте векторы bgn
и liftingSize
, и затем преобразуйте системы координат данных в LLR с помощью управляющего сигнала, который указывает контуры системы координат. The 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
, 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 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)