本菜本学期巧合接触了极化码,奈何非通信出身着实看不懂满屏数学推导的文献,在网上查了很多,但很少有针对非专业的普及性资料,在水完任务后决定写下文档,希望方便于其他小菜入门。由于本文主旨在于引路且俺也是个菜鸡,故没有任何复杂公式,想要深入了解还需查阅该领域的其他文献。

摘要

极化码是由2008年土耳其毕尔肯大学教授ErdalArikan首次提出的,是目前唯一一种能够被严格证明“达到”信道容量的信道编码方法。
2016年在3GPP RAN1 #87次会议,确定Polar Code作为5G增强移动宽带场景下控制信道编码方案。
简言之,极化码就是一种信道的编码方式,由于其性能优越故被拿到5g标准中使用。

极化理论


极化码 python_GN

该图即为码长为N的信道变换的递归结构,也是各位小白入门的时候必看的一幅图。
图中U1~Un是N个输入信息,其值只能为0或1。输出V1到Vn是进过变换后的N个输出结果。

符号⊕代表着模二加运算,即无进位的加法运算,
列:(0+0=0,0+1=1,1+1=1)
其运算结果和异或运算是等效的。

图中RN表示奇偶变换,先经奇数信道排列在前再排偶数信道。即(s1,s2,……,sN-1,sN)经过RN后变成(s1,s3,……,sN-1,s2,s4,……,sN-2,sN)。

WN/2,表示着码长为N/2的信道变换过程,即WN的子变换。所以码长为N的信道变换可以看做是n次递归调用的结果(N=2n

信道极化理论:

信道在经历这样的一种变换后自然而然的就会出现信道极化的现象。至于为什么会产生这样的一种现象,你得去问Arikan去。
信道极化:信道在一系列的组合和分裂后一部分的信道的信道容量会增大,另一部分的信道容量会减小。这种现象就叫信道极化。(信道容量越大,该信道的噪声就会小,信道容量为1即无噪声信道,信道容量为0即全噪声信道)
信道数量N越大,信道极化就越充分,一部分信道的信道容量会趋于1,另一部的信道容量会趋于0,且信道容量趋于1的比例是可求的,这里不做细节讨论。
极化码就是采用在信道容量大的信道用来传输数据比特信息,用信道容量小的信道来传输固定比特信息,固定比特通常为全0bit。

那么极化后哪些信道会是信道容量趋于1,哪些信道的信道容量趋于0呢?
这里涉及到一个极化后信道容量判断的问题。
通常目前采用的3个方法:
1.巴氏参数法
2.密度进化法
3.高斯近似法
这三种方法分别适用于不同的应用场景,其中巴氏参数法主要应用于BEC信道的,本文也只探讨该信道下的情景(简单嘛)

这里先给个结论,在固定码长下通过巴氏参数法求得的信道容量是固定的,也就是说只要码长给定了,我们就能求出哪些信道容量大,哪些小。

以码长为8为例(经典码长),通过巴氏参数得到的结果是第4,6,7,8个信道是信道容量最大的4个信道。(我在文献上看的结论,而且我还在另一篇文章看到了不同的结论~,私以为这个结果可能更正确,其值是通过matlab做仿真得出的,我不会matlab,有兴趣的同学可以自行验证)

编码

极化码编码:
其原理是极化码信道的组合和分裂可以通过矩阵运算来等效的完成
编码步骤:
1.算出各个信道的信道容量
2.将信息比特和固定比特数据混合
3.构造矩阵
3.将混合后的比特和矩阵相乘

由上面的内容我们已经知道极化码就是选择信道容量大的信道发送数据,选择信道容量小的信道发送固定比特数据。由上面的结论我们可以知道第4,6,7,8个信道是信道容量最大的4个信道。剩下的1,2,3,5信道为信道容量较小的信道。
这里假设要传输信息比特全为1,固定比特全为0。消息比特数数量为4。冻结比特数量也为4。在信道混合后可以得到的输入是{0,0,0,1,0,1,1,1}

下面我们来构造生成矩阵GN

极化码 python_递归_02

这里矩阵BN可等效为反比特排序功能(有些文献将其描述的十分复杂,等效于大量递归运算,这里不细考究)
反比特排序即为:
将每个原序列的十进制序号i∈{1,2,…,N}按二进制表示为 (i−1)→(bn,bn−1,…,b1),其中bn为最高有效位;再将该二进制序列反序,得到 (b1,b2,…,bn);最后以b1为最高有效位重新按十进制表示成 (b1,b2,…,bn)→(j−1),令输出序列的第j个元素取值为原序列的第i个元素。

矩阵F⊗n指的是n次克罗内克积,一次克罗内克积定义为:

极化码 python_GN_03

且有

极化码 python_递归_04

所以n次克罗内克积的值是固定值。

矩阵GN是由矩阵BN和矩阵F⊗n组成,而且有证明:

极化码 python_极化码 python_05

也就是说BN和矩阵F⊗n的先后顺序并不影响其结果,所以可以先将混合后的比特乘以F⊗n得到的结果在进行反比特排序,这个结果即为编码结果。

编码举例

还是以码长为8举例。混合后的比特信息U18={0,0,0,1,0,1,1,1}。(U18意为1到8的所有比特)

3次克罗克内积结果如下:

极化码 python_递归_06


使用U18乘以F⊗3={0,1,1,0,1,0,0,1}

需要注意的是该矩阵运算是在二元域中的运算即为无进位加法运算。
得到运算的结果后需要对其进行反比特排序操作。
码长为8的反比特结果为{1,5,3,7,2,6,4,8},故我们将排序的结果按照这个顺序填写好就可以得到最终的编码结果,其结果X18={0,1,1,0,1,0,0,1}。

译码

译码中比较流行的算法有SC译码,SCL译码,CA-SCL译码等等,
其中SCL译码是在SC译码的基础上增加更多的路径来判断译码的结果,即算法难度增加但提升了译码的性能。CA-SCL译码是在SCL译码的基础上运用CRC的技术来辅助译码的。

这里还是以SC译码为例,即串行抵消(Successive Cancellation,SC)译码算法:

译码原理:

各个极化信道并不是相互独立的,而是具有确定的依赖关系的:信道序号大的极化信道依赖于所有比其序号小的极化信道。基于极化信道之间的这一依赖关系,SC译码算法对各个比特进行译码判决时,需要假设之前步骤的译码得到的结果都是正确的。
SC译码是逐比特译码的,也就是译完前一个才能译下一个比特,这就使得译码速度不会太高。

极化码 python_GN_07
译码的公式如上式所示,ui就表示第i个译码结果。,如果u是固定比特那么久将其翻译成已知的固定比特,如果不是那么久用hi函数判断。

极化码 python_GN_08

极化码 python_信道容量_09

极化码 python_递归_10

上述3个公式是sc译码必备的三个公式。
hi其值是根据对数释然比函数LN(i)来判断的。
式(1-2)是奇数个译码时用到的公式,(1-3)是偶数译码时用的公式。
式(1-2)中u1,o2i−2是指第1到2i-2个译码中奇数的译码,即(u1,u3……,u2i-3),这里的o指odd。u1,e2i−2同理,e指even偶数。

由式中可以看出对第n个译码的比特判定是根据对数释然值和前n-1个译码结果来判断的,如果前面比特中出现译码错误那么就会对后续译码的结论产生消极的影响,这也是SC译码的缺陷。

公式(1-2),(1-3)中的f和g函数如下式所示
极化码 python_信道容量_11

极化码 python_GN_12

可以看出,计算对数释然比需要不断的递归调用f和g函数。

译码举例

先假设假设初始对数释然比 L(1)1(y1)=1.5,L(1)1(y2)=2,L(1)1(y3)=-1,L(1)1(y4=0.5。(这些值编码在经过BPSK调制再经过噪声后求出来的,这里为了简化不列出具体求解过程)

SC译码算法将首先计算u1的对数似然比L4(1)(y14)根据上面提到的公式有:
极化码 python_递归_13

极化码 python_信道容量_14

极化码 python_极化码 python_15

极化码 python_GN_16

这里虽然L4(1)(y14)<0,但由于u1是冻结比特,我们依然将u1判决为u^1=0。剩下3个译码过程同上,有兴趣