低密度奇偶检查码

低密度奇偶检查码（Low-density parity-check code，LDPC code），是线性分组码（linear block code）的一种，用于更正传输过程中发生错误的编码方式。

## 历史

在1962年，低密度奇偶检查码(LDPC code)即被罗伯特·加拉格提出，并被证明其错误校正能力非常接近理论最大值，香农极限。但受限于当时技术，低密度奇偶检查码并无法实作。近年，低密度奇偶检查码被重新发现，并随着积体电路的技术演进，低密度奇偶检查码的实作逐渐可行，而成为各种先进通讯系统的信道编码标准。

## 运作

低密度奇偶检查码是基于具有稀疏矩阵性质的奇偶检验矩阵建构而成。对(n, k)的低密度奇偶检查码而言，每k位元资料会使用n位元的码字(codeword)编码。以下是一个被(16, 8)的低密度奇偶检查码使用的奇偶检验矩阵H。当中可以见得矩阵内的元素1数量远少于元素0数量，所以具有稀疏矩阵性质，也就是低密度的由来。

$$H = \left[ \begin{matrix} <pre> 1 & 1 & 1 & 1 & 0 & 0 & 0 & 0 & 0 & 0\\ 0 & 0 & 0 & 0 & 1 & 1 & 1 & 1 & 0 & 0\\ 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 1 & 1\\ 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0\\ 1 & 0 & 0 & 0 & 0 & 0 & 0 & 1 & 0 & 0\\ 0 & 1 & 0 & 0 & 1 & 0 & 0 & 0 & 0 & 0\\ 0 & 0 & 1 & 0 & 0 & 1 & 0 & 0 & 1 & 0\\ 0 & 0 & 0 & 1 & 0 & 0 & 1 & 0 & 0 & 1 </pre> \end{matrix}\quad\! \begin{matrix} <pre> 0 & 0 & 0 & 0 & 0 & 0\\ 0 & 0 & 0 & 0 & 0 & 0\\ 1 & 1 & 0 & 0 & 0 & 0\\ 0 & 0 & 1 & 1 & 1 & 1\\ 1 & 0 & 0 & 1 & 0 & 0\\ 0 & 1 & 0 & 0 & 1 & 0\\ 0 & 0 & 0 & 0 & 0 & 1\\ 0 & 0 & 1 & 0 & 0 & 0 </pre> \end{matrix} \right]$$

### 解码

低密度奇偶检查码的解码，可对应成二分图(bipartite graph)作表示。下方的二分图是依照上述奇偶检验矩阵H建置，其中H的行(row)对应至check node，而H的列(column)对应至bit node。check node和bit node之间的连线，由H内的元素1决定；好比H中第一行(row)和第一列(column)的元素1，使check node和bit node两者各自最左侧的第一个彼此连接。

<image>

低密度奇偶检查码的解码算法，主要基于有迭代性(iterative)的置信传播(belief propagation)；整个解码流程如下方所示：

<image>

- 当接收资料R从通讯频道(channel)进入低密度奇偶检查码的解码器，解码器会对讯息作初始化(initialization)。
- check node根据互相连接的多个bit node内的资料做更新运算(update)。
- bit node对相连接的多个check node内的资料做更新运算。
- 观察终止(termination)条件，来决定是否继续迭代计算。

详细的解码算法，常见有两种：总和-乘积算法(Sum-Product Algorithm)和最小值-总和算法(Min-Sum Algorithm)。总和-乘积算法具有较佳的错误更正能力，却具较高的计算复杂度；反之，最小值-总和算法在稍微减低的错误更正能力下，换取较低的计算复杂度。

#### 总和-乘积算法

假设在一通讯系统的频道有AWGN属性，而传送讯号为$\mathbf{U} \left ( u_1, u_2, \dots , u_n\right )$，接收讯号是$\mathbf{Y} \left ( y_1, y_2, \dots , y_n\right )$，bit node有n个，check node有m个。而总和-乘积算法在解码流程如下：

- 初始化：假设AWGN的方差(variance)是$\sigma^2$。

$\lambda_{n \to m} \left(u_n\right ) = \log\frac{P(u_n = 0/y_n)}{P(u_n = 1/y_n)} = \frac{2y_n}{\sigma^2}$。

$\Lambda_{m \to n} \left(u_n\right ) = 0$。

$\Lambda_{m \to n} \left(u_n\right ) = 2\tanh^{-1}\left \{\prod_{n'\in N\left( m \right )\backslash n} \tanh\left [\frac{\lambda_{n' \to m}\left(u_{n'}\right )}{2}\right ]\right \}$。

其中$n'\in N\left( m \right )\backslash n$是连接到check node m的bit node组合，但不包含第n个bit node。

$\lambda_{n \to m} \left(u_n\right ) = \frac{2y_n}{\sigma^2} + \sum_{m'\in M\left( n \right )\backslash m} \Lambda_{m' \to n} \left(u_n\right )$；其中$m'\in M\left( n \right )\backslash m$是连接到bit node n的check node组合，但不包含第m个check node。

- 解码位元计算：假设解码后讯号为$\hat{\mathbf{U}} \left ( \hat u_1, \hat u_2, \dots , \hat u_n\right )$。Hard-decision解码位元可由下列两式求出：

$\lambda_n \left(u_n\right ) = \frac{2y_n}{\sigma^2} + \sum_{m\in M\left( n \right )} \Lambda_{m \to n} \left(u_n\right )$ $\hat u_i = \begin{cases} 0, & \mbox{if } \lambda_i \left ( u_i\right )\ge 0 ~ \forall i \in \left \{ 1, 2, \dots, n\right \}\\ 1, & \mbox{if } \lambda_i \left ( u_i\right )\le 0 ~ \forall i \in \left \{ 1, 2, \dots, n\right \} \end{cases}$

- 只要解码后的码字$\mathbf{v}$在恒等式$\mathbf{H}\mathbf{v}^T=0$成立，即终止迭代计算。

#### 最小值-总和算法

最小值-总和演算，大至和总和-乘积算法类似，除了于“check node更新”做不一样的计算方式。而改变的计算式如下：

$\sigma_m = \mathrm{XOR} \left \{ \sgn \left ( \lambda_{n' \to m} \right )|n'\in N\left( m \right )\backslash n\right \}$。

$\mu_{m, \min} = \min \left \{ | \lambda_{n' \to m}| |n'\in N\left( m \right )\backslash n\right \}$。

$\Lambda_{m \to n} \left ( u_n\right ) = \sigma_m \cdot \mu_{m, \min}$。