信息论与编码:线性分组码
线性分组码
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}\);否则返回译码错误,此时可以检测到错误,但无法纠正。