Полярное кодирование и декодирование потоковых выборок

Этот пример показывает, как симулировать блоки NR Polar Encode и Decode и сравнить аппаратно оптимизированные результаты с результатами от 5G функций Toolbox™.

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

Выберите серию значений входа для K и E. Эти значения должны быть допустимыми парами, поддерживаемыми 5G стандартом NR. Сгенерируйте случайные системы координат входных данных и добавьте кодовое слово CRC. Этот пример использует режим восходящей линии связи, поэтому каждое сообщение имеет 11 биты CRC. Нисходящие сообщения имеют 24 бита CRC, и нисходящие сообщения DCI требуют предварительной обработки 1 в систему координат.

Преобразуйте системы координат сообщения в потоки булевых выборок и управляющих сигналов, которые указывают контуры системы координат. Сгенерируйте входные векторы значений K и E с течением времени. Пример модели импортирует переменные рабочей области encSampleIn, encCtrlIn, encKfi, encEfi, sampleTime, и simTime.

В этом примере количество недопустимых циклов между системами координат эмпирически выбирается, чтобы соответствовать задержке блока NR Polar Encoder для заданных значений K и E. Когда значения K и E больше, чем в этом примере, количество недопустимых циклов между системами координат должно быть больше. Используйте выходной сигнал nextFrame блока, чтобы определить, когда блок готов принять начало следующего входного кадра.

K = [132; 132; 132; 54];
E = [256; 256; 256; 124];
numFrames = 4;
numCRCBits = 11;
idleCyclesBetweenSamples = 0;
idleCyclesBetweenFrames = 500;
samplesPerCycle = 1;
btwSamples = false(idleCyclesBetweenSamples,1);
btwFrames = false(idleCyclesBetweenFrames,1);

encKfi = [];
encEfi = [];
dataIn = {numFrames};
for ii = 1:numFrames
    msg = randi([0 1],K(ii)-numCRCBits,1);
    msg = nrCRCEncode(msg,'11'); % CRC poly is '11' for uplink and '24C' for downlink
    encKfi = [encKfi;repmat([fi(K(ii),0,10,0);btwSamples],length(msg),1);btwFrames];
    encEfi = [encEfi;repmat([fi(E(ii),0,14,0);btwSamples],length(msg),1);btwFrames];
    dataIn{1,ii} = logical(msg);
end

[encSampleIn,encCtrlIn] = whdlFramesToSamples(...
    dataIn,idleCyclesBetweenSamples,idleCyclesBetweenFrames,samplesPerCycle);

sampleTime = 1;
simTime = length(encCtrlIn) + K(numFrames)*2;   %#ok<NASGU>

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

Подсистема Алгоритма HDL содержит блок NR Polar Encoder. Выполнение модели импортирует переменные входного сигнала из рабочей области и возвращает поток полярно-кодированных выходных выборок и управляющих сигналов, которые указывают контуры системы координат. Модель экспортирует переменные sampleOut и ctrlOut в рабочее пространство MATLAB.

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

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

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

encHDL = whdlSamplesToFrames(encOut.sampleOut,encOut.ctrlOut);

for ii=1:numFrames
    encRef = nrPolarEncode(double(dataIn{ii}),E(ii),10,false); % last two arguments needed for uplink only
    error = sum(abs(encRef - encHDL{ii}));
    fprintf(['Encoded Frame %d: Behavioral and ' ...
        'HDL simulation differ by %d bits\n'],ii,error);
end
Maximum frame size computed to be 256 samples.
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 Polar Decoder. Используйте Системных объектов канала, модулятора и демодулятора, чтобы добавить шум к сигналу.

Снова создайте векторы значений K и E и преобразуйте системы координат данных в потоковые выборки с управляющими сигналами. Пример модели импортирует переменные рабочей области decSampleIn, decCtrlIn, decKfi, decEfi, sampleTime, и simTime.

В этом примере количество недопустимых циклов между системами координат эмпирически выбирается, чтобы соответствовать задержке блока NR Polar Decoder для заданных значений K и E. Когда значения K и E больше, чем в этом примере, количество недопустимых циклов между системами координат должно быть больше. Используйте выходной сигнал nextFrame блока, чтобы определить, когда блок готов принять начало следующего входного кадра.

nVar = 0.7;
chan = comm.AWGNChannel('NoiseMethod','Variance','Variance',nVar);
bpskMod = comm.BPSKModulator;
bpskDemod = comm.BPSKDemodulator('DecisionMethod', ...
    'Approximate log-likelihood ratio','Variance',nVar);
% more idle cycles greater list lengths. max 5251 for list 4.
% 1st pkt LL=8 just over 5000, not sure what is max?
% should i make this a more simulink-y example to show how to use the fifo
% with the nextframe signal?
idleCyclesBetweenFrames = 6000;
btwFrames = false(idleCyclesBetweenFrames,1);
decKfi = [];
decEfi = [];
rxLLR = {numFrames};
rxLLRfi = {numFrames};
for ii=1:numFrames
    mod = bpskMod(double(encHDL{ii}));
    rSig = chan(mod);
    rxLLR{1,ii} = bpskDemod(rSig);
    rxLLRfi{1,ii} = fi(rxLLR{1,ii},1,6,0);
    decKfi = [decKfi;repmat([fi(K(ii),0,10,0);btwSamples],length(rSig),1);btwFrames];
    decEfi = [decEfi;repmat([fi(E(ii),0,14,0);btwSamples],length(rSig),1);btwFrames];
end

[decSampleIn,decCtrlIn] = whdlFramesToSamples(...
    rxLLRfi,idleCyclesBetweenSamples,idleCyclesBetweenFrames,samplesPerCycle);

simTime = length(decCtrlIn) + K(numFrames)*2;

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

Подсистема алгоритма HDL содержит блок NR Polar Decoder, настроенный на использование списка длиной восемь. Выполнение модели импортирует переменные входного сигнала из рабочей области и возвращает поток декодированных выходных выборок и сигналов управления, которые указывают контуры системы координат. Модель экспортирует переменные sampleOut, ctrlOut, и errOut в рабочее пространство MATLAB. Выберите допустимые значения errOut сигнал при помощи ctrlOut.valid сигнал.

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

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

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

The nrPolarDecode функция возвращает декодированное сообщение, включая 24 пересчитанных бит CRC. Блок NR Polar Decoder возвращает декодированное сообщение без бит CRC и возвращает состояние CRC отдельно на порту err.

Выходные биты блоков и функций могут отличаться для систем координат, которые сообщают об ошибке декодирования. Блок может вернуть ошибку декодирования в случаях, когда функция успешно декодирует сообщение. Общая производительность декодирования блока очень близка к эффективности функции.

decHDL = whdlSamplesToFrames(decOut.sampleOut,decOut.ctrlOut);
errHDL = decOut.errOut(decOut.ctrlOut(:,2));

L = 8;
for ii = 1:numFrames
    decRef = nrPolarDecode(rxLLR{1,ii},K(ii),E(ii),L,10,false,11); % last three arguments needed for uplink only
    [decRef,errRef] = nrCRCDecode(decRef,'11'); % CRC poly is '11' for uplink, '24C' for downlink
    error = sum(abs(decRef - decHDL{1,ii}));
    fprintf(['Decoded Frame %d: Behavioral and ' ...
        'HDL simulation differ by %d bits\n'],ii,error);
    msg = dataIn{1,ii}(1:(length(dataIn{ii})-numCRCBits));
    loopErr = sum(abs(msg - decHDL{1,ii}));
    fprintf(['The decoded output message from the HDL simulation',...
        ' differs from the input message by %d bits \n'],loopErr);
    errRef = any(errRef);
    if ~errHDL(ii) && ~errRef
        fprintf('HDL and behavioral simulations successfully decoded the message. \n');
    elseif errHDL(ii) && ~errRef
        fprintf(['Behavioral simulation successfully decoded the message,',...
            ' but HDL sim reported a decode error\n']);
    elseif ~errHDL(ii) && errRef
        fprintf(['HDL simulation successfully decoded the message,',...
            ' but behavioral simulation reported a decode error\n']);
    else
        fprintf('HDL and behavioral simulations both reported a decode error. \n');
    end
end
Maximum frame size computed to be 121 samples.
Decoded Frame 1: Behavioral and HDL simulation differ by 0 bits
The decoded output message from the HDL simulation differs from the input message by 0 bits 
HDL and behavioral simulations successfully decoded the message. 
Decoded Frame 2: Behavioral and HDL simulation differ by 0 bits
The decoded output message from the HDL simulation differs from the input message by 0 bits 
HDL and behavioral simulations successfully decoded the message. 
Decoded Frame 3: Behavioral and HDL simulation differ by 0 bits
The decoded output message from the HDL simulation differs from the input message by 0 bits 
HDL and behavioral simulations successfully decoded the message. 
Decoded Frame 4: Behavioral and HDL simulation differ by 0 bits
The decoded output message from the HDL simulation differs from the input message by 0 bits 
HDL and behavioral simulations successfully decoded the message. 

См. также

| | (5G Toolbox) | (5G Toolbox)