線性分組碼
1. 線性分組碼
分組碼:信息划分成固定長度\(k\)的分組,各個分組依次編碼。
\(\boldsymbol{u} = (u_0, \dots, u_{k-1})\)編碼為\(\boldsymbol{v} = (v_0, \dots, v_{n-1})\),其中\(n \gt k\),\(\boldsymbol{v}\)稱為碼字(codeword),碼字兩兩不同。
\((n, k)\)分組碼(block code):\(2^{k}\)個碼字構成的集合稱作一個\((n, k)\)分組碼。
編碼率(code rate):\(R = k / n\)
線性分組碼:設\(V\)是\(\text{GF}(2)\)上所有\(n\)元組構成的向量空間,若一個\((n, k)\)分組碼包含的\(2^{k}\)個碼字構成\(V\)的一個\(k\)維子空間,則稱之為線性分組碼。
1.1 生成矩陣和校驗矩陣
一個\((n, k)\)分組碼\(\mathcal{C}\)中有\(k\)個線性無關的碼字:\(\boldsymbol{g}_{0}, \dots, \boldsymbol{g}_{k-1}\),我們可以構造矩陣:
對於任何一個信息\(\boldsymbol{u} = (u_0, \dots, u_{k-1})\),其對應的碼字為\(\boldsymbol{v} = \boldsymbol{u} \cdot \bold{G}\)
\(\bold{G}\)稱為\(\mathcal{C}\)的生成矩陣(generator matrix),\(\mathcal{C}\)是\(\bold{G}\)的行空間。
\(\bold{G}\)的零空間(null space)是一個\(n - k\)維子空間,同時也是\(\mathcal{C}\)的對偶空間,用\(\mathcal{C}_d\)表示。\(\mathcal{C}_{d}\)本身也是一個線性分組碼,\(\mathcal{C}_{d}\)的生成矩陣為:
\(\bold{H}\)也稱作\(\mathcal{C}\)的校驗矩陣(parity matrix)。
線性系統分組碼:
如果分組線性碼的碼字可以分為兩個部分,前\(n - k\)比特為冗余比特(用於糾錯和檢錯),后\(k\)個比特是消息比特,與原始消息完全相同,則稱這種線性分組碼為線性系統分組碼(linear systematic block code)。
生成矩陣為:
\(\boldsymbol{u} = (u_{0}, \dots, u_{k-1})\),\(\boldsymbol{v} = \boldsymbol{u}\cdot \bold{G} = (v_{0}, \dots, v_{n-1})\),其中\((v_{0}, \dots, v_{n-k-1}) = \boldsymbol{u} \cdot \bold{P}\),\((v_{n-k}, \dots, v_{n-1}) = \boldsymbol{u}\)
任何一個生成矩陣\(\bold{G}'\)都可以通過先做行變換,再做列置換得到上述形式的\(\bold{G}\),稱\(\bold{G}\)是\(\bold{G}'\)的組合等價矩陣(combinatorially equivalent matrix),設\(\bold{G}'\)和\(\bold{G}\)對應的線性分組碼分別是\(\mathcal{C}\)和\(\mathcal{C}'\),稱\(\mathcal{C}'\)是\(\mathcal{C}\)的組合等價碼(combinatorially equivalent code)。
\(\bold{G}\)對應的校驗矩陣是\(\bold{H} = \begin{bmatrix}\bold{I}_{n-k}, \bold{P}^{T}\end{bmatrix}\)
1.2 線性分組碼的差錯檢測
\(\boldsymbol{v} = (v_{0}, \dots, v_{n-1})\):發送端的碼字
\(\boldsymbol{r} = (r_{0}, \dots, r_{n-1})\):接收端的“碼字”
\(\boldsymbol{e} = \boldsymbol{v} + \boldsymbol{r}\):差錯模式(error pattern),\(\boldsymbol{e}\)中\(1\)的位置就是發生差錯的位置,可能的非零差錯模式有\(2^{n}-1\)個。
\(\boldsymbol{s} = \boldsymbol{r} \cdot \bold{H}^{T} = \boldsymbol{e} \cdot \bold{H}^{T}\):syndrome
\(\boldsymbol{s} = \boldsymbol{0}\)當且僅當\(\boldsymbol{r} \in \mathcal{C}\),所以
- 若\(\boldsymbol{s} \neq \boldsymbol{0}\),\(\boldsymbol{r}\)不是碼字,傳輸過程必然發生了差錯
- 若\(\boldsymbol{s} = \boldsymbol{0}\),接收\(\boldsymbol{r}\)。實際上傳輸過程可能發生差錯也可能沒有發生差錯,如果發生差錯,即\(\boldsymbol{e} \neq \boldsymbol{0}\),則\(\boldsymbol{e}\)必定是一個非零的碼字。也就是說,發生差錯當且僅當\(\boldsymbol{e}\)等於某一個非零的碼字,這樣的\(\boldsymbol{e}\)一共有\(2^{k} - 1\)個,稱之為不可檢測差錯模式(undetectable error pattern)
1.3 線性分組碼的漢明重量、漢明距離
漢明重量(Hamming weight):\(\boldsymbol{v} = (v_0, \dots, v_{n-1})\)是\(\text{GF}(2)\)上的\(n\)元組,\(\boldsymbol{v}\)的重量\(w(\boldsymbol{v})\)定義為\(\boldsymbol{v}\)中\(1\)的數量
重量分布(weight distribution):\(\mathcal{C}\)是一個\((n, k)\)線性分組碼,對於\(0 \le i \le n\),令\(A_{i}\)是\(\mathcal{C}\)中漢明重量為\(i\)的碼字的數量,稱\(A_{0}, \dots, A_{n}\)是\(\mathcal{C}\)的重量分布
最小重量(minimum weight):\(w_{\min}(\mathcal{C}) = \min \left\{w(\boldsymbol{v}): \boldsymbol{v} \in \mathcal{C}, \boldsymbol{v} \neq \boldsymbol{0}\right\}\)
對於一個離散無記憶的二元對稱信道,假設單個比特的差錯概率是\(p\),出現不可檢測差錯模式的概率是:
所以重量分布唯一決定了出現不可檢測差錯模式的概率,也就是線性分組碼本身決定了這一概率。
漢明距離(Hamming distance):\(\boldsymbol{u}, \boldsymbol{v}\)是\(\text{GF}(2)\)上的\(n\)元組,\(\boldsymbol{u}, \boldsymbol{v}\)之間的距離\(d(\boldsymbol{u}, \boldsymbol{v})\)定義為\(\boldsymbol{u}\)和\(\boldsymbol{v}\)上不同的位置的數量,\(d(\boldsymbol{u}, \boldsymbol{v}) = w(\boldsymbol{u} + \boldsymbol{v})\)
漢明距離滿足三角不等式。
最小距離(minimum distance):\(d_{\min}(\mathcal{C}) = \min\left\{d(\boldsymbol{v}, \boldsymbol{w}): \boldsymbol{v}, \boldsymbol{w} \in \mathcal{C}, \boldsymbol{v} \neq \boldsymbol{w} \right\}\)
最小距離等於最小重量:
\(\mathcal{C}\)的重量分布與\(\mathcal{C}\)的校驗矩陣\(\bold{H}\)的關系:
定理:\(\mathcal{C}\)是一個\((n, k)\)線性分組碼,其校驗矩陣是\(\bold{H}\)。若\(\mathcal{C}\)中存在重量為\(i\)的碼字,則\(\bold{H}\)中存在\(i\)列,它們的和為\(\bold{0}\);若\(\bold{H}\)中存在\(i\)列,它們的和為\(\bold{0}\),則\(\mathcal{C}\)中存在重量為\(i\)的碼字。
定理:\(\mathcal{C}\)是一個\((n, k)\)線性分組碼,其校驗矩陣是\(\bold{H}\)。\(\mathcal{C}\)的最小重量等於\(\bold{H}\)中最小的滿足和為\(\bold{0}\)的列的數量。
定理:\(\mathcal{C}\)是一個\((n, k)\)線性分組碼,其校驗矩陣是\(\bold{H}\)。若\(\bold{H}\)中不存在\(d-1\)或更少的列,使得這些列的和為\(\bold{0}\),則\(\mathcal{C}\)的最小重量至少是\(d\)。
第三個定理給出了線性分組碼的最小重量的一個下界。
\(\mathcal{C}\)是一個線性分組碼,對於任意的\(\boldsymbol{v} \in \mathcal{C}\),\(\mathcal{C} + \boldsymbol{v} = \left\{\boldsymbol{u} + \boldsymbol{v}: \boldsymbol{u} \in \mathcal{C} \right\} = \mathcal{C}\),所以\(\mathcal{C}\)的重量分布也是關於\(\mathcal{C}\)中任意一個碼字的距離的分布。
檢錯能力:線性分組碼\(\mathcal{C}\)的最小距離是\(d_{\min}(\mathcal{C})\),差錯數量小於\(d_{\min}(\mathcal{C})\)的差錯模式\(\boldsymbol{e}\)保證可以被檢測出來,差錯數量大於或等於\(d_{\min}(\mathcal{C})\)的差錯模式\(\boldsymbol{e}\)不保證被檢測出來,所以稱\(d_{\min}(\mathcal{C}) - 1\)是\(\mathcal{C}\)的檢錯能力(error-detecting capability)。
保證被檢測出來的非零差錯模式的數量是:
1.4 線性分組碼的譯碼
對於一個\((n,k)\)線性分組碼\(\mathcal{C}\),在譯碼端接收到的\(n\)元組\(\boldsymbol{r}\)有\(2^{n}\)種(即\(\text{GF}(2)\)上的所有\(n\)元組中構成的向量空間\(V\)的大小),而\(\mathcal{C}\)中的碼字只有\(2^{k}\)個,所以譯碼就是將\(V\)划分成\(2^{k}\)個部分,每個部分包含恰好一個碼字。
下面是一種代數譯碼方案:
- 構造一個\(2^{n-k} \times 2^{k}\)的二維陣列(array)
- 將\(2^{k}\)個碼字\(\boldsymbol{v}_{0}, \cdots, \boldsymbol{v}_{2^{k}-1}\)填入第\(0\)行,其中\(\boldsymbol{v}_{0} = \boldsymbol{0}\)
- 對於\(1 \le j \lt 2^{n-k}\),任意選擇一個沒有在第\(0\)到\(j-1\)行出現過的\(\boldsymbol{e}_{j} \in V\),在第\(j\)行的各個位置填入\(\boldsymbol{e}_j + \boldsymbol{v}_{i}\)
下圖展示了這個二維陣列的構成:
這樣得到的二維陣列稱為\(\mathcal{C}\)的標准陣列(standard array),每一行都是\(\mathcal{C}\)的一個陪集,\(\boldsymbol{e}_{j}\)是第\(j\)行的陪集首(coset leader)。標准陣列滿足以下性質:
- 每一行的任何兩個向量的和都是一個碼字
- \(V\)中的每個向量都在標准陣列中出現恰好一次
- 每一行的向量都具有相同的syndrome
- 不同行的syndrome不同
標准陣列的\(2^{k}\)列是\(V\)的一個划分,每個部分恰好有一個碼字,當接收到\(\boldsymbol{r}\)時,若\(\boldsymbol{r}\)在第\(i\)列,則將其譯碼為\(\boldsymbol{v}_{i}\)。
對於一個碼字\(\boldsymbol{v}_{i}\):
- 若差錯模式為某一個陪集首\(\boldsymbol{e}_{j}\),則\(\boldsymbol{r}\)在第\(i\)列
- 若差錯模式不是陪集首,則\(\boldsymbol{r}\)不在第\(i\)列
所以,使用標准陣列譯碼,譯碼正確當且僅當差錯模式是一個陪集首。
為了減少譯碼錯誤的概率,陪集首應該選擇最可能出現的差錯模式。對於離散無記憶的二元對稱信道,差錯模式的重量越小,出現的概率越大,所以,在構建標准陣列時,每次選擇陪集首,都從\(V\)中剩下的\(n\)元組中選擇重量最小的,這樣得到的標准陣列稱為最優標准陣列(optimal standard array),基於最優標准陣列的譯碼是最小距離譯碼。
糾錯能力:
對於線性分組碼\(\mathcal{C}\),令\(t = \lfloor(d_{\min}(\mathcal{C}) - 1) / 2\rfloor\)。對於一個最優標准陣列,所有重量小於或等於\(t\)的\(n\)元組都會被選作陪集首,且至少有一個重量為\(t+1\)的\(n\)元組不能稱為陪集首。所以,所有差錯數量小於或等於\(t\)的差錯模式都能被糾正,差錯大於\(t\)的錯誤不保證能糾正,我們稱\(t\)是\(\mathcal{C}\)的糾錯能力(error-correction capability)
伴隨式譯碼(syndrome decoding):
得到標准矩陣后,僅保留一個\(2^{n-k} \times 2\)的陣列,第一列是各個陪集首,第二列是各個陪集首對應的syndrome。接收到\(\boldsymbol{r}\)后,譯碼過程為:
- 計算\(\boldsymbol{s} = \boldsymbol{r} \cdot \bold{H}^{T}\)
- 遍歷陪集首,找到滿足syndrome等於\(\boldsymbol{s}\)的\(\boldsymbol{e}\)
- 將\(\boldsymbol{s}\)譯碼為\(\boldsymbol{r} = \boldsymbol{s} + \boldsymbol{e}\)
若只考慮重量小於\(t\)的差錯模式,則維護的表的大小為:
譯碼過程為:
- 計算\(\boldsymbol{s} = \boldsymbol{r} \cdot \bold{H}^{T}\)
- 遍歷陪集首,找滿足syndrome等於\(\boldsymbol{s}\)的\(\boldsymbol{e}\)。若能找到,則譯碼為\(\boldsymbol{r} = \boldsymbol{s} + \boldsymbol{e}\);否則返回譯碼錯誤,此時可以檢測到錯誤,但無法糾正。
