当前位置: 首页 > article >正文

探秘基带算法:从原理到5G时代的通信变革【四】Polar 编解码(二)

文章目录

        • 2.3.3 极化编码
          • 巴氏参数与信道可靠性
          • 比特混合
          • 生成矩阵
          • 编码举例
        • 2.3.4 极化译码
          • 最小单元译码
          • 串行抵消译码(SC译码)算法
          • SCL译码算法
        • 2.3.5 总结
          • **Polar 码的优势**
          • **Polar 码的主要问题**
          • **Polar 码的应用前景**
        • 2.3.6 **参考文档**

本博客为系列博客,主要讲解各基带算法的原理与应用,包括:viterbi解码、Turbo编解码、Polar编解码、CORDIC算法、CRC校验、FFT/DFT、QAMtiaozhi/解调、QPSK调制/解调。其他博客链接如下:

  1. 探秘基带算法:从原理到5G时代的通信变革【一】引言
  2. 探秘基带算法:从原理到5G时代的通信变革【二】Viterbi解码
  3. 探秘基带算法:从原理到5G时代的通信变革【三】Turbo 编解码
  4. 探秘基带算法:从原理到5G时代的通信变革【四】Polar 编解码(一)
  5. 探秘基带算法:从原理到5G时代的通信变革【四】Polar 编解码(二)
  6. 探秘基带算法:从原理到5G时代的通信变革【五】CORDIC算法
  7. 探秘基带算法:从原理到5G时代的通信变革【六】CRC 校验
  8. 探秘基带算法:从原理到5G时代的通信变革【七】FFT/DFT
  9. 探秘基带算法:从原理到5G时代的通信变革【八】QAM 调制 / 解调
  10. 探秘基带算法:从原理到5G时代的通信变革【九】QPSK调制/解调
  11. 探秘基带算法:从原理到5G时代的通信变革【十】基带算法应用与对比
2.3.3 极化编码

极化编码(Polar Code)是一种由Erdal Arikan在2009年提出的新型信道编码方法,其核心思想是通过信道极化技术将多个独立的二进制输入离散无记忆信道(B-DMC, Binary-input Discrete Memoryless Channel)分裂为若干个极化子信道,其中一部分信道变得非常可靠,另一部分则变得非常不可靠。通过对这些极化子信道的选择和分配,可以实现接近香农极限的通信性能。

巴氏参数与信道可靠性

  • 巴氏参数

巴氏参数 Z ( W ) Z(W) Z(W)是衡量信道可靠性的关键指标。对于一个给定的信道 W W W Z ( W ) Z(W) Z(W)的值越大,说明该信道越不可靠;反之, Z ( W ) Z(W) Z(W)越小,则信道越可靠。具体来说,巴氏参数 Z ( W ) Z(W) Z(W)与信道的对称容量 I ( W ) I(W) I(W)存在反比关系:
$
Z(W) = 1 - I(W)
$
因此,当 Z ( W ) Z(W) Z(W)接近于 0 时,信道几乎完全可靠;而当 Z ( W ) Z(W) Z(W)接近于 1 时,信道几乎完全不可靠。


  • BEC信道的可靠性估计

对于二进制删除信道(Binary Erasure Channel, BEC),Arikan在其论文中提出了通过计算巴氏参数来估计信道可靠性。BEC是一种特殊的 B-DMC,其输出要么是正确的比特值,要么是删除符号(表示传输失败)。由于 BEC 的特殊性质,其巴氏参数可以直接计算为:
$
Z(W) = p
$
其中 p p p是信道的删除概率。


  • 其他信道的可靠性估计

对于更一般的二进制输入对称信道(Binary-input Symmetric Channel, BSC)或二进制输入加性高斯白噪声信道(Binary-input Additive White Gaussian Noise Channel, BAWGNC),不存在直接计算 Z ( W N ( i ) ) Z(W_N^{(i)}) Z(WN(i))的解析方法。为此,Mori 等人提出了密度进化(Density Evolution, DE)的方法,该方法适用于所有类型的 B-DMC。此外,在实际应用中,为了简化计算,还可以使用高斯近似(Gaussian Approximation, GA)方法来替代 DE。


  • 极化过程中的巴氏参数递推公式

在极化过程中,原始信道 W N ( i ) W_N^{(i)} WN(i)被分裂为两个子信道 W 2 N ( 2 i − 1 ) W_{2N}^{(2i-1)} W2N(2i1) W 2 N ( 2 i ) W_{2N}^{(2i)} W2N(2i),对应的巴氏参数递推公式为:
Z ( W 2 N ( 2 i − 1 ) ) ≤ 2 Z ( W N ( i ) ) − [ Z ( W N ( i ) ) ] 2 Z(W_{2N}^{(2i-1)}) \leq 2Z(W_N^{(i)}) - [Z(W_N^{(i)})]^2 Z(W2N(2i1))2Z(WN(i))[Z(WN(i))]2

Z ( W 2 N ( 2 i ) ) = [ Z ( W N ( i ) ) ] 2 Z(W_{2N}^{(2i)}) = [Z(W_N^{(i)})]^2 Z(W2N(2i))=[Z(WN(i))]2

需要注意的是,上述不等式仅在 W N ( i ) W_N^{(i)} WN(i)是 BEC 时成立。


  • 示例代码:巴氏参数计算

以下是一个 MATLAB 函数示例,用于计算极化后的巴氏参数:

N = 8; % 极化码长度
ZW = 0.5; % 初始信道的巴氏参数
ZW8 = ZW_cal(N, ZW);
ZW8 = bitrevorder(ZW8); % 按位置二进制比特翻转function ZWi = ZW_cal(N, ZW)ZWi = zeros(N, 1);ZWi(1) = ZW;m = 1; % 极化级数while(m < N) for j = 1 : m% 计算信道极化Z_tmp = ZWi(j);ZWi(j) = 2 * Z_tmp - Z_tmp * Z_tmp; % 好信道ZWi(j + m) = Z_tmp * Z_tmp; % 差信道endm = m * 2;end
end

img


比特混合

在极化码的构造过程中,需要选择可靠性最高的 K K K个分裂子信道来传输消息比特,其余的分裂子信道则用于传输冻结比特(frozen bits)。对于 BEC 信道而言,这一过程可以通过选择巴氏参数最小的 K K K个子信道来实现。


生成矩阵

在极化码的理论中,生成矩阵 G N G_N GN是编码过程的核心组成部分。通过数学推导可以得到,编码器递归构造(生成矩阵)表示为:
G N = B N F ⊗ n G_N = B_N F^{\otimes n} GN=BNFn
其中, B N B_N BN是一个比特翻转矩阵,定义为:
B N = R N ( I 2 ⊗ B N / 2 ) B_N = R_N (I_2 \otimes B_{N/2}) BN=RN(I2BN/2)
这里, F ⊗ n F^{\otimes n} Fn表示对矩阵 F F F进行 n n n次克罗内克积运算,而 F F F定义为:
F = [ 1 0 1 1 ] F = \begin{bmatrix} 1 & 0 \\ 1 & 1 \end{bmatrix} F=[1101]


  • 克罗内克积定义

克罗内克积(Kronecker Product)是两个矩阵之间的运算,记作 A ⊗ B A \otimes B AB,其结果是一个更大的矩阵。具体定义如下:

A ⊗ B = [ a 11 B a 12 B ⋯ a 1 N B a 21 B a 22 B ⋯ a 2 N B ⋮ ⋮ ⋱ ⋮ a N 1 B a N 2 B ⋯ a N N B ] A \otimes B = \begin{bmatrix} a_{11}B & a_{12}B & \cdots & a_{1N}B \\ a_{21}B & a_{22}B & \cdots & a_{2N}B \\ \vdots & \vdots & \ddots & \vdots \\ a_{N1}B & a_{N2}B & \cdots & a_{NN}B \end{bmatrix} AB= a11Ba21BaN1Ba12Ba22BaN2Ba1NBa2NBaNNB

例如,对于两个矩阵:

A = [ a 11 a 12 a 21 a 22 ] , B = [ b 11 b 12 b 21 b 22 ] A = \begin{bmatrix} a_{11} & a_{12} \\ a_{21} & a_{22} \end{bmatrix}, \quad B = \begin{bmatrix} b_{11} & b_{12} \\ b_{21} & b_{22} \end{bmatrix} A=[a11a21a12a22],B=[b11b21b12b22]

它们的克罗内克积为:

A ⊗ B = [ a 11 B a 12 B a 21 B a 22 B ] = [ a 11 b 11 a 11 b 12 a 12 b 11 a 12 b 12 a 11 b 21 a 11 b 22 a 12 b 21 a 12 b 22 a 21 b 11 a 21 b 12 a 22 b 11 a 22 b 12 a 21 b 21 a 21 b 22 a 22 b 21 a 22 b 22 ] A \otimes B = \begin{bmatrix} a_{11}B & a_{12}B \\ a_{21}B & a_{22}B \end{bmatrix} {=} \begin{bmatrix} a_{11}b_{11} & a_{11}b_{12} & a_{12}b_{11} & a_{12}b_{12} \\ a_{11}b_{21} & a_{11}b_{22} & a_{12}b_{21} & a_{12}b_{22} \\ a_{21}b_{11} & a_{21}b_{12} & a_{22}b_{11} & a_{22}b_{12} \\ a_{21}b_{21} & a_{21}b_{22} & a_{22}b_{21} & a_{22}b_{22} \end{bmatrix} AB=[a11Ba21Ba12Ba22B]= a11b11a11b21a21b11a21b21a11b12a11b22a21b12a21b22a12b11a12b21a22b11a22b21a12b12a12b22a22b12a22b22


  • 比特翻转矩阵 B N B_N BN

比特翻转矩阵 B N B_N BN的递归定义为:
B N = R N ( I 2 ⊗ B N / 2 ) B_N = R_N (I_2 \otimes B_{N/2}) BN=RN(I2BN/2)
其中, I n I_n In n n n-阶单位矩阵,例如:
I 2 = [ 1 0 0 1 ] I_2 = \begin{bmatrix} 1 & 0 \\ 0 & 1 \end{bmatrix} I2=[1001]

对于 B 2 B_2 B2,有:
B 2 = I 2 = [ 1 0 0 1 ] B_2 = I_2 = \begin{bmatrix} 1 & 0 \\ 0 & 1 \end{bmatrix} B2=I2=[1001]

矩阵 R N R_N RN是一个排列运算矩阵,用于将奇数位放在前面,偶数位放在后面。例如,对于 N = 4 N = 4 N=4
[ 1 , 3 , 2 , 4 ] = [ 1 , 2 , 3 , 4 ] R 4 [1, 3, 2, 4] = [1, 2, 3, 4] R_4 [1,3,2,4]=[1,2,3,4]R4
对应的 R 4 R_4 R4矩阵为:
R 4 = [ 1 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 ] R_4 = \begin{bmatrix} 1 & 0 & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 0 & 1 \end{bmatrix} R4= 1000001001000001


  • 生成矩阵的构造过程

生成矩阵 G N G_N GN的构造过程可以通过以下步骤实现:

  1. 计算 F ⊗ n F^{\otimes n} Fn
    对矩阵 F F F进行 n n n次克罗内克积运算,其中 N = 2 n N = 2^n N=2n。例如:
    F ⊗ 1 = F = [ 1 0 1 1 ] F^{\otimes 1} = F = \begin{bmatrix} 1 & 0 \\ 1 & 1 \end{bmatrix} F1=F=[1101]

F ⊗ 2 = F ⊗ F = [ F 0 F F ] = [ 1 0 0 0 1 1 0 0 1 0 1 0 1 1 1 1 ] F^{\otimes 2} = F \otimes F = \begin{bmatrix} F & 0 \\ F & F \end{bmatrix} = \begin{bmatrix} 1 & 0 & 0 & 0 \\ 1 & 1 & 0 & 0 \\ 1 & 0 & 1 & 0 \\ 1 & 1 & 1 & 1 \end{bmatrix} F2=FF=[FF0F]= 1111010100110001

  1. 构造比特翻转矩阵 B N B_N BN
    根据递归公式 B N = R N ( I 2 ⊗ B N / 2 ) B_N = R_N (I_2 \otimes B_{N/2}) BN=RN(I2BN/2),逐步构造 B N B_N BN。例如:
    B 2 = I 2 = [ 1 0 0 1 ] B_2 = I_2 = \begin{bmatrix} 1 & 0 \\ 0 & 1 \end{bmatrix} B2=I2=[1001]

B 4 = R 4 ( I 2 ⊗ B 2 ) = [ 1 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 ] ⋅ [ 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 ] = [ 1 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 ] B_4 = R_4 (I_2 \otimes B_2) = \begin{bmatrix} 1 & 0 & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 0 & 1 \end{bmatrix} \cdot \begin{bmatrix} 1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 \end{bmatrix} = \begin{bmatrix} 1 & 0 & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 0 & 1 \end{bmatrix} B4=R4(I2B2)= 1000001001000001 1000010000100001 = 1000001001000001

  1. 生成矩阵 G N G_N GN
    最终生成矩阵为:
    G N = B N F ⊗ n G_N = B_N F^{\otimes n} GN=BNFn

  • 总结

生成矩阵 G N G_N GN是极化码编码的核心工具,它通过比特翻转矩阵 B N B_N BN和克罗内克积矩阵 F ⊗ n F^{\otimes n} Fn构造而成。这种递归构造方式不仅理论清晰,而且便于硬件实现,是极化码高效编解码的重要基础。

编码举例

img

在极化码的编码过程中,假设我们已经计算出各个分裂信道的巴氏参数,并根据信道容量对子信道进行排序。例如,假设序号为“4, 6, 7, 8”的子信道具有最小的巴氏参数,因此将这些子信道用于传输信息比特,而将休眠比特放置在序号为“1, 2, 3, 5”的位置。假设休眠比特为 0,信息比特为 (1, 1, 1, 1),则最终得到输入序列 u 8 = [ 0 , 0 , 0 , 1 , 0 , 1 , 1 , 1 ] u_8 = [0, 0, 0, 1, 0, 1, 1, 1] u8=[0,0,0,1,0,1,1,1]

接下来,我们需要构造生成矩阵 G 8 G_8 G8来完成编码过程。生成矩阵由排序矩阵 B N B_N BN和克罗内克积矩阵 F ⊗ n F^{\otimes n} Fn构成,即 G N = B N F ⊗ n G_N = B_N F^{\otimes n} GN=BNFn


  • 求排序矩阵 B N B_N BN

排序矩阵 B N B_N BN是通过递归方式构造的。首先定义 B 2 = I 2 B_2 = I_2 B2=I2,其中 I 2 I_2 I2是单位矩阵:
$
B_2 =
\begin{bmatrix}
1 & 0 \
0 & 1
\end{bmatrix}
$

接着,利用递归公式 B 4 = R 4 ( I 2 ⊗ B 2 ) B_4 = R_4 (I_2 \otimes B_2) B4=R4(I2B2) B 8 = R 8 ( I 2 ⊗ B 4 ) B_8 = R_8 (I_2 \otimes B_4) B8=R8(I2B4),可以逐步求得 B 8 B_8 B8。具体步骤如下:

  1. 计算 I 2 ⊗ B 2 I_2 \otimes B_2 I2B2

I 2 ⊗ B 2 = [ 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 ] I_2 \otimes B_2 = \begin{bmatrix} 1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 \end{bmatrix} I2B2= 1000010000100001

  1. 计算 R 4 R_4 R4

R 4 = [ 1 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 ] R_4 = \begin{bmatrix} 1 & 0 & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 0 & 1 \end{bmatrix} R4= 1000001001000001

  1. 计算 B 4 B_4 B4

B 4 = R 4 ( I 2 ⊗ B 2 ) = [ 1 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 ] ⋅ [ 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 ] = [ 1 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 ] B_4 = R_4 (I_2 \otimes B_2) = \begin{bmatrix} 1 & 0 & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 0 & 1 \end{bmatrix} \cdot \begin{bmatrix} 1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 \end{bmatrix} {=} \begin{bmatrix} 1 & 0 & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 0 & 1 \end{bmatrix} B4=R4(I2B2)= 1000001001000001 1000010000100001 = 1000001001000001

  1. 计算 I 2 ⊗ B 4 I_2 \otimes B_4 I2B4

I 2 ⊗ B 4 = [ 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 ] I_2 \otimes B_4 = \begin{bmatrix} 1 & 0 & 0 & 0 & 0 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 & 0 & 0 & 0 & 0 \\ 0 & 0 & 1 & 0 & 0 & 0 & 0 & 0 \\ 0 & 0 & 0 & 1 & 0 & 0 & 0 & 0 \\ 0 & 0 & 0 & 0 & 1 & 0 & 0 & 0 \\ 0 & 0 & 0 & 0 & 0 & 1 & 0 & 0 \\ 0 & 0 & 0 & 0 & 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 0 & 0 & 0 & 0 & 1 \end{bmatrix} I2B4= 1000000001000000001000000001000000001000000001000000001000000001

  1. 计算 R 8 R_8 R8

R 8 = [ 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 ] R_8 = \begin{bmatrix} 1 & 0 & 0 & 0 & 0 & 0 & 0 & 0 \\ 0 & 0 & 0 & 0 & 1 & 0 & 0 & 0 \\ 0 & 0 & 1 & 0 & 0 & 0 & 0 & 0 \\ 0 & 0 & 0 & 0 & 0 & 1 & 0 & 0 \\ 0 & 1 & 0 & 0 & 0 & 0 & 0 & 0 \\ 0 & 0 & 0 & 0 & 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 & 0 & 0 & 0 & 0 \\ 0 & 0 & 0 & 0 & 0 & 0 & 0 & 1 \end{bmatrix} R8= 1000000000001000001000000000001001000000000100000000010000000001

  1. 最终计算 B 8 B_8 B8

B 8 = R 8 ( I 2 ⊗ B 4 ) = [ 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 ] B_8 = R_8 (I_2 \otimes B_4) = \begin{bmatrix} 1 & 0 & 0 & 0 & 0 & 0 & 0 & 0 \\ 0 & 0 & 0 & 0 & 1 & 0 & 0 & 0 \\ 0 & 0 & 1 & 0 & 0 & 0 & 0 & 0 \\ 0 & 0 & 0 & 0 & 0 & 1 & 0 & 0 \\ 0 & 1 & 0 & 0 & 0 & 0 & 0 & 0 \\ 0 & 0 & 0 & 0 & 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 & 0 & 0 & 0 & 0 \\ 0 & 0 & 0 & 0 & 0 & 0 & 0 & 1 \end{bmatrix} B8=R8(I2B4)= 1000000000001000001000000000001001000000000100000000010000000001


  • F F F n n n次克罗内克积

F F F是一个 2 × 2 2 \times 2 2×2的生成矩阵,定义为:
F = [ 1 0 1 1 ] F = \begin{bmatrix} 1 & 0 \\ 1 & 1 \end{bmatrix} F=[1101]
通过递归方式计算 F ⊗ n F^{\otimes n} Fn

1. F ⊗ 1 = F F^{\otimes 1} = F F1=F

F ⊗ 1 = [ 1 0 1 1 ] F^{\otimes 1} = \begin{bmatrix} 1 & 0 \\ 1 & 1 \end{bmatrix} F1=[1101]

2. F ⊗ 2 = F ⊗ F F^{\otimes 2} = F \otimes F F2=FF

F ⊗ 2 = [ F 0 F F ] = [ 1 0 0 0 1 1 0 0 1 0 1 0 1 1 1 1 ] F^{\otimes 2} = \begin{bmatrix} F & 0 \\ F & F \end{bmatrix} {=} \begin{bmatrix} 1 & 0 & 0 & 0 \\ 1 & 1 & 0 & 0 \\ 1 & 0 & 1 & 0 \\ 1 & 1 & 1 & 1 \end{bmatrix} F2=[FF0F]= 1111010100110001

3. F ⊗ 3 = F ⊗ F ⊗ 2 F^{\otimes 3} = F \otimes F^{\otimes 2} F3=FF2

F ⊗ 3 = [ F ⊗ 2 0 F ⊗ 2 F ⊗ 2 ] = [ 1 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 1 0 1 0 0 0 0 0 1 1 1 1 0 0 0 0 1 0 0 0 1 0 0 0 1 1 0 0 1 1 0 0 1 0 1 0 1 0 1 0 1 1 1 1 1 1 1 1 ] F^{\otimes 3} = \begin{bmatrix} F^{\otimes 2} & 0 \\ F^{\otimes 2} & F^{\otimes 2} \end{bmatrix} {=} \begin{bmatrix} 1 & 0 & 0 & 0 & 0 & 0 & 0 & 0 \\ 1 & 1 & 0 & 0 & 0 & 0 & 0 & 0 \\ 1 & 0 & 1 & 0 & 0 & 0 & 0 & 0 \\ 1 & 1 & 1 & 1 & 0 & 0 & 0 & 0 \\ 1 & 0 & 0 & 0 & 1 & 0 & 0 & 0 \\ 1 & 1 & 0 & 0 & 1 & 1 & 0 & 0 \\ 1 & 0 & 1 & 0 & 1 & 0 & 1 & 0 \\ 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 \end{bmatrix} F3=[F2F20F2]= 1111111101010101001100110001000100001111000001010000001100000001


  • 计算生成矩阵 G 8 G_8 G8

生成矩阵 G 8 G_8 G8定义为 G 8 = B 8 F ⊗ 3 G_8 = B_8 F^{\otimes 3} G8=B8F3。将 B 8 B_8 B8 F ⊗ 3 F^{\otimes 3} F3相乘即可得到 G 8 G_8 G8
G 8 = B 8 F ⊗ 3 = [ 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 1 1 0 0 0 0 0 0 1 1 0 0 1 0 0 0 1 0 1 0 0 0 0 0 1 0 1 0 1 0 0 0 1 1 1 0 0 0 0 0 1 1 1 1 1 1 1 1 ] G_8 = B_8 F^{\otimes 3} = \begin{bmatrix} 1 & 0 & 0 & 0 & 0 & 0 & 0 & 0 \\ 1 & 0 & 0 & 0 & 1 & 0 & 0 & 0 \\ 1 & 1 & 0 & 0 & 0 & 0 & 0 & 0 \\ 1 & 1 & 0 & 0 & 1 & 0 & 0 & 0 \\ 1 & 0 & 1 & 0 & 0 & 0 & 0 & 0 \\ 1 & 0 & 1 & 0 & 1 & 0 & 0 & 0 \\ 1 & 1 & 1 & 0 & 0 & 0 & 0 & 0 \\ 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 \end{bmatrix} G8=B8F3= 1111111100110011000011110000000101010101000000010000000100000001


  • 生成 Polar 码

最终,利用生成矩阵 G 8 G_8 G8对输入序列 u 8 u_8 u8进行编码:

x 8 = u 8 G 8 x_8 = u_8 G_8 x8=u8G8

具体计算如下:

x 8 = [ 0 0 0 1 0 1 1 1 ] ⋅ [ 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 1 1 0 0 0 0 0 0 1 1 0 0 1 0 0 0 1 0 1 0 0 0 0 0 1 0 1 0 1 0 0 0 1 1 1 0 0 0 0 0 1 1 1 1 1 1 1 1 ] = [ 0 1 1 0 1 0 0 1 ] x_8 = \begin{bmatrix} 0 & 0 & 0 & 1 & 0 & 1 & 1 & 1 \end{bmatrix} \cdot \begin{bmatrix} 1 & 0 & 0 & 0 & 0 & 0 & 0 & 0 \\ 1 & 0 & 0 & 0 & 1 & 0 & 0 & 0 \\ 1 & 1 & 0 & 0 & 0 & 0 & 0 & 0 \\ 1 & 1 & 0 & 0 & 1 & 0 & 0 & 0 \\ 1 & 0 & 1 & 0 & 0 & 0 & 0 & 0 \\ 1 & 0 & 1 & 0 & 1 & 0 & 0 & 0 \\ 1 & 1 & 1 & 0 & 0 & 0 & 0 & 0 \\ 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 \end{bmatrix} {=} \begin{bmatrix} 0 & 1 & 1 & 0 & 1 & 0 & 0 & 1 \end{bmatrix} x8=[00010111] 1111111100110011000011110000000101010101000000010000000100000001 =[01101001]
因此,生成的 Polar 码为:

x 8 = [ 0 , 1 , 1 , 0 , 1 , 0 , 0 , 1 ] x_8 = [0, 1, 1, 0, 1, 0, 0, 1] x8=[0,1,1,0,1,0,0,1]

  • MATLAB 仿真

在 MATLAB 中,可以通过递归算法和矩阵运算两种方式实现编码。以下为代码示例:

% 极化编码
u = [0 0 0 1 0 1 1 1]; % 添加休眠比特后的码字x1 = polarCode(u); % 递归算法实现
x2 = polarMatrix(u); % 矩阵运算实现编码function x = polarCode(u)N = length(u);if N == 1x = u; % 待编码序列长度为 1 时,极化编码就是它本身else% 将待编码序列 u 分为前半段、后半段% 前半段与后半段进行模 2 加,结果存放于前半段中u1 = mod(u(1:N/2) + u(N/2+1:N), 2);u2 = u(N/2+1:N); % 后半段不变% 运行递归计算x = [polarCode(u1), polarCode(u2)];end
endfunction x = polarMatrix(u)N = length(u);if N == 1x = u;elseif 2^nextpow2(N) ~= Ntmp = zeros(1, 2^nextpow2(N));tmp(1:N) = u;x = polarMatrix(tmp);x = x(1:N);elsen = log2(N);Gpre = 1;for i = 1:nNi = 2^i;A = zeros(Ni);for j = 1:Ni/2A(2*j-1, j) = 1;A(2*j, j) = 1;A(2*j, Ni/2+j) = 1;endG = A * kron(eye(2), Gpre);Gpre = G;endGN = Gpre; % 生成矩阵 GNx = mod(u * GN, 2); % GN 与 u 的运算中加法代表异或运算end
end

通过上述代码,我们可以验证递归算法和矩阵运算两种方法的结果是否一致。

img

2.3.4 极化译码

极化译码的核心思想是基于接收信号的似然比(Likelihood Ratio, LR)或对数似然比(Log-Likelihood Ratio, LLR)进行逐比特判决。以下详细解释极化译码中的最小单元译码过程。


最小单元译码

在极化码的译码过程中,最小单元译码是最基本的一步,用于计算每个比特的似然比 L R ( u ^ 1 ) L_R(\hat{u}_1) LR(u^1) L R ( u ^ 2 ) L_R(\hat{u}_2) LR(u^2)


  • 似然比

img

根据信道模型和递归构造原理,可以推导出以下公式:
L R ( u ^ 1 ) = P ( u ^ 1 = 0 ) P ( u ^ 1 = 1 ) = P ( x ^ 1 = 0 ) P ( x ^ 2 = 0 ) + P ( x ^ 1 = 1 ) P ( x ^ 2 = 1 ) P ( x ^ 1 = 0 ) P ( x ^ 2 = 1 ) + P ( x ^ 1 = 1 ) P ( x ^ 2 = 0 ) L_R(\hat{u}_1) = \frac{P(\hat{u}_1 = 0)}{P(\hat{u}_1 = 1)} = \frac{P(\hat{x}_1 = 0)P(\hat{x}_2 = 0) + P(\hat{x}_1 = 1)P(\hat{x}_2 = 1)}{P(\hat{x}_1 = 0)P(\hat{x}_2 = 1) + P(\hat{x}_1 = 1)P(\hat{x}_2 = 0)} LR(u^1)=P(u^1=1)P(u^1=0)=P(x^1=0)P(x^2=1)+P(x^1=1)P(x^2=0)P(x^1=0)P(x^2=0)+P(x^1=1)P(x^2=1)

进一步简化后可得:
L R ( u ^ 1 ) = 1 + L R ( x ^ 1 ) L R ( x ^ 2 ) L R ( x ^ 1 ) + L R ( x ^ 2 ) L_R(\hat{u}_1) = \frac{1 + L_R(\hat{x}_1)L_R(\hat{x}_2)}{L_R(\hat{x}_1) + L_R(\hat{x}_2)} LR(u^1)=LR(x^1)+LR(x^2)1+LR(x^1)LR(x^2)

如果假设 u ^ 1 = 0 \hat{u}_1 = 0 u^1=0,则当 u ^ 2 = 0 \hat{u}_2 = 0 u^2=0时,必须满足 x ^ 1 = x ^ 2 = 0 \hat{x}_1 = \hat{x}_2 = 0 x^1=x^2=0;而当 u ^ 2 = 1 \hat{u}_2 = 1 u^2=1时,则 x ^ 1 = x ^ 2 = 1 \hat{x}_1 = \hat{x}_2 = 1 x^1=x^2=1。因此,条件似然比 L R ( u ^ 1 = 0 ) ( u ^ 2 ) L_R(\hat{u}_1=0)(\hat{u}_2) LR(u^1=0)(u^2)可表示为:
L R ( u ^ 1 = 0 ) ( u ^ 2 ) = P u ^ 1 = 0 ( u ^ 2 = 0 ) P u ^ 1 = 0 ( u ^ 2 = 1 ) = P ( x ^ 1 = 0 ) P ( x ^ 2 = 0 ) P ( x ^ 1 = 1 ) P ( x ^ 2 = 1 ) = L R ( x ^ 1 ) L R ( x ^ 2 ) L_R(\hat{u}_1=0)(\hat{u}_2) = \frac{P_{\hat{u}_1=0}(\hat{u}_2 = 0)}{P_{\hat{u}_1=0}(\hat{u}_2 = 1)} = \frac{P(\hat{x}_1 = 0)P(\hat{x}_2 = 0)}{P(\hat{x}_1 = 1)P(\hat{x}_2 = 1)} = L_R(\hat{x}_1)L_R(\hat{x}_2) LR(u^1=0)(u^2)=Pu^1=0(u^2=1)Pu^1=0(u^2=0)=P(x^1=1)P(x^2=1)P(x^1=0)P(x^2=0)=LR(x^1)LR(x^2)

同理,当 u ^ 1 = 1 \hat{u}_1 = 1 u^1=1时,有:
L R ( u ^ 1 = 1 ) ( u ^ 2 ) = P u ^ 1 = 1 ( u ^ 2 = 0 ) P u ^ 1 = 1 ( u ^ 2 = 1 ) = L R ( x ^ 2 ) L R ( x ^ 1 ) L_R(\hat{u}_1=1)(\hat{u}_2) = \frac{P_{\hat{u}_1=1}(\hat{u}_2 = 0)}{P_{\hat{u}_1=1}(\hat{u}_2 = 1)} = \frac{L_R(\hat{x}_2)}{L_R(\hat{x}_1)} LR(u^1=1)(u^2)=Pu^1=1(u^2=1)Pu^1=1(u^2=0)=LR(x^1)LR(x^2)

综合上述结果,最终可得:
L R ( u ^ 2 ) = [ L R ( x ^ 1 ) ] 1 − 2 u ^ 1 L R ( x ^ 2 ) L_R(\hat{u}_2) = [L_R(\hat{x}_1)]^{1-2\hat{u}_1}L_R(\hat{x}_2) LR(u^2)=[LR(x^1)]12u^1LR(x^2)


  • 对数似然比(LLR)的应用

在实际应用中,通常使用对数似然比(LLR)代替似然比,以简化计算复杂度。定义 L 1 = ln ⁡ ( L R ( x ^ 1 ) ) L_1 = \ln(L_R(\hat{x}_1)) L1=ln(LR(x^1)) L 2 = ln ⁡ ( L R ( x ^ 2 ) ) L_2 = \ln(L_R(\hat{x}_2)) L2=ln(LR(x^2)),则有:
L L R ( u ^ 1 ) = ln ⁡ ( 1 + e L 1 + L 2 e L 1 + e L 2 ) L_{LR}(\hat{u}_1) = \ln\left(\frac{1 + e^{L_1 + L_2}}{e^{L_1} + e^{L_2}}\right) LLR(u^1)=ln(eL1+eL21+eL1+L2)

在高斯信道下,该式可以近似为:
L L R ( u ^ 1 ) ≈ sign ⁡ ( L 1 ) sign ⁡ ( L 2 ) min ⁡ { ∣ L 1 ∣ , ∣ L 2 ∣ } L_{LR}(\hat{u}_1) \approx \operatorname{sign}(L_1)\operatorname{sign}(L_2)\min\{|L_1|, |L_2|\} LLR(u^1)sign(L1)sign(L2)min{L1,L2}

其中, sign ⁡ \operatorname{sign} sign表示取符号位操作,上式被称为 f f f运算。得到 u ^ 1 \hat{u}_1 u^1后,即可进一步计算 u ^ 2 \hat{u}_2 u^2的 LLR:
L L R ( u ^ 2 ) = ( 1 − 2 u ^ 1 ) L 1 + L 2 L_{LR}(\hat{u}_2) = (1 - 2\hat{u}_1)L_1 + L_2 LLR(u^2)=(12u^1)L1+L2

上式被称为 g g g运算。

通过计算 L L R ( u ^ 1 ) L_{LR}(\hat{u}_1) LLR(u^1) L L R ( u ^ 2 ) L_{LR}(\hat{u}_2) LLR(u^2),可以进行判决:若 L L R ≥ 0 L_{LR} \geq 0 LLR0,判决为 0;若 L L R < 0 L_{LR} < 0 LLR<0,判决为 1。同样地,对于似然比 L R L_R LR,若 L R ≥ 1 L_R \geq 1 LR1,判决为 0;否则判决为 1。

img


  • BPSK 调制下的 LLR 计算

在二进制相移键控(BPSK)调制中,发送信号 s s s定义为:
s = 1 − 2 x , s ∈ { 1 , − 1 } s = 1 - 2x, \quad s \in \{1, -1\} s=12x,s{1,1}

接收信号 y y y表示为:
y = s + n y = s + n y=s+n

其中 n n n是均值为 0、方差为 σ 2 \sigma^2 σ2的高斯白噪声。此时,接收信号 y y y的 LLR 可表示为:
L L R = ln ⁡ ( 1 2 π σ 2 e − ( y − 1 ) 2 / ( 2 σ 2 ) 1 2 π σ 2 e − ( y + 1 ) 2 / ( 2 σ 2 ) ) = 2 y σ 2 L_{LR} = \ln\left(\frac{\frac{1}{\sqrt{2\pi\sigma^2}}e^{-(y-1)^2/(2\sigma^2)}}{\frac{1}{\sqrt{2\pi\sigma^2}}e^{-(y+1)^2/(2\sigma^2)}}\right) = \frac{2y}{\sigma^2} LLR=ln 2πσ2 1e(y+1)2/(2σ2)2πσ2 1e(y1)2/(2σ2) =σ22y


串行抵消译码(SC译码)算法

串行抵消译码(Successive Cancellation, SC)是极化码的一种经典译码算法。它通过递归的方式对二叉树结构进行遍历,逐步完成对每个子信道的判决。以下以一个具体例子来说明 SC 译码的过程。


  • 配置与问题描述

假设在 AWGN 信道中传输数据,配置如下:

  • 码长 N = 8 N = 8 N=8
  • 信息比特数 K = 4 K = 4 K=4
  • 码率 R = K / N = 0.5 R = K/N = 0.5 R=K/N=0.5
  • 信息比特集合为 { 4 , 6 , 7 , 8 } \{4, 6, 7, 8\} {4,6,7,8},冻结比特全部取 0
  • 信息比特为 ( 1 , 1 , 1 , 1 ) (1, 1, 1, 1) (1,1,1,1),则输入序列 u 1 8 = ( 00010111 ) u_1^8 = (00010111) u18=(00010111)
  • 编码后得到 Polar 码 x 1 8 = u 1 8 F ⊗ 3 = ( 01101001 ) x_1^8 = u_1^8 F^{\otimes 3} = (01101001) x18=u18F3=(01101001)
  • 对应 BPSK 序列为 x 1 8 = ( 1 , − 1 , − 1 , 1 , − 1 , 1 , 1 , − 1 ) x_1^8 = (1, -1, -1, 1, -1, 1, 1, -1) x18=(1,1,1,1,1,1,1,1)
  • 生成随机噪声序列 n 1 8 = ( − 1.4 , 0.5 , 0.2 , − 0.8 , − 0.3 , 0.2 , 2.3 , 1.7 ) n_1^8 = (-1.4, 0.5, 0.2, -0.8, -0.3, 0.2, 2.3, 1.7) n18=(1.4,0.5,0.2,0.8,0.3,0.2,2.3,1.7)
  • 接收信号为 y 1 8 = s 1 8 + n 1 8 = ( − 0.4 , − 0.5 , − 0.8 , 0.2 , − 1.3 , 1.2 , 3.3 , 0.7 ) y_1^8 = s_1^8 + n_1^8 = (-0.4, -0.5, -0.8, 0.2, -1.3, 1.2, 3.3, 0.7) y18=s18+n18=(0.4,0.5,0.8,0.2,1.3,1.2,3.3,0.7)
  • 接收对数似然比(LLR)序列为:

L 1 8 = 2 σ 2 y 1 8 = ( − 2.0 , − 2.5 , − 4.0 , 1.0 , − 6.5 , 6.0 , 16.6 , 3.5 ) L_1^8 = \frac{2}{\sigma^2} y_1^8 = (-2.0, -2.5, -4.0, 1.0, -6.5, 6.0, 16.6, 3.5) L18=σ22y18=(2.0,2.5,4.0,1.0,6.5,6.0,16.6,3.5)

img


  • SC 译码的二叉树表示

SC 译码过程可以用二叉树表示,其结构与编码图一致。

img

每个节点对应一个长度为 N N N的 LLR 序列,按照以下规则递归处理:

  1. 母节点到左子节点:

    • 将母节点长度为 N N N的 LLR 序列进行 N / 2 N/2 N/2 f f f运算,得到左子节点的 LLR 序列。
    • 如果左子节点不是叶节点,则将其作为新的母节点继续向下递归。
    • 如果左子节点是叶节点:
      • 若为冻结比特,直接判决为 0;
      • 若为信息比特,通过 LLR 硬判决(大于等于 0 判决为 0,小于 0 判决为 1),并将判决结果传回母节点。
  2. 母节点到右子节点:

    • 使用部分判决结果和 LLR 序列进行 N / 2 N/2 N/2 g g g运算,得到右子节点的 LLR 序列。
    • 对右子节点重复上述操作。
  3. 母节点判决:

    • 当左右子节点的判决结果都已知时,通过运算得到母节点对应的判决结果。

递归实现整个二叉树的译码过程,最终得到完整的译码结果。

img


  • f f f g g g函数定义

在 SC 译码中, f f f g g g是两个核心运算函数,分别用于计算左子节点和右子节点的 LLR 序列。

  1. f f f函数:

    • 定义为:

f ( x , y ) = sign ( x ) ⋅ sign ( y ) ⋅ min ⁡ ( ∣ x ∣ , ∣ y ∣ ) f(x, y) = \text{sign}(x) \cdot \text{sign}(y) \cdot \min(|x|, |y|) f(x,y)=sign(x)sign(y)min(x,y)

  • 作用是对两个 LLR 值进行组合,保留较小的绝对值并保持符号一致性。
  1. g g g函数:

    • 定义为:

g ( u , x , y ) = ( 1 − 2 u ) ⋅ x + y g(u, x, y) = (1 - 2u) \cdot x + y g(u,x,y)=(12u)x+y

  • 作用是根据部分判决结果 u u u和 LLR 值 x , y x, y x,y计算新的 LLR 序列。

  • MATLAB 仿真实现

以下是基于 MATLAB 的 SC 译码实现代码,使用上述 LLR 序列进行仿真。

% 极化译码
% 对数似然比
LLR = [-2.0, -2.5, -4.0, 1.0, -6.5, 6.0, 16.6, 3.5];
% 冻结比特位(1是冻结位)
frozen_bits = [1, 1, 1, 0, 1, 0, 0, 0];
[u, b] = SC_decode(LLR, frozen_bits);function [u, b] = SC_decode(llr, frozen_bits)N = length(llr);if N == 1if frozen_bitsu = 0; % 冻结比特直接判决为0elseu = llr < 0; % 硬判决;小于0判决为1,大于等于0判决为0endb = u;else% 运行f运算alpha_left = f(llr(1:N/2), llr(N/2+1:N));% 递归译码[u_left_child, beta_left_child] = SC_decode(alpha_left, frozen_bits(1:N/2));% 运行g运算alpha_right = g(beta_left_child, llr(1:N/2), llr(N/2+1:N));% 递归译码[u_right_child, beta_right_child] = SC_decode(alpha_right, frozen_bits(N/2+1:N));% 合并译码结果u = [u_left_child, u_right_child];b = zeros(1, N);b(1:N/2) = mod(beta_left_child + beta_right_child, 2);b(N/2+1:N) = beta_right_child;end
endfunction [z] = f(x, y) % f函数z = sign(x) .* sign(y) .* min(abs(x), abs(y));
endfunction [z] = g(u, x, y) % g函数z = (1 - 2 * u) .* x + y;
end

img


  • 总结

SC 译码算法通过递归方式对二叉树结构进行遍历,结合 f f f g g g运算完成对每个子信道的判决。该算法具有较低的复杂度,适用于中小规模的极化码译码。然而,对于大规模码长,SC 译码的性能可能受到限制,因此衍生出了多种改进算法(如 SCL、CA-SCL 等)。

SCL译码算法

SCL(Successive Cancellation List,串行抵消列表)译码算法是Polar Code的一种改进译码方法。与SC(Successive Cancellation)译码相比,SCL通过引入列表机制来缓解错误传递问题,从而显著提升有限码长下的性能。


  • 问题背景

在Polar Code中,当码长趋于无穷时,信道极化才会完全实现。但在实际应用中,由于码长有限,信道极化并不完全,这可能导致某些信息比特无法被正确译码。SC译码器的一个主要缺点是,它在对后续信息比特进行译码时依赖于先前比特的估计值。如果前面的信息比特译码发生错误,则会引发错误传递,且这种错误无法修正。

为了解决这一问题,SCL算法应运而生。SCL通过增加列表机制,在每一层路径搜索后保留多个候选路径,从而降低错误传递的概率。


  • 路径度量值(PM)

为了评估每条候选路径的优劣,定义路径度量值(Path Metrics, PM)。路径度量值反映了某个译码结果的后验概率 Pr ⁡ ( u 1 i ∣ y 1 N ) \Pr(u_1^i | y_1^N) Pr(u1iy1N),其值越大,说明该译码结果越可能正确。经过数学推导,路径度量值可以表示为:
− ln ⁡ Pr ⁡ ( u 1 i ∣ y 1 N ) = ∑ k = 1 i ln ⁡ ( 1 + e − ( 1 − 2 u k ) L N ( k ) ) -\ln\Pr(u_1^i | y_1^N) = \sum_{k=1}^i \ln(1 + e^{-(1 - 2u_k)L_N(k)}) lnPr(u1iy1N)=k=1iln(1+e(12uk)LN(k))
P M = − ln ⁡ Pr ⁡ ( u 1 i ∣ y 1 N ) PM = -\ln\Pr(u_1^i | y_1^N) PM=lnPr(u1iy1N),则路径度量值越小,译码正确率越高。


  • 算法流程

SCL译码算法的具体步骤如下:

(1)初始化

在SCL译码器内部并行放置 L L L个SC译码器,记作 S C 1 , S C 2 , … , S C L SC_1, SC_2, \dots, SC_L SC1,SC2,,SCL。初始状态下,所有译码器均未激活,未激活译码器集合为 S s l e e p = { 2 , 3 , … , L } S_{sleep} = \{2, 3, \dots, L\} Ssleep={2,3,,L},仅激活1号译码器。

(2)接收LLR序列

SCL译码器获得接收对数似然比(LLR)序列 ( L 1 , L 2 , … , L N ) (L_1, L_2, \dots, L_N) (L1,L2,,LN),并将路径度量值初始化为0。

(3)逐比特译码

激活的译码器按照标准SC译码流程进行逐比特译码。对于当前比特 u i u_i ui

  • 如果 u i u_i ui是冻结比特,直接令 u i = 0 u_i = 0 ui=0

  • 如果 u i u_i ui是信息比特,判断未激活译码器集合 S s l e e p S_{sleep} Ssleep是否为空:

    • S s l e e p ≠ ∅ S_{sleep} \neq \emptyset Ssleep=,从 S s l e e p S_{sleep} Ssleep中弹出一个译码器,并继承当前激活译码器的所有数据。

    • 原始路径(例如 S C 1 SC_1 SC1)设 u i = 0 u_i = 0 ui=0,克隆路径设 u i = 1 u_i = 1 ui=1

    • 分别计算两条路径的路径度量值:
      Pr ⁡ ( u 1 i , 1 ∣ y 1 N ) = ∑ k = 1 i − 1 ln ⁡ ( 1 + e − ( 1 − 2 u k , 1 ) L N ( k ) ) + ln ⁡ ( 1 + e − L N ( i ) ) \Pr(u_1^{i},1 | y_1^N) = \sum_{k=1}^{i-1} \ln(1 + e^{-(1 - 2u_k,1)L_N(k)}) + \ln(1 + e^{-L_N(i)}) Pr(u1i,1∣y1N)=k=1i1ln(1+e(12uk,1)LN(k))+ln(1+eLN(i))

Pr ⁡ ( u 1 i , 2 ∣ y 1 N ) = ∑ k = 1 i − 1 ln ⁡ ( 1 + e − ( 1 − 2 u k , 2 ) L N ( k ) ) + ln ⁡ ( 1 + e L N ( i ) ) \Pr(u_1^{i},2 | y_1^N) = \sum_{k=1}^{i-1} \ln(1 + e^{-(1 - 2u_k,2)L_N(k)}) + \ln(1 + e^{L_N(i)}) Pr(u1i,2∣y1N)=k=1i1ln(1+e(12uk,2)LN(k))+ln(1+eLN(i))

此时,SCL译码器同时保留了 u i = 0 u_i = 0 ui=0 u i = 1 u_i = 1 ui=1两种译码结果。

(4)扩展路径

激活的不同译码器继续独立译码,重复上述步骤(3),直到 S s l e e p = ∅ S_{sleep} = \emptyset Ssleep=

(5)路径选择

在某一时刻,假设所有 L L L个已激活译码器各自有判决 u t u_t ut的路径度量值 P M l , L L R : L N , l t , 1 ≤ l ≤ L PM_l, LLR: L_N,l^t, 1 \leq l \leq L PMl,LLR:LN,lt,1lL。根据公式:
P M = [ P M 1 + ln ⁡ ( 1 + e − L N , 1 ( t ) ) … P M l + ln ⁡ ( 1 + e − L N , l ( t ) ) … P M L + ln ⁡ ( 1 + e − L N , L ( t ) ) P M 1 + ln ⁡ ( 1 + e L N , 1 ( t ) ) … P M l + ln ⁡ ( 1 + e L N , l ( t ) ) … P M L + ln ⁡ ( 1 + e L N , L ( t ) ) ] PM = \begin{bmatrix} PM_1 + \ln(1 + e^{-L_N,1(t)}) & \dots & PM_l + \ln(1 + e^{-L_N,l(t)}) & \dots & PM_L + \ln(1 + e^{-L_N,L(t)}) \\ PM_1 + \ln(1 + e^{L_N,1(t)}) & \dots & PM_l + \ln(1 + e^{L_N,l(t)}) & \dots & PM_L + \ln(1 + e^{L_N,L(t)}) \end{bmatrix} PM=[PM1+ln(1+eLN,1(t))PM1+ln(1+eLN,1(t))PMl+ln(1+eLN,l(t))PMl+ln(1+eLN,l(t))PML+ln(1+eLN,L(t))PML+ln(1+eLN,L(t))]
从上述 2 L 2L 2L条路径中选取路径度量值最小的 L L L条路径保留。

对于每列路径度量值,可能存在以下三种情况:

  1. 两个元素均未选入:对应译码器 S C l SC_l SCl休眠并回收入 S s l e e p S_{sleep} Ssleep
  2. 仅一个元素选入:对应译码器 S C l SC_l SCl保留选入的比特,并更新路径度量。
  3. 两个元素均选入:保留 u t , l = 0 u_t,l = 0 ut,l=0的路径,并更新路径度量;随后从 S s l e e p S_{sleep} Ssleep中弹出一个译码器继承 S C l SC_l SCl的数据,设 u t , k = 1 u_t,k = 1 ut,k=1,并据此更新路径度量。

(6)完成译码

若当前比特为冻结比特,直接判为0并更新路径度量;若为信息比特,则重复上述步骤。以此类推,直至完成所有 N N N个比特的译码。

(7)输出结果

在所有译码结束后,选择路径度量值最小的译码结果作为最终输出。

img


  • 搜索宽度参数 L L L

在SCL译码算法中,参数 L L L称为搜索宽度:

  • L = 1 L = 1 L=1时,SCL退化为SC译码算法。
  • L ≥ 2 K L \geq 2^K L2K K K K为信息比特数)时,SCL等价于最大似然译码。

SC译码算法是深度优先的,目标是从根节点快速到达叶子节点;而SCL译码算法则是广度优先的,先扩展多条路径,再通过剪枝操作保留最优路径,最终到达叶子节点。

通过合理设置 L L L,可以在复杂度和性能之间取得平衡,从而有效提升Polar Code的译码性能。

2.3.5 总结

Polar 码是一种基于信道极化这一数字信号处理技术的纠错编码方法,本文对信道极化现象以及 Polar 码的编码和译码原理进行了深入研究。以下将从优势、主要问题及应用前景等方面对 Polar 码进行总结。


Polar 码的优势
  1. 容量可达性
    在实际通信系统中,Turbo 码和 LDPC 码等传统信道编码方案在码长接近无限时能够非常逼近信道容量,但始终无法被严格证明达到容量。而 Polar 码在码长趋于无穷的场景下,已被严格数学证明能够达到信道容量。这是 Polar 码的核心理论优势之一。

  2. 明确的构码方法
    Polar 码具有明确的构造方法,通过信道极化过程生成好的子信道用于传输信息比特,差的子信道用于冻结比特。这种构造方式不仅理论清晰,而且便于实现。

  3. 较低的编译码复杂度
    Polar 码的编译码复杂度相对较低,其复杂度为 O ( N log ⁡ N ) O(N \log N) O(NlogN),与 Turbo 码和 LDPC 码相当。同时,采用串行抵消(SC)译码算法可以获得接近最大似然解码的性能。

  4. 优异的性能表现
    在适当的译码方法(如 SCL 或 CA-SCL)支持下,Polar 码的性能可以超越最好的 LDPC 码和 Turbo 码,特别是在中短码长的情形下表现尤为突出。


Polar 码的主要问题
  1. 最小汉明距离较小
    Polar 码的最小汉明距离相对较小,这可能在一定程度上影响其解码性能,尤其是在高误码率场景下可能导致错误传播。
  2. SC 译码时延较长
    SC 译码算法虽然复杂度较低,但由于其串行特性,译码时延较长。为缓解这一问题,可以通过并行解码方法(如 SCL 或 List 解码)来提高译码效率,但这会增加硬件复杂度。
Polar 码的应用前景

Polar 码较好地平衡了性能和复杂性,在中短码长的情形下表现出显著优势。因此,它在现代通信系统中有广阔的应用前景,特别是在以下领域:

  1. 信源编码
    Polar 码不仅可以用于信道编码,还可以扩展到信源编码领域。例如,通过构造对偶码,Polar 码可以实现高效的压缩编码。

  2. 多用户通信
    在多用户通信场景中,Polar 码可以结合网络编码技术,优化多用户间的资源共享和干扰管理。

  3. 物理层保密通信
    Polar 码在物理层保密通信中具有潜在应用价值,例如通过设计特定的冻结比特模式来实现信息的安全传输。

尽管这些应用领域已引起部分学者的关注,但大多数研究仍停留在理论阶段。为了在未来的通信系统中实现 Polar 码的实际部署和应用,仍然需要大量的研究工作,包括算法优化、硬件实现以及与其他通信技术的融合。


2.3.6 参考文档

[1] Erdal Arikan. Channel polarization: A method for constructing capacity-achieving codes for symmetric binary-input memoryless channels. IEEE Transactions on information Theory, 55(7):3051–3073, 2009.

[2] 于永润. 极化码讲义

[3] Polar Code 24节

[4] 不错的PPT

文章亦发布在博客:LiQ’s blog - 个人博客 学习经验分享,欢迎关注。

参考链接:5G 信道编码技术—Polar码 - 知乎

相关文章:

探秘基带算法:从原理到5G时代的通信变革【四】Polar 编解码(二)

文章目录 2.3.3 极化编码巴氏参数与信道可靠性比特混合生成矩阵编码举例 2.3.4 极化译码最小单元译码串行抵消译码&#xff08;SC译码&#xff09;算法SCL译码算法 2.3.5 总结**Polar 码的优势****Polar 码的主要问题****Polar 码的应用前景** 2.3.6 **参考文档** 本博客为系列…...

机器学习准备工作

机器学习准备工作 机器学习概述常见算法动手实践 深度学习基础框架应用领域 数学基础线性代数概率论和统计学微积分 编程基础Python基础数据处理工具 项目实战入门1. Scikit-learn 示例项目2. TensorFlow/Keras 入门项目3. Kaggle 入门竞赛 进阶1. PyTorch 官方教程2. MMDetect…...

汽车智能钥匙中PKE低频天线的作用

PKE&#xff08;Passive Keyless Entry&#xff09;即被动式无钥匙进入系统&#xff0c;汽车智能钥匙中PKE低频天线在现代汽车的智能功能和安全保障方面发挥着关键作用&#xff0c;以下是其具体作用&#xff1a; 信号交互与身份认证 低频信号接收&#xff1a;当车主靠近车辆时…...

Codepen和tailwindcss 进行UI布局展示

html <html lang"zh"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>设备管理仪表盘</title><script src"https://cdn.tailw…...

准备好了数据集之后,如何在ubuntu22.04上训练一个yolov8模型。

在Ubuntu 22.04上训练YOLOv8模型的步骤如下&#xff1a; 1. 安装依赖 首先&#xff0c;确保系统已安装Python和必要的库。 sudo apt update sudo apt install python3-pip python3-venv2. 创建虚拟环境 创建并激活虚拟环境&#xff1a; python3 -m venv yolov8_env source…...

集合框架、Collection、list、ArrayList、Set、HashSet和LinkedHashSet、判断两个对象是否相等

DAY7.1 Java核心基础 集合框架 Java 中很重要的一个知识点&#xff0c;实际开发中使用的频录较高&#xff0c;Java 程序中必备的模块 集合就是长度可以改变&#xff0c;可以保存任意数据类型的动态数组 最上层是一组接口&#xff0c;接下来是接口的实现类&#xff0c;第三层…...

宝塔 Linux 计划任务中添加运行项目网站PHP任务-定时任务

一、指定php版运行&#xff0c; cd /www/wwwroot/www.xxx.com/ && /www/server/php/56/bin/php think timedtasks start >> /tmp/timedtasks.log 2>&1 二、不指定php版 cd /www/wwwroot/www.xxx.com/ && php think timedtasks start >> …...

JDK ZOOKEEPER KAFKA安装

JDK17下载安装 mkdir -p /usr/local/develop cd /usr/local/develop 将下载的包上传服务器指定路径 解压文件 tar -zxvf jdk-17.0.14_linux-x64_bin.tar.gz -C /usr/local/develop/ 修改文件夹名 mv /usr/local/develop/jdk-17.0.14 /usr/local/develop/java17 配置环境变量…...

c++雅兰亭库 (yalantinglibs) 介绍及使用(序列化、json和结构体转换、协程

c雅兰亭库 (yalantinglibs) 介绍及使用(序列化、json和结构体转换、协程)-CSDN博客 雅兰亭库(yalantinglibs)介绍 雅兰亭库&#xff0c;名字很优雅&#xff0c;也很强大。它是阿里开源的一个现代C基础工具库的集合, 现在包括 struct_pack, struct_json, struct_xml, struct_yam…...

深度融合,智领未来丨zAIoT 全面集成 DeepSeek,助力企业迎接数据智能新时代

前言 Introduction 在数字化浪潮汹涌澎湃的当下&#xff0c;数据智能成为企业破局与创新的关键驱动力。zAIoT 作为云和恩墨面向 AIData 时代推出的数据智能平台软件&#xff0c;凭借其全面且强大的“采存算用”一体化功能体系&#xff0c;正在为航空航天、工业制造等领域和态势…...

类和对象—多态—案例2—制作饮品

案例描述&#xff1a; 制作饮品的大致流程为&#xff1a;煮水-冲泡-倒入杯中-加入辅料 利用多态技术实现本案例&#xff0c;提供抽象制作产品基类&#xff0c;提供子类制作咖啡和茶叶 思路解析&#xff1a; 1. 定义抽象基类 - 创建 AbstractDrinking 抽象类&#xff0c;该类…...

VSCode 配置优化指南:打造高效的 uni-app、Vue2/3、JS/TS 开发环境

VSCode 配置优化指南,适用于 uni-app、Vue2、Vue3、JavaScript、TypeScript 开发,包括插件推荐、设置优化、代码片段、调试配置等,确保你的开发体验更加流畅高效。 1. 安装 VSCode 如果你还未安装 VSCode,可前往 VSCode 官网 下载最新版并安装。 2. 安装推荐插件 (1) Vue…...

低代码平台的后端架构设计与核心技术解析

引言&#xff1a;低代码如何颠覆传统后端开发&#xff1f; 在传统开发模式下&#xff0c;一个简单用户管理系统的后端开发需要&#xff1a; 3天数据库设计5天REST API开发2天权限模块对接50个易出错的代码文件 而现代低代码平台通过可视化建模自动化生成&#xff0c;可将开发…...

Redis中多大的Key算热key,该如何解决

在 Redis 中&#xff0c;“热key” 是指频繁访问的 Redis 键。这些键通常会导致 Redis 服务器的性能下降&#xff0c;甚至可能导致 Redis 服务不可用。热key 的大小是相对的&#xff0c;通常来说&#xff0c;以下几个因素可能导致一个 Redis 键成为热key&#xff1a; 访问频率…...

机器学习数学基础:43.外生变量与内生变量

外生变量与内生变量&#xff1a;模型中的因果角色 在因果模型&#xff08;像结构方程模型、回归分析这类&#xff09;里&#xff0c;外生变量和内生变量是用来区分变量来源和相互关系的重要概念。下面从定义、实例、差异以及应用场景四个方面来详细介绍&#xff1a; 一、定义…...

单元测试与仿真程序之间的选择

为什么写这篇文章 现在的工作需求&#xff0c;让我有必要总结和整理一下。 凡事都有适用的场景。首先这里我需要提示一下&#xff0c;这里的信息&#xff0c;可能并不普适。 但是可以肯定一点的是&#xff0c;有些人&#xff0c;不论做事还是写书&#xff0c;上下文还没有交待…...

一周学会Flask3 Python Web开发-SQLAlchemy简介及安装

锋哥原创的Flask3 Python Web开发 Flask3视频教程&#xff1a; 2025版 Flask3 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili SQLAlchemy是Python编程语言下的一款开源软件。提供了SQL工具包及对象关系映射&#xff08;ORM&#xff09;工具&#xff0c;…...

【玩转正则表达式】正则表达式常用语法汇总

1. 基本字符 普通字符&#xff1a;匹配自身。例如&#xff0c;正则表达式hello匹配字符串中的“hello”。\d&#xff1a;匹配任何数字字符&#xff0c;相当于[0-9]。例如&#xff0c;\d\d\d匹配三个连续的数字。 示例&#xff1a;123、456 \w&#xff1a;匹配任何字母数字字符…...

django中序列化器serializer 的高级使用和需要注意的点

在 Django REST framework(DRF)中,序列化器(Serializer)是一个强大的工具,用于将复杂的数据类型(如 Django 模型实例)转换为 Python 原生数据类型,以便将其渲染为 JSON、XML 等格式,同时也能将接收到的外部数据反序列化为 Django 模型实例。以下将介绍序列化器的高级…...

如何下载安装 PyCharm?

李升伟 整理 一、下载 PyCharm 访问官网 打开 PyCharm 官网&#xff0c;点击 "Download" 按钮25。 版本选择&#xff1a; 社区版&#xff08;Community&#xff09;&#xff1a;免费使用&#xff0c;适合个人学习和基础开发。 专业版&#xff08;Professional&#…...

URL中的特殊字符与web安全

在现代Web应用中&#xff0c;URL作为客户端与服务器之间的通信桥梁&#xff0c;承载着大量的重要信息。URL中的特殊字符&#xff0c;看似只是一些常见的符号&#xff0c;但在Web安全领域&#xff0c;它们与其他安全知识密切相关&#xff0c;如在Base64编码、SQL注入&#xff0c…...

Golang学习笔记_41——观察者模式

Golang学习笔记_38——享元模式 Golang学习笔记_39——策略模式 Golang学习笔记_40——模版方法模式 文章目录 一、核心概念1. 定义2. 解决的问题3. 核心角色4. 类图 二、特点分析三、适用场景1. 股票价格监控系统2. 物联网设备状态监控3. 电商订单状态通知 四、Go语言实现示例…...

中原银行:从“小机+传统数据库”升级为“OceanBase+通用服务器”,30 +系统成功上线|OceanBase DB大咖说(十五)

OceanBase《DB 大咖说》第 15 期&#xff0c;我们邀请到了中原银行金融科技部数据团队负责人&#xff0c;吕春雷。本文为本期大咖说的精选。 吕春雷是一位资历深厚的数据库专家&#xff0c;从传统制造企业、IT企业、甲骨文公司到中原银行&#xff0c;他在数据库技术与运维管理…...

slam学习笔记9---ubuntu2004部署interactive_slam踩坑记录

背景&#xff1a;interactive_slam是一款可用于离线优化点云地图算法。部署安装容易出问题&#xff0c;这里记录一下。 一、安装基本流程 绝大部分跟着readme走&#xff0c;g2o安装使用apt安装 interactive_slam depends on the following libraries:GL3W GLFW Dear ImGui p…...

MVC模式全解析

MVC 模式&#xff1a;概念与架构基石 在软件开发的广袤宇宙中&#xff0c;MVC 模式宛如一颗璀璨的恒星&#xff0c;照亮了无数开发者前行的道路。它是一种经典的软件架构模式&#xff0c;全称为 Model - View - Controller&#xff0c;即模型 - 视图 - 控制器 &#xff0c;将应…...

游戏引擎学习第140天

回顾并为今天的内容做准备 目前代码的进展到了声音混音的部分。昨天我详细解释了声音的处理方式&#xff0c;声音在技术上是一个非常特别的存在&#xff0c;但在游戏中进行声音混音的需求其实相对简单明了&#xff0c;所以今天的任务应该不会太具挑战性。 今天我们会编写一个…...

LeetCode热题100JS(44/100)第八天|二叉树的直径|二叉树的层序遍历|将有序数组转换为二叉搜索树|验证二叉树搜索树|二叉搜索树中第K小的元素

543. 二叉树的直径 题目链接&#xff1a;543. 二叉树的直径 难度&#xff1a;简单 刷题状态&#xff1a;1刷 新知识&#xff1a; 解题过程 思考 示例 1&#xff1a; 输入&#xff1a;root [1,2,3,4,5] 输出&#xff1a;3 解释&#xff1a;3 &#xff0c;取路径 [4,2,1,3] 或…...

【虚拟化】Hyper-V 与 WSL 2

关于 Hyper-V 与 WSL 2 的简介 Hyper-V 是微软出的 Type-I 型 Hypervisor&#xff0c;根据微软官方说 WSL 2 用了 Hyper-V 架构的子集&#xff0c;称为虚拟机平台&#xff08;Virtual Machine Platform&#xff09;&#xff0c;是 Windows 中的一个可选组件&#xff0c;所以你…...

力扣刷题DAY6(滑动窗口/中等+栈/简单、中等)

一、滑动窗口 找到字符串中所有字母异位词 方法一&#xff1a;哈希表 class Solution { public:vector<int> findAnagrams(string s, string p) {vector<int> ans;unordered_map<char, int> target;for (int i 0; i < p.size(); i) {target[p[i]];}in…...

MySQL中的共享锁和排他锁

MySQL 中的锁可以从多个维度进行分类&#xff0c;其中从模式上可以分为共享锁&#xff08;Shared Lock&#xff0c;S Lock&#xff09;和 排他锁&#xff08;Exclusive Lock&#xff0c;X Lock&#xff09;。 共享锁&#xff08;Shared Lock&#xff0c;S Lock&#xff09; 共…...