前言
在5G协议中采用了LDPC,Polar等信道编解码手段。对于Polar码来说,在Arikan教授发明的基础Polar码之上,又添加了许多步骤约束等增加编解码的性能,本篇博客是对3GPP 38.212协议中Polar编码部分流程的解读,主要是参考了协议里面的章节:5.3.1,6.3.1.3等,有不足之处欢迎留言评论。Polar的编码流程根据复杂程度可以分为三类:
类型 | 用于信道 |
---|---|
Polar encode BCH | PBCH (Physical Broadcast CHannel) |
Polar encode DCI | PDCCH (Physical Downlink Control CHannel) |
Polar encode UCI | PUCCH (Physical Uplink Control CHannel), PUSCH (Physical Uplink Share CHannel) |
下面的表格是对本篇博客中用到的一些名词的解释:
TB | Transport Block 传输块,是5G物理层的基本传输单元 |
CB | Code Block 代码块,根据CB的大小限制,TB被分割为多个CB块 |
CB Seg. | CB Segmentation,码块分割,将TB分割成多个CB |
Info IL. | info bits interleaving,信息比特序列交织 |
Polar Enc. | Polar encoding,Polar 编码 |
SubBlk IL. | sub-block interleaving,子块交织 |
Bit Sel. | bit-selection for rate-matching,为速率匹配做比特选择 |
Code IL. | code bits interleaving,码字比特序列交织 |
CB Concat. | cancatenate CB codewords into TB codeword,将CB级的码字组合成TB级的码字 |
A | info payload bit length,信息比特长度 |
K | info payload bit length + CRC bit length,信息比特长度加上CRC比特长度 |
N | Polar original code bit length,Polar原始码字长度 |
E | code bit length after rate-maching,在速率匹配后的码字长度 |
Polar BCH/DCI 编码流程
Polar BCH跟Polar DCI都属于下行信道CB级的Polar编码,流程差不多,Polar DCI编码要较复杂些。
Polar BCH
把Polar BCH单独出来是因为在协议里面它的配置是固定的:
- A = 32,信息比特payload部分固定长度为32 bits。
- K = 32 + 24 = 56,信息比特后面要加上24 bits的CRC,通过CRC24C计算得出。
- N = 512,56 bits 经过Polar编码之后,生成的Polar原始码字的长度为512 bits。
- E = 864,512 bits Polar原始码字经过rate-matching之后转化为864 bits码字作为最后的输出。
下面的图概况了整个Polar BCH/DCI 编码的流程:

- CB Seg. + apply CRC24C:因为是CB级的编码,我们认为接收到的数据就是分割好的CB,CB作为info bits的payload的部分,我们需要通过payload用CRC24C计算出24 bits的CRC检验位,加在payload部分的末尾,然后一起传输给下个Info IL.模块。CRC的计算可以参考协议里章节5.1,5G里用的几种CRC的生成多项式都是给定的:
- Info IL.:做信息比特序列的交织,下面是协议里交织的算法和interleaving pattern,参考章节5.3.1.1:
- Polar Enc.:56 info bits在交织之后作为Polar encoding模块的输入,可以参考协议章节5.3.1.2,根据协议Polar BCH原始码字的长度是512 bits,所以先要将56 bits的序列映射成一个512 bits的序列,映射的规则根据协议需要计算格外三个向量参数:
Polar sequence:比特可靠性的序列,要将56比特映射到512比特可靠性优先的位置,协议里有一个默认比特可靠性的最长序列的表格。因为Polar BCH的配置关系,它只需计算Polar sequence就够了,另外两个参数不需要计算。
Temporay frozen set:除了Polar BCH,Polar DCI/UCI的配置都不是固定的,有可能出现E < < <N的情况,就是rate-matching之后的码字长度要比Polar原始的码字长度要短,所以在做比特映射的时候要格外先计算temporay frozen set的序列,告诉比如在512 bits里哪些比特位是冻结的,就是不能被映射的,即使那位比特的可靠性比较高。
Parity check set:只在Polar UCI里需要格外计算,当info payload比特长度比较小的时候,12 ≤ \leq ≤ A < < < 20,需要格外计算3 bits的PC parity check,会改变映射后的序列。
因为本篇博客主要是解读5G里Polar编码的流程,具体Polar编码的算法就不做详细研究了。 - SubBlk IL.:在做完Polar encoding之后,需要做sub-block interleaving,就是子块的交织。下面是子块交织的算法和Sub-block interleaver pattern,参考章节5.4.1.1:
它主要是将Polar原始的码字分割成32个子块后重新排序,每个子块的比特数为N/32:
- Bit Sel.:在sub-block interleaving之后要根据速率匹配对最终码字的长度做出调整,根据K,N和E的大小,会做出三种类型的调整:repetition,puncturing和shortening,参考章节5.4.1.2:
E ≥ \geq ≥ N,repetition:循环重复Polar原始码字,直到补齐E的长度。
E < < < N,K/E ≤ \leq ≤ 7/16,puncturing:当E小于N时,则需要从Polar原始码字中提取码字,puncturing就是提取后面部分的码字。
E < < < N,K/E > > > 7/16,shortening:当E小于N时,shortening提取的是前面部分的码字。
Polar DCI
Polar DCI的配置不是固定的,比如K = 43,E = 216,根据协议它的N值需要通过K和E计算出来,参考章节5.3.1:


根据前面的例子K = 43,E = 216, 那么 N = 2n = 28 = 256。
除此之外,在Polar encoding模块可能要格外计算temporay frozen set的序列, 其他的流程与Polar BCH一致。
Polar UCI 编码流程
下面这张图概括了Polar UCI编码的基本流程。Polar UCI编码是TB级的编码,所以它接收到的是TB数据,首先第一步就要根据情况做码块的分割,最多只会分割成2个CB。与Polar BCH/DCI不同的是,它不需要做info bits的interleaving,而是在bit-selection之后需要做code bits的interleaving,如果之前有做码块分割,最后要将两个码块的码字连接起来作为最后的输出。
- CB Seg. + apply CRC11/6:Polar UCI的配置也不是固定的,根据输入TB级的info payload长度A,做码块的分割,最多只会分割成两个码块,要么就是不分割,这步完成后会根据情况添加6 bits的CRC6,或者11 bits的CRC11,参考章节6.3.1.2:
A | E | CRC size | num of CB |
---|---|---|---|
12 ≤ \leq ≤ A < < < 20 | 6 | 1 | |
20 ≤ \leq ≤ A < < < 360 | 11 | 1 | |
360 ≤ \leq ≤ A < < < 1013 | E < < < 1088 | 11 | 1 |
360 ≤ \leq ≤ A < < < 1013 | E ≥ \geq ≥ 1088 | 11 | 2 |
1013 ≤ \leq ≤ A ≤ \leq ≤ 1706 | 11 | 2 |
如果做码块分割的话,主要是将原来TB的数据分割成两个相同长度的CB,如果不能被整除,就在第一个CB bit0 位置上补个0。分割完成后各自计算添加CRC,然后C0,C1作为Polar encoding模块的输入,需要各自进行Polar编码运算。

-
Polar Enc.:在前文也提到了,在Polar UCI encoding中,如果 12 ≤ \leq ≤ A < < < 20,需要格外计算3 bits的PC parity check,改变映射后的序列,其他保持一致。
-
SubBlk IL. + Bit-Sel.:sub-block interleaving和bit-selection的算法和Polar BCH/DCI保持一致。
-
Code IL.:在Polar UCI编码中需要格外做code bits的interleaving,参考章节5.4.1.3:
交织算法看起来比较复杂,其核心思想就是进行一个类似三角形的交织,三角形的边长为T,T是满足 T ( T + 1 ) / 2 ≥ E T(T + 1)/2\geq E T(T+1)/2≥E的最小整数,如果e是交织前的序列,f是交织后的序列,那么就是将e按照上三角形行的顺序把每个bit填进去,然后将每个bit按照三角形列的顺序读出来就是f的序列。 -
CB Concat.:如果做了码块分割的话,最后还要将两个码字的结果连接起来输出。这里Polar UCI配置里给的E是TB级的,那么接连之前两块码字长度都是E/2向下取整,也存在E不能被整除的情况,那么在连接后最后补一位0就行了。