Polar Encode and Decode of Streaming Samples
This example shows how to simulate the NR Polar Encode and Decode blocks and compare the hardware-optimized results with the results from 5G Toolbox™ functions.
Generate Input Data for Encoder
You must specify the link direction because the coding scheme is different for downlink and uplink messages. Downlink messages are encoded with interleaving and use a CRC length of 24 bits. Uplink messages do not use interleaving, and use a CRC length of 6 (18 < K < 25) or 11 bits (31 < K < 1023).
This example uses uplink mode with K values greater than 31, so each message must have 11 CRC bits.
Choose a series of input values for K and E. These values must be valid pairs supported by the 5G NR standard. Generate random frames of input data and add a CRC codeword.
Convert the message frames to streams of Boolean samples and control signals that indicate the frame boundaries. Generate input vectors of K and E values over time. The example model imports the workspace variables encSampleIn
, encCtrlIn
, encKfi
, encEfi
, sampleTime
, and simTime
.
For this example, the number of invalid cycles between frames is empirically chosen to accommodate the latency of the NR Polar Encoder block for the specified K and E values. When the values of K and E are larger than in this example, the number of invalid cycles between frames must be longer. Use the nextFrame output signal of the block to determine when the block is ready to accept the start of the next input frame.
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;
Run Encoder Model
The HDL Algorithm subsystem contains the NR Polar Encoder block. Running the model imports the input signal variables from the workspace and returns a stream of polar-encoded output samples and control signals that indicate the frame boundaries. The NR Polar Encoder block in the model has the Link direction parameter set to Uplink
, and accepts K and E values from input ports. The model exports variables sampleOut
and ctrlOut
to the MATLAB workspace.
open_system('NRPolarEncodeHDL'); encOut = sim('NRPolarEncodeHDL');
Verify Encoder Results
Convert the streaming data back to frames for comparison with the results of the 5G Toolbox™ nrPolarEncode
function.
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
Generate Input Data for Decoder
Use the encoded data to generate input log-likelihood ratios (LLRs) for the NR Polar Decoder block. Use channel, modulator, and demodulator System objects to add noise to the signal.
Again, create vectors of K and E values, and convert the frames of data to streaming samples with control signals. The example model imports the workspace variables decSampleIn
, decCtrlIn
, decKfi
, decEfi
, sampleTime
, and simTime
.
For this example, the number of invalid cycles between frames is empirically chosen to accommodate the latency of the NR Polar Decoder block for the specified K and E values. When the values of K and E are larger than in this example, the number of invalid cycles between frames must be longer. Use the nextFrame output signal of the block to determine when the block is ready to accept the start of the next input frame.
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;
Run Decoder Model
The HDL Algorithm subsystem contains the NR Polar Decoder block configured to use a list length of eight. The block in the model also has the Link direction parameter set to Uplink
, and accepts K and E values from input ports. Running the model imports the input signal variables from the workspace and returns a stream of decoded output samples and control signals that indicate the frame boundaries. The model exports variables sampleOut
, ctrlOut
, and errOut
to the MATLAB workspace. Select the valid values of the errOut
signal by using the ctrlOut.valid
signal.
open_system('NRPolarDecodeHDL'); decOut = sim('NRPolarDecodeHDL');
Verify Decoder Results
Convert the streaming samples returned from the Simulink model into frames for comparison with the results of the 5G Toolbox™ nrPolarDecode
function.
The nrPolarDecode
function returns the decoded message, including 24 recalculated CRC bits. The NR Polar Decoder block returns the decoded message without the CRC bits, and returns the CRC status separately on the err port.
The block and function output bits can differ for frames that report a decoding error. The block can return a decoding error in cases when the function successfully decodes the message. The overall decoding performance of the block is very close to that of the function.
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.
See Also
NR Polar
Encoder | NR Polar
Decoder | nrPolarEncode
(5G Toolbox) | nrPolarDecode
(5G Toolbox)