LDPC кодируют и декодируют потоковой передачи данных

В этом примере показано, как симулировать Энкодер NR LDPC и блоки Декодера Энкодера NR LDPC. В этом примере оптимизированные оборудованием результаты этих блоков по сравнению с соответствующими функциями в 5G Toolbox™.

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

Выберите серию входных значений для bgn и liftingSize. Эти значения должны поддерживаться 5G стандарт NR. Сгенерируйте соответствующие входные векторы bgn и liftingSize значений в зависимости от времени. Сгенерируйте случайные системы координат входных данных и преобразуйте их в булевы векторы и управляющие сигналы, которые указывают на контуры системы координат. Модель в качестве примера импортирует переменные encSampleIn рабочей области, encStartIn, encEndIn, encValidIn, encbgnIn, encliftingSizeIn'SampleTime' , и simTime.

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

bgn         = [0; 1; 1; 0];
liftingSize = [4; 384; 144; 208];
numFrames = 4;

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);
    len = K(ii) * ceil(liftingSize(ii)/64);

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

    encSampleIn   = logical([encSampleIn encIn zeros(64,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. Выполнение модели импортирует переменные входного сигнала из рабочей области и возвращается, LDPC закодировал выходные векторы наряду с управляющими сигналами, которые указывают на контуры системы координат. Модель экспортирует sampleOut и ctrlOut к рабочему пространству MATLAB.

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

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

Преобразуйте данные о потоковой передаче назад в системы координат для сравнения с результатами nrLDPCEncode функция от 5G Toolbox™.

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)); %#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

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

Используйте закодированные данные, чтобы сгенерировать входные отношения логарифмической правдоподобности (LLR) для блока NR LDPC Decoder. Используйте канал, модулятор, и демодулятор возражает, чтобы добавить некоторый шум в сигнал.

Снова, создайте векторы bgn и liftingSize и преобразуйте системы координат данных к векторам входа LLR с управляющими сигналами. Модель в качестве примера импортирует переменные decSampleIn рабочей области, decStartIn, decEndIn, decValidIn, decbgnIn, decliftingSizeIn, numIter'SampleTime' , и simTime.

decFrameGap размещает задержку блока NR LDPC Decoder для bgn, liftingSize, и количество итераций. Используйте сигнал nextFrame определить, когда блок будет готов принять запуск следующего входного кадра.

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

numIter = 8;
decFrameGap = numIter *1200;
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);

    len = N(ii)* ceil(liftingSize(ii)/64);

    decIn = ldpc_dataFormation(rxLLR{ii}',liftingSize(ii),N(ii));

    decSampleIn   = [decSampleIn decIn zeros(64,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. Выполнение модели импортирует переменные входного сигнала из рабочей области и возвращает поток декодируемых выходных выборок наряду с управляющими сигналами, которые указывают на контуры системы координат. Модель экспортирует sampleOut и ctrlOut к рабочему пространству MATLAB.

open_system('NRLDPCDecoderHDL');
decOut = sim('NRLDPCDecoderHDL');

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

Преобразуйте данные о потоковой передаче, возвращенные в модель Simulink в системы координат для сравнения с результатами nrLDPCDecode функция от 5G Toolbox™.

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)); %#ok<*SAGROW>
    decRef = nrLDPCDecode(double(rxLLR{ii}),bgn(ii)+1,numIter, 'Algorithm','Normalized min-sum','ScalingFactor',1.0,...
            '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

Смотрите также

Блоки

Для просмотра документации необходимо авторизоваться на сайте