Кодирование LDPC и декодирование потоковых данных

В этом примере показано, как симулировать блоки NR LDPC Encoder и NR LDPC Decoder Simulink ® и сравнить аппаратно оптимизированные результаты с результатами от функций 5G Toolbox™. Эти блоки поддерживают скалярные и векторные входы. Блок NR LDPC Decoder позволяет вам выбрать или Min-sum, или Normalized min-sum алгоритм для операции декодирования.

Сгенерируйте входные данные для энкодера

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

bgn         = [0; 1; 1; 0];
liftingSize = [4; 384; 144; 208];
numFrames = 4;
serial = false; % {false,true};

encbgnIn = [];encliftingSizeIn = [];
msg = {numFrames};
K =[];N = [];
encSampleIn = [];encStartIn = [];encEndIn = [];encValidIn = [];
encFrameGap = 2500;
for ii = 1:numFrames
    if bgn(ii) == 0
        K(ii) = 22;
        N(ii) = 66;
    else
        K(ii) = 10;
        N(ii) = 50;
    end
    frameLen = liftingSize(ii) * K(ii);
    msg{ii} = randi([0 1],1,frameLen);
    if serial
    len = K(ii) * liftingSize(ii);
    encFrameGap = liftingSize(ii) * N(ii) + 2500;
    else
    len = K(ii) * ceil(liftingSize(ii)/64); %#ok<*UNRCH>
    encFrameGap = 2500;
    end

    encIn = ldpc_dataFormation(msg{ii},liftingSize(ii),K(ii),serial);

    encSampleIn   = logical([encSampleIn encIn zeros(size(encIn,1),encFrameGap)]); %#ok<*AGROW>
    encStartIn    = logical([encStartIn  1  zeros(1,len-1)  zeros(1,encFrameGap)]);
    encEndIn      = logical([encEndIn    zeros(1,len-1) 1   zeros(1,encFrameGap)]);
    encValidIn    = logical([encValidIn    ones(1,len)      zeros(1,encFrameGap)]);
    encbgnIn      = logical([encbgnIn   repmat(bgn(ii),1,len) zeros(1,encFrameGap)]);
    encliftingSizeIn = uint16([encliftingSizeIn repmat(liftingSize(ii),1,len) zeros(1,encFrameGap)]);
end

encSampleIn = timeseries(logical(encSampleIn'));

sampleTime = 1;
simTime = length(encValidIn);   %#ok<NASGU>

Запуск модели энкодера

Подсистема алгоритма HDL содержит блок NR LDPC Encoder. Выполнение модели импортирует переменные входного сигнала encSampleIn, encStartIn, encEndIn, encValidIn, encbgnIn, encliftingSizeIn, sampleTime, и simTime и экспорты sampleOut и ctrlOut переменные в рабочую область MATLAB ®.

open_system('NRLDPCEncoderHDL');
encOut = sim('NRLDPCEncoderHDL');

Проверьте результаты энкодера

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

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

for ii = 1:numFrames
    encHDL{ii} = ldpc_dataExtraction(encOut.sampleOut.Data,liftingSize(ii),startIdx(ii),endIdx(ii),N(ii),serial); %#ok<*SAGROW>
    encRef = nrLDPCEncode(msg{ii}',bgn(ii)+1);
    error = sum(abs(encRef - encHDL{ii}));
    fprintf(['Encoded Frame %d: Behavioral and ' ...
        'HDL simulation differ by %d bits\n'],ii,error);
end
Encoded Frame 1: Behavioral and HDL simulation differ by 0 bits
Encoded Frame 2: Behavioral and HDL simulation differ by 0 bits
Encoded Frame 3: Behavioral and HDL simulation differ by 0 bits
Encoded Frame 4: Behavioral and HDL simulation differ by 0 bits

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

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

nVar = 1.2;
chan = comm.AWGNChannel('NoiseMethod','Variance','Variance',nVar);
bpskMod = comm.BPSKModulator;
bpskDemod = comm.BPSKDemodulator('DecisionMethod', ...
    'Approximate log-likelihood ratio','Variance',nVar);

algo = 'Normalized 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 = [];

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

    if serial
        len = N(ii)* liftingSize(ii);
        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)]);
end

decSampleIn = timeseries(fi(decSampleIn',1,6,0));

simTime = length(decValidIn);

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

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

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

Проверьте результаты декодера

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

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>
   decRef = nrLDPCDecode(double(rxLLR{ii}),bgn(ii)+1,numIter, 'Algorithm','Normalized min-sum','ScalingFactor',alpha,...
            'Termination','max');
   error = sum(abs(double(decRef) - decHDL{ii}));
   fprintf(['Decoded Frame %d: Behavioral and ' ...
        'HDL simulation differ by %d bits\n'],ii,error);
end
Decoded Frame 1: Behavioral and HDL simulation differ by 0 bits
Decoded Frame 2: Behavioral and HDL simulation differ by 0 bits
Decoded Frame 3: Behavioral and HDL simulation differ by 0 bits
Decoded Frame 4: Behavioral and HDL simulation differ by 0 bits

См. также

Блоки

Функции