Декодирование LDPC потоковых данных для нескольких скоростей кода с ранним прекращением

В этом примере показано, как использовать множественные скорости кода и функции раннего завершения в блоке 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);

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

Подсистема алгоритма 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');

Сравнение выхода блоков 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 

См. также

Блоки

Функции