低密度奇偶檢查碼

低密度奇偶檢查碼（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}$。