exponenta event banner

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

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

Создание входных данных для кодировщика

Выберите серию входных ценностей для bgn и liftingSize согласно 5G НОМЕР стандарта. Создайте соответствующие входные векторы для выбранных значений базового графа (bgn) и размера. Создайте случайные кадры входных данных и преобразуйте их в логические данные и управляющий сигнал, указывающий границы кадра. encFrameGap приспосабливает время ожидания НОМЕРА блока Кодирующего устройства LDPC для ценностей liftingSize и bgn. Используйте сигнал 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 содержит блок кодера LDPC NR. При запуске модели импортируются переменные входного сигнала 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 для генерации входных значений отношения логарифмического правдоподобия (LLR) для блока декодера NR LDPC. Используйте объекты системы канала, модулятора и демодулятора, чтобы добавить некоторый шум к сигналу. Снова, создайте векторы bgn и liftingSize и преобразуйте структуры данных к LLRs с управляющим сигналом, который указывает на границы структуры. decFrameGap приспосабливает время ожидания НОМЕРА блока Декодера LDPC для 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. При запуске модели импортируются переменные входного сигнала 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

См. также

Блоки

Функции