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

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

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

Сгенерируйте случайные системы координат входных данных и управляющего сигнала, который указывает контуры системы координат. Зазор системы координат соответствует задержке блока Энкодера NR CRC.

CRCType = 'CRC24A';
numFrames = 4;
scalar = true;                                                % true for scalar inputs and false vector inputs

parallel = false;                                             % true for parallel architecture and false for
                                                              % serial architecture
msg = {numFrames};
dataIn = [];
encStartIn = [];
encEndIn = [];
encValidIn = [];
[poly,crcLen] = NRCRCEncodeAndDecoderHDLInitScript(CRCType);
if parallel
    listN = divisors(crcLen);                                 % Factors of length of CRC polynomial
    dataWidth = randsrc(1,1,listN(2:end));
else
    dataWidth = 1;
end
frameGap = 120;                                               % Frame gap selected based on CRCType and dataWidth
for ii = 1:numFrames
    len = randsrc(1,1,1:1000);
    frameLen = len*dataWidth;
    msg{ii} = randi([0 1],1,frameLen);

    % Generate data based on the selected dataWidth
    if scalar
        data = reshape(msg{ii},dataWidth,len);
        encIn = zeros(1,size(data,2));
        for i = 1:size(data,2)
            encIn(i) = bi2de(data(:,i)','left-msb'); %#ok<*SAGROW>
        end
        dataIn  = fi([dataIn encIn zeros(size(encIn,1),frameGap)],0,dataWidth,0);
    else
        encIn = reshape(msg{ii},dataWidth,len); %#ok<*UNRCH>
        dataIn = logical([dataIn encIn zeros(size(encIn,1),frameGap)]);
    end

    encStartIn = logical([encStartIn 1 zeros(1,len-1) zeros(1,frameGap)]);
    encEndIn   = logical([encEndIn zeros(1,len-1) 1 zeros(1,frameGap)]);
    encValidIn = logical([encValidIn ones(1,len) zeros(1,frameGap)]);
end

encSampleIn = timeseries(dataIn');
sampleTime = 1;
simTime = length(encValidIn);

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

HDLNCRCEncodeDecode подсистема содержит HDL NR CRC Encoder и HDL NR CRC Decoder подсистемы, которые содержат NR CRC Encoder и NR CRC Decoder блоки Выполнение модели импортирует переменные входного сигнала encSampleIn, encStartIn, encEndIn, и encValidIn и экспортирует переменные encSampleOut и encCtrlOut в рабочую область MATLAB ®.

open_system('NRCRCEncodeAndDecodeHDLModel');
set_param('NRCRCEncodeAndDecodeHDLModel/HDLNRCRCEncodeDecode/HDL NR CRC Encoder/NR CRC Encoder','CRCType',CRCType);
set_param('NRCRCEncodeAndDecodeHDLModel/HDLNRCRCEncodeDecode/HDL NR CRC Decoder/NR CRC Decoder','CRCType',CRCType);
modelOut = sim('NRCRCEncodeAndDecodeHDLModel');

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

Подсистема HDL NR Энкодера содержит блок NR CRC Encoder. Преобразуйте потоковые данные, выводимые блоком NR CRC Encoder, в системы координат, а затем сравните выходные системы координат с выходом nrCRCEncode 5G Toolbox.

encOut = squeeze(modelOut.encSampleOut.Data);
startIdx = find(modelOut.encCtrlOut.start.Data);
endIdx = find(modelOut.encCtrlOut.end.Data);
encValidOut = squeeze(modelOut.encCtrlOut.valid.Data);
vector = ~scalar && parallel;

for ii = 1:numFrames
    refEncBits{ii} = nrCRCEncode(msg{ii}',poly);
    % Extract actual encoded bits from output
    idx = startIdx(ii):endIdx(ii);
    if (vector) % For vector inputs
        encBits = encOut(:,idx);
        encBits = encBits(:,encValidOut(idx));
        actEncBits{ii} = encBits(:);
    else
        encBits = encOut(idx);
        encBits = encBits(encValidOut(idx));
        encBits = dec2bin(encBits,dataWidth)-'0';
        actEncBits{ii} = reshape(encBits',length(refEncBits{ii}),1);
    end
    error = sum(abs(refEncBits{ii}-double(actEncBits{ii})));
    fprintf(['CRC-encoded frame %d: Behavioral and ' ...
        'HDL simulation differ by %d bits\n'],ii,error);
end
CRC-encoded frame 1: Behavioral and HDL simulation differ by 0 bits
CRC-encoded frame 2: Behavioral and HDL simulation differ by 0 bits
CRC-encoded frame 3: Behavioral and HDL simulation differ by 0 bits
CRC-encoded frame 4: Behavioral and HDL simulation differ by 0 bits

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

Подсистема HDL NR CRC Decoder содержит блок NR CRC Decoder. Выходные выходы подсистемы Энкодера HDL NR предоставляются в качестве входов подсистеме декодера CRC HDL NR. Подсистема HDL NR CRC Decoder экспортирует поток декодированных выходных выборок decSampleOut и decErrOut вместе с управляющим сигналом decCtrlOut в рабочее рабочее пространство MATLAB. Сравните их с выходами nrCRCDecode функция.

dataOut = squeeze(modelOut.decSampleOut.Data);
errOut = squeeze(modelOut.decErrOut.Data);
startIdx = find(modelOut.decStartOut.Data);
endIdx = find(modelOut.decEndOut.Data);
validOut = squeeze(modelOut.decValidOut.Data);

for ii = 1:numFrames
    [refDecBits{ii},refErr{ii}] = nrCRCDecode(double(actEncBits{ii}),poly);
    % Extract actual decoded bits from output
    idx = startIdx(ii):endIdx(ii);
    if (vector) % For vector inputs
        dataOutTmp = dataOut(:,idx);
        validOutTmp = validOut(:,idx);
        decBits = dataOutTmp(:,validOutTmp);
        actDecBits{ii} = decBits(:);
    else
        dataOutTmp = dataOut(idx);
        validOutTmp = validOut(idx);
        decBits = dataOutTmp(validOutTmp);
        decBits = dec2bin(decBits,dataWidth) - '0';
        actDecBits{ii} = reshape(decBits',length(refDecBits{ii}),1);
    end
    actErr{ii} = errOut(endIdx(ii));
    error_data = sum(abs(refDecBits{ii} - double(actDecBits{ii})));
    error_err = double(refErr{ii}) - double(actErr{ii});
    fprintf(['CRC-decoded frame %d: Behavioral and ' ...
        'HDL simulation differ by %d bits and %d errors\n'],ii,error_data,error_err);
end
CRC-decoded frame 1: Behavioral and HDL simulation differ by 0 bits and 0 errors
CRC-decoded frame 2: Behavioral and HDL simulation differ by 0 bits and 0 errors
CRC-decoded frame 3: Behavioral and HDL simulation differ by 0 bits and 0 errors
CRC-decoded frame 4: Behavioral and HDL simulation differ by 0 bits and 0 errors

См. также

Блоки

Функции