SCL、CA-SCL及matlab仿真
1、内容目录
- 开篇1-内容介绍&参考文献
- 概述2-什么是极化码?
- 原理3-Arikan原版论文学习总结
- 编码算法4-巴氏参数、GA算法以及matlab仿真
- 译码算法5-SC算法及matlab仿真
- 译码算法6-SCL、CA-SCL及matlab仿真
2、引言
在上一节中,介绍了经典的SC译码算法的理论原理以及其matlab仿真代码,SC译码算法具有较低的译码复杂度,但是由于每个译码的比特信息都依赖于前面所有的比特信息的译码结果,得到的译码结果具有较大的误码率,而通信最重要的一个特性就是准确度,如何提高译码结果的准确度即降低译码结果的误码率呢?自极化码诞生至今,有非常多的研究人员提出了各种高性能的高准确度的译码算法,其中,应用最多的一个算法则是串行抵消列表(SCL)译码算法,以及根据该算法提出的一个改进算法CRC辅助SCL译码(CA-SCL) 。下面便对这两种算法进行介绍。
3、串行抵消列表(SCL)译码算法
3.1、路径度量PM
在介绍SCL算法之前,首先需要认识和理解一个变量——路径度量PM,这个变量是SCL译码算法的核心判据。那么什么是路径度量呢?
引入基于对数似然比的路径度量(Path Metric , PM),考虑一个长度为N=
2
n
2^n
2n的极化码。所谓路径度量就是某个译码结果的后验概率:Pr (
u
1
i
u_1^i
u1i|
y
1
N
y_1^N
y1N)。这个值越大,
u
1
i
u_1^i
u1i的译码正确率越高,顺着
u
1
i
u_1^i
u1i继续用SC译码器译码
u
i
u_i
ui
+
_+
+
1
_1
1,…,
u
N
u_N
uN,最终译码正确率就越大。
已知后验概率Pr (
u
1
i
u_1^i
u1i|
y
1
N
y_1^N
y1N)可以用
L
N
L_N
LN
(
^(
(
1
^1
1
)
^)
),
L
N
L_N
LN
(
^(
(
2
^2
2
)
^)
),…,
L
N
L_N
LN
(
^(
(
i
^i
i
)
^)
) 表示为:
上式中等式左边的式子被称为路径度量,从该式中可得出以下结论:
- 比特序列 u 1 i u_1^i u1i的后验概率Pr ( u 1 i u_1^i u1i| y 1 N y_1^N y1N)可以用SC译码器的既往结果计算。
- 由于需要Pr ( u 1 i u_1^i u1i| y 1 N y_1^N y1N)的值越大越好,因此需要路径度量的值越小越好,一般认为PM的初始值为0。
- 上式等号两端恒为正实数,等号右边的值有对应的近似表示:
从以上四种情况可知,当 u k u_k uk译码正确时, ln(1+e^-(1-2 u k u_k uk) L N k L_N^k LNk) 总是约为0;当 u k u_k uk译码错误时,ln(1+e^-(1-2 u k u_k uk) L N k L_N^k LNk)的值总是约为| L N k L_N^k LNk| 。因此在译码过程中,当全部译码结束后,对应路径度量越大的译码路径,其译码错误率越高。
3.2、基于LLR的SCL译码算法
使用该算法进行译码的译码器我们称之为SCL译码器,结合上一节的SC译码器的内容,我们来思考和构建以下译码过程:
- 在SCL译码器内部并行放置了L个SC译码器,分别记为编号为1,2,…,L的SC译码器 S C 1 SC_1 SC1, S C 2 SC_2 SC2, S C 3 SC_3 SC3,… , S C L SC_L SCL。
- SCL译码器获得接收序列的对数似然比序列(
L
1
L_1
L1,
L
2
L_2
L2,…,
L
N
L_N
LN),初始化路径度量的值 PM=0,同时激活译码器
S
C
1
SC_1
SC1, 其余未激活的SC译码器的编号集为
S
s
l
e
e
p
S_{sleep}
Ssleep={2,3,…,L}。集合
S
s
l
e
e
p
S_{sleep}
Ssleep是一个堆栈,即从该集合弹出元素时,弹出顺序按编号由大到小,如:L,L-1,…,2,1。1号译码器开始按照上篇的SC标准译码流程估计
u
1
u_1
u1的值,即计算
算出该值后,判决u1是否为冻结比特,如果是冻结比特,则不激活其他SC译码器,直接令 u 1 u_1 u1等于设定的冻结比特的值0,并计算该值对应的路径度量的值
然后1号译码器继续按照SC标准译码流程译码 u 2 u_2 u2, u 3 u_3 u3,…, u i − 1 u_{i-1} ui−1,并更新路径度量为
直到遇到 u i u_i ui,它是极化码中的首个信息比特。 - 这时SCL译码器中发现有L-1个未激活的SC译码器,则从
S
s
l
e
e
p
S_{sleep}
Ssleep={2,3,…,L}中弹出编号L,激活编号为L的SC译码器
S
C
L
SC_L
SCL,
S
C
L
SC_L
SCL将“继承”译码器
S
C
1
SC_1
SC1的全部计算数据,即LLR值、中间比特值和已有的译码结果。在进行继承操作时,遵循以下原则:不管
L
N
(
i
)
L_N^{(i)}
LN(i)取什么值,原始译码路径
S
C
1
SC_1
SC1总是令译码比特值
u
i
u_i
ui=0,而继承路径
S
C
L
SC_L
SCL总是令
u
i
u_i
ui=1。这时出现两种译码结果:
u
1
,
1
i
u_{1,1}^i
u1,1i=(
u
1
,
1
u_{1,1}
u1,1=0,
u
2
,
1
u_{2,1}
u2,1=0,…,
u
i
−
1
,
1
u_{i-1,1}
ui−1,1=0,
u
i
,
1
u_{i,1}
ui,1=0)和
u
1
,
L
i
u_{1,L}^i
u1,Li=(
u
1
,
L
u_{1,L}
u1,L=0,
u
2
,
L
u_{2,L}
u2,L=0,…,
u
i
−
1
,
L
u_{i-1,L}
ui−1,L=0,
u
i
,
L
u_{i,L}
ui,L=1)。这两种译码结果对应的路径度量分别为:
- 在
u
i
u_i
ui之后的译码中,由于
S
C
1
SC_1
SC1和
S
C
L
SC_L
SCL的中间比特数值已经不同,这使得两个SC译码器尽管使用同样的LLR值进行g函数运算,但g函数的输出也不同,之后的译码结果也完全不同。继续往后,这个两个SC译码器分别独立译码,独立计算路径度量,直到遇见极化码中的第二个信息比特
u
j
u_j
uj。这时记
S
C
1
SC_1
SC1的路径度量为
S
C
L
SC_L
SCL的路径度量为
此时,两个SC译码器同时执行第三步。
- 以上过程一直持续,知道遇见第 l o g 2 ( L ) log_2(L) log2(L)个信息比特 ,这是一个临界点,因为此时 S s l e e p S_{sleep} Ssleep=∅ ,所有的SC译码器都被激活了,都获得了各自的数据(LLR和中间比特值)。
- 设
u
t
u_t
ut是
u
s
u_s
us之后的第一个信息比特,在译码
u
t
u_t
ut时,所有L个已经激活的SC译码器各自独立地执行标准SC译码过程,每个译码器分别判决
u
t
u_t
ut用的LLR值:
L
N
,
l
(
t
)
L_{N,l}^{(t)}
LN,l(t),1≤l≤L,且拥有各自的路径度量
P
M
l
PM_l
PMl,1≤l≤L 。但是此时只有L个已经激活的SC译码器,为了要把L个译码结果变成2L个,要从这2L个译码结果中选取L个具有最小路径度量的译码结果存下来,在下面,使用一个2*L维的矩阵记录 2L个路径度量值:
矩阵PM中的每一个元素意义如下:PM第 l 列的元素表示译码器 S C l SC_l SCl遵循上面步骤的原则,保存 u t , l u_{t,l} ut,l=0后所得的路径度量存在第一行,保存 u t , l u_{t,l} ut,l=1后所得的路径度量存在第二行。当从以上2L个路径度量中选取L个最小的值时,可能出现三种情况:
情况一:PM中的第l列中的两个元素都为未入选L个最小的值,此时宣布译码器 S C l SC_l SCl死亡,并把值l压入堆栈 S s l e e p S_{sleep} Ssleep。
情况二:PM中第l列中仅有一个元素入选L个最小的值,此时译码器 S C l SC_l SCl仅保存较小的值对应的信息比特,并更新路径度量。
情况三:PM中第l列中的两个元素均入选L个最小的值,此时可发现如果情况三发生,情况一必发生,于是 S C l SC_l SCl可遵循前面步骤提到的原则,进行新的译码器索引弹出和继承操作。 - u t u_t ut之后的信息比特的译码不断重复步骤6,直到完成 u N u_N uN的译码,此时共获得L个译码结果,从这L个译码结果中,选择具有最小路径度量的译码结果,作为最终的译码结果输出。
4、CRC辅助SCL译码(CA-SCL)
循环冗余校验协助的SCL译码(CA-SCL)译码器是目前最流行的SCL译码器形式。该算法是基于SCL算法所提出的,通过在发送的信源信号中添加一段CRC校验码,(CRC校验码的生成有对应的算法),在SCL译码得到L种译码结果后,对这L种译码结果进行CRC校验,通过CRC校验且拥有最小路径度量值的译码结果为实际输出的译码结果。这样,就为译码结果的判定又增加了一份保险,降低了误码率。该译码器使用CRC-Polar级联码,其运行过程如下图所示:
由上图可知,长度为K为信息比特为(
u
1
,
u
2
,
.
.
.
,
u
K
u_1,u_2,...,u_K
u1,u2,...,uK) ,为其添加长度为r的循环冗余校验位,要发送的信息比特成为(
u
1
,
u
2
,
.
.
.
,
u
K
u_1,u_2,...,u_K
u1,u2,...,uK,
v
1
v_1
v1,
v
2
v_2
v2,…,
v
r
v_r
vr),对该校验后的信息序列进行极化码编码,得到信源码字(
x
1
x_1
x1,
x
2
x_2
x2,…,
x
N
x_N
xN),对信源码字序列进行BPSK调制后送入AWGN信道。接收端接收到BPSK信号后进行BPSK 解调,之后送入列表长度为L的SCL译码器中进行译码,得到L个彼此不同的信息比特译码结果。
对这L个译码结果的判断原则如下:
- 如果这L个译码结果中没有一个能通过CRC校验,则本次译码失败;
- 如果仅有一个译码结果通过CRC校验,则输出通过校验的这个译码结果;
- 如果有多个译码结果都通过了CRC校验,则选择具有最小路径度量的结果作为译码结果。
5、译码性能分析
对于前面提到的所有的译码算法,我都进行了matlab 的仿真,现将各类译码算法及其性能比较进行分析(极化码构造均采用GA算法,信道选用AWGN信道)。
5.1、不同码长下SC算法、SCL算法、CA-SCL算法的译码性能比较
由上图可知,在相同的条件下,三种译码算法的译码性能从高到低依次为CA-SCL>SCL>SC,随着码长N的不断增大,接收信息的误块率也逐渐下降,并逐渐趋于“0”。该现象正好印证了极化码的编码原理。当码长趋于无穷时,一部分信道的趋于无噪信道,可无损传输信息,同时,不同译码算法之间的性能差异也符合译码算法设计性能的提升。
5.2、不同信噪比下SC算法、SCL算法、CA-SCL算法的译码性能比较
由上图可知,在相同的信噪比条件下,三种译码算法性能从高到低依次为CA-SCL>SCL>SC。并且随着信噪比的不断增大,三种译码算法的误块率均逐渐下降,译码效果越来越好,并逐渐趋于“0”。
6、结论
极化码作为目前唯一被证明可以达到香农信道容量极限的编码方式,其优异的信道编码性能,正在逐渐发挥它的优势和作用。极化码利用信道合并和分裂所产生的极化现象,当码长趋于无穷时,信道容量达到香农极限,从而在可靠信道上传输信息比特,在高噪信道上传输冻结比特或者辅助译码信息。由于极化码编码采用的是递归式的编码方式,使其具有较低的编码计算复杂度;与此同时,这种递归的编码方式,可以采用多种不同的译码算法对其进行译码,而且还拥有同样较低的译码复杂度。
该系列一共6篇内容,详细介绍了极化码的定义和编译码算法原理,对几种常见的编译码算法进行了详细阐述和仿真分析,编码算法有Z(Wi)上界算法和高斯近似构造算法,译码算法有串行抵消译码算法(SC)、串行抵消列表译码算法(SCL)和循环冗余校验辅助SCL译码算法(CA-SCL)。对这三种译码算法在不同码长,不同信噪比的条件下,进行译码性能的仿真分析,得出的数据结论都与理论相符合,即当码长不断增大时,信道极化现象愈加明显,信息传输效果得到明显的增强;当信噪比不断增大时,译码效果也明显变好。对比三种不同的译码算法,在同一条件下,CA-SCL算法的效果总体是优于其他两种译码算法。
7、总结
关于极化码系列到这里就结束了,之后会在这个平台分享一些我如何从一个通信工程专业的毕业生,转行去做云平台运维工程师的学习历程,干货满满,敬请期待。