В этом примере показано, как симулировать блоки NR LDPC Encoder и NR LDPC Decoder Simulink ® и сравнить аппаратно оптимизированные результаты с результатами от функций 5G Toolbox™. Эти блоки поддерживают скалярные и векторные входы. Блок NR LDPC Decoder позволяет вам выбрать или Min-sum, или Normalized min-sum алгоритм для операции декодирования.
Выберите серию значений входа для bgn и liftingSize согласно 5G стандарту NR. Сгенерируйте соответствующие входные векторы для выбранного базового номера график (bgn) и значений liftingSize. Сгенерируйте случайные системы координат входных данных и преобразуйте их в логические данные и управляющий сигнал, который указывает контуры системы координат. encFrameGap
учитывает задержку блока NR LDPC Encoder для значений bgn и liftingSize. Используйте сигнал 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 содержит блок NR LDPC Encoder. Выполнение модели импортирует переменные входного сигнала 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 Encoder, чтобы сгенерировать входные значения коэффициента логарифмической правдоподобности (LLR) для блока NR LDPC Decoder. Используйте системных объектов канала, модулятора и демодулятора, чтобы добавить некоторый шум к сигналу. Снова создайте векторы bgn и liftingSize и преобразуйте системы координат данных в LLR с управляющим сигналом, который указывает контуры системы координат. decFrameGap
учитывает задержку блока NR LDPC Decoder для 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 Decoder. Выполнение модели импортирует переменные входного сигнала 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
nrLDPCDecode
(5G Toolbox) | nrLDPCEncode
(5G Toolbox)