Matlab simulations of the encoder and Successive Cancellation List (SCL) decoder for the New Radio polar code from 3GPP Release 15, as defined in TS38.212 V15.2.0 and used in the Public Broadcast Channel (PBCH), Physical Downlink Control Channel (PDCCH) and Physical Uplink Control Channel (PUCCH).
This code is intended to provide a reference model for the standard and has been written with a focus on correctness, rather than on simulation speed. This code is also intended to provide a platform for research on enhancements to the New Radio polar code. This motivates the inclusion of the custom1_encoder and custom1_decoder, alongside encoders and decoders for the New Radio PBCH, PDCCH and PUCCH channels. In particular, custom1_encoder and custom1_decoder adapt the New Radio polar code for general purpose applications, enabling support for arbitrarily-high information block lengths A. By contrast, the longest block lengths supported in the New Radio PBCH, PDCCH and PUCCH channels are 32, 140 and 1706 bits, respectively.
The capacity plots in the Figures above were obtained using the O(n−2) metaconverse PPV upper bound from the SPECTRE Short Packet Communication Toolbox. If you use these results, please acknowledge them with a reference to...
T. Erseghe, "Coding in the Finite-Blocklength Regime: Bounds Based on Laplace Integrals and Their Asymptotic Approximations", IEEE Transactions on Information Theory, vol. 62, no. 12, pp. 6854 - 6883, Dec. 2016.
|Section of TS38.212||Implemented in||Comment|
|5.1||components/get_crc_generator_matrix.m||The CRC bits are generated using b = [a, mod(a*G_P, 2)].|
|5.2.1||PUCCH_encoder.m||The first and second segments are obtained as a(1:floor(A/C)) and a(floor(A/C)+1:A), respectively.|
|18.104.22.168||components/get_3GPP_crc_interleaver_pattern.m||Interleaving is implemented using c_prime = c(Pi).|
|22.214.171.124 Q0N-1||components/get_3GPP_sequence_pattern.m||The elements of Q0N-1 are incremented by 1, since indices begin at 1 in Matlab.|
|126.96.36.199 QPCN||components/get_PC_bit_pattern.m||Provides a vector of N elements, in which the elements with the indices QPCN are set to true and all other elements are set to false.|
|188.8.131.52 u||components/PCCA_polar_encoder.m||Other components/*_polar_encoder.m files are also useful for special cases without PC bits, without CRC bits or with distributed CRC bits.|
|184.108.40.206 GN||components/get_G_N.m||Encoding is implemented using d = mod(u*G_N, 2).|
|220.127.116.11 QIN||components/get_3GPP_info_bit_pattern.m||Provides a vector of N elements, in which the elements with the indices QIN are set to true and all other elements are set to false.|
|18.104.22.168||components/get_3GPP_rate_matching_pattern.m||Rate matching is implemented using e = d(rate_matching_pattern).|
|22.214.171.124||components/get_3GPP_channel_interleaver_pattern.m||Interleaving is implemented using f = e(channel_interleaver_pattern).|
|5.5||PUCCH_encoder.m||The first and second segments are concatenated using f = [f, ...].|
|126.96.36.199.1||PUCCH_encoder.m||Rate matching is implemented, but not the determination of EUCI.|
|188.8.131.52.1||PUCCH_encoder.m||Rate matching is implemented, but not the determination of EUCI.|
|7.3.1||PDCCH_encoder.m||Only implements the zero padding of DCI formats, to increase their length to 12 bits.|
Each of the *_encoder.m files has corresponding *_decoder.m files, for performing the corresponding operation of the receiver.
Many thanks to my colleagues at AccelerComm, who have spent lots of time double checking that this code matches the standard.
Have fun! Rob.