Полярный кодируют и декодируют потоковой передачи выборок

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

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

Необходимо задать направление ссылки, потому что схема кодирования отличается для нисходящих и восходящих сообщений. Нисходящие сообщения закодированы с перемежением и используют продолжительность CRC 24 битов. Восходящие сообщения не используют перемежение и используют продолжительность CRC 6 (18 <K <25) или 11 битов (31 <K <1023).

Этот пример использует восходящий режим с коэффициентами теплопроводности, больше, чем 31, таким образом, каждое сообщение должно иметь 11 битов CRC.

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

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

В данном примере количество недопустимых циклов между системами координат опытным путем выбрано, чтобы вместить задержку NR Полярный блок 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 polynomial is '6' for uplink when 18<K<25, '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 Полярный блок Encoder. Выполнение модели импортирует переменные входного сигнала из рабочей области и возвращает поток полярно закодированных выходных выборок и управляющих сигналов, которые указывают на контуры системы координат. NR Полярный блок Encoder в модели имеет набор параметров направления Ссылки к Uplink, и принимает K и значения E от входных портов. Модель экспортирует переменные sampleOut и ctrlOut к рабочему пространству MATLAB.

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

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

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

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

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

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

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

В данном примере количество недопустимых циклов между системами координат опытным путем выбрано, чтобы вместить задержку NR Полярный блок 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 Полярный блок Decoder, сконфигурированный, чтобы использовать длину списка восемь. Блок в модели также имеет набор параметров направления Ссылки к Uplink, и принимает K и значения E от входных портов. Выполнение модели импортирует переменные входного сигнала из рабочей области и возвращает поток декодируемых выходных выборок и управляющих сигналов, которые указывают на контуры системы координат. Модель экспортирует переменные sampleOut, ctrlOut, и errOut к рабочему пространству MATLAB. Выберите допустимые значения errOut сигнал при помощи ctrlOut.valid сигнал.

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

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

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

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

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

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,numCRCBits); % last three arguments needed for uplink only
    [decRef,errRef] = nrCRCDecode(decRef,'11'); % CRC polynomial is '6' for uplink when 18<K<25, '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)

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