极大似然解码器
对于任意(非线性、线性)编码 C ⊆ Σ n \mathscr C \subseteq \Sigma^n C⊆Σn,
- 输入接收到的字 y ∈ Σ n y \in \Sigma^n y∈Σn,任取码字 c ∈ C c \in \mathscr C c∈C,计算汉明距离 d ← d i s t ( c , y ) ) d \leftarrow dist(c,y)) d←dist(c,y)),令 z ← c z \leftarrow c z←c
- 对于
C
\mathscr C
C中所有的码字
c
′
≠
c
c' \neq c
c′=c
- 计算 d ′ ← d i s t ( c ′ , y ) d' \leftarrow dist(c',y) d′←dist(c′,y)
- 如果 d ′ < d d'<d d′<d,那么令 z ← c ′ z \leftarrow c' z←c′,且记录 d ← d ′ d \leftarrow d' d←d′
- 输出 z ∈ C z \in \mathscr C z∈C
线性码解码器
对于任意 ( n , k , d ) (n,k,d) (n,k,d)线性码 C ⊆ G F ( q ) n \mathscr C \subseteq GF(q)^n C⊆GF(q)n,校验矩阵为 H H H,令 t = ⌊ ( d − 1 ) / 2 ⌋ t=\lfloor(d-1)/2\rfloor t=⌊(d−1)/2⌋
- 输入接收到的字 y ∈ G F ( q ) n y \in GF(q)^n y∈GF(q)n
- 对于
i
=
0
,
⋯
,
t
i=0,\cdots,t
i=0,⋯,t,执行
- 遍历错误位置
S
⊆
[
n
]
,
∣
S
∣
=
i
S \subseteq [n],|S|=i
S⊆[n],∣S∣=i,执行
- 遍历错误
e
∈
G
F
(
q
)
n
e \in GF(q)^n
e∈GF(q)n,满足汉明重量
w
t
(
e
S
)
=
i
wt(e_S)=i
wt(eS)=i
- 如果 ( y − e ) ⋅ H T = 0 (y-e) \cdot H^T = 0 (y−e)⋅HT=0,那么输出 y − e ∈ C y-e \in \mathscr C y−e∈C
- 遍历错误
e
∈
G
F
(
q
)
n
e \in GF(q)^n
e∈GF(q)n,满足汉明重量
w
t
(
e
S
)
=
i
wt(e_S)=i
wt(eS)=i
- 遍历错误位置
S
⊆
[
n
]
,
∣
S
∣
=
i
S \subseteq [n],|S|=i
S⊆[n],∣S∣=i,执行
- 输出 F a i l Fail Fail
这其实也是极大似然法,从 i = 0 , ⋯ , t i=0,\cdots,t i=0,⋯,t依次测试,输出的是汉明距离最近的(其实也是半径 t t t的汉明球内唯一的)码字。由于 t = ⌊ ( d − 1 ) / 2 ⌋ t=\lfloor(d-1)/2\rfloor t=⌊(d−1)/2⌋,因此输出 F a i l Fail Fail时,字 y y y与多个码字的距离一样大。
对于汉明重量至多为 t t t的错误 e 1 ≠ e 2 e_1 \neq e_2 e1=e2,计算校验子 s 1 = e 1 H T s_1 = e_1H^T s1=e1HT和 s 2 = e 2 H T s_2 = e_2H^T s2=e2HT,假设 s 1 = s 2 s_1=s_2 s1=s2,那么 ( e 1 − e 2 ) H T = 0 (e_1-e_2)H^T=0 (e1−e2)HT=0,从而 e 1 − e 2 ∈ C e_1-e_2 \in \mathscr C e1−e2∈C,这与 d m i n ≥ 2 t + 1 d_{min} \ge 2t+1 dmin≥2t+1矛盾。因此,任意可纠正的错误图样 e e e,都一一对应于某个校验子的值。我们有第二种解码算法:
- 构造预计算表,里面的字典元素是键值对 { s = e H T : e } \{s=eH^T:e\} {s=eHT:e}
- 输入接收到的字 y ∈ G F ( q ) n y \in GF(q)^n y∈GF(q)n,计算 s ← y H T s \leftarrow yH^T s←yHT
- 查表,如果存在键值 s s s,对应的错误图样为 e e e,输出 y − e ∈ C y-e \in \mathscr C y−e∈C;否则输出 F a i l Fail Fail
循环码解码器
对于任意 ( n , k , d ) (n,k,d) (n,k,d)循环码 C ⊆ G F ( q ) n \mathscr C \subseteq GF(q)^n C⊆GF(q)n,生成多项式为 g ( x ) g(x) g(x),校验多项式为 h ( x ) h(x) h(x),令 t = ⌊ ( d − 1 ) / 2 ⌋ t=\lfloor(d-1)/2\rfloor t=⌊(d−1)/2⌋
- 输入接收到的字 y ∈ G F ( q ) n y \in GF(q)^n y∈GF(q)n,计算 Y = N T T ( y ) Y=NTT(y) Y=NTT(y), H = N T T ( h ) H=NTT(h) H=NTT(h)
- 对于
i
=
0
,
⋯
,
t
i=0,\cdots,t
i=0,⋯,t,执行
- 遍历错误位置
S
⊆
[
n
]
,
∣
S
∣
=
i
S \subseteq [n],|S|=i
S⊆[n],∣S∣=i,执行
- 遍历错误
e
∈
G
F
(
q
)
n
e \in GF(q)^n
e∈GF(q)n,满足汉明重量
w
t
(
e
S
)
=
i
wt(e_S)=i
wt(eS)=i
- 如果 ( Y − N T T ( e ) ) ⋅ H = 0 n (Y-NTT(e)) \cdot H = 0^n (Y−NTT(e))⋅H=0n,那么输出 y − e ∈ C y-e \in \mathscr C y−e∈C
- 遍历错误
e
∈
G
F
(
q
)
n
e \in GF(q)^n
e∈GF(q)n,满足汉明重量
w
t
(
e
S
)
=
i
wt(e_S)=i
wt(eS)=i
- 遍历错误位置
S
⊆
[
n
]
,
∣
S
∣
=
i
S \subseteq [n],|S|=i
S⊆[n],∣S∣=i,执行
- 输出 F a i l Fail Fail
这就是线性码解码器的变体,只不过可以通过多项式卷积来判断它是否是个码字。
同样的,第二种解码算法:
- 构造预计算表,里面的字典元素是键值对 { s ( x ) = R g ( x ) [ e ( x ) ] : e ( x ) } \{s(x)=R_{g(x)}[e(x)]:e(x)\} {s(x)=Rg(x)[e(x)]:e(x)}
- 输入接收到的字 y ∈ G F ( q ) n y \in GF(q)^n y∈GF(q)n,计算 s ( x ) ← R g ( x ) [ y ( x ) ] s(x) \leftarrow R_{g(x)}[y(x)] s(x)←Rg(x)[y(x)]
- 查表,如果存在键值 s ( x ) s(x) s(x),对应的错误图样为 e ( x ) e(x) e(x),输出 y − e ∈ C y-e \in \mathscr C y−e∈C;否则输出 F a i l Fail Fail
BCH码的PGZ解码器
对于设计距离为 d = 2 t + 1 d=2t+1 d=2t+1的BCH码 C ⊆ G F ( q ) n \mathscr C \subseteq GF(q)^n C⊆GF(q)n,选取 n n n次单位根 w w w
一个错误多项式可以写作:
e
(
x
)
=
∑
i
=
0
n
−
1
e
i
x
i
e(x) = \sum_{i=0}^{n-1} e_i x^i
e(x)=∑i=0n−1eixi,其中有至多
t
t
t个系数非零。假设有
0
≤
v
≤
t
0 \le v \le t
0≤v≤t个位置发生错误,将它们记做
i
1
,
⋯
,
i
v
i_1,\cdots,i_v
i1,⋯,iv,那么
e
(
x
)
=
e
i
1
x
i
1
+
⋯
+
e
i
v
x
i
v
e(x) = e_{i_1}x^{i_1}+\cdots+e_{i_v}x^{i_v}
e(x)=ei1xi1+⋯+eivxiv
其中
e
i
l
∈
G
F
(
q
)
e_{i_l} \in GF(q)
eil∈GF(q)是位置
i
l
i_l
il处的错误大小。
不失一般性地,令
j
0
=
1
j_0=1
j0=1,那么BCH码的根为
w
,
w
2
,
⋯
,
w
2
t
w,w^2,\cdots,w^{2t}
w,w2,⋯,w2t,计算字
c
(
x
)
+
e
(
x
)
c(x)+e(x)
c(x)+e(x)的频域校验子(frequency-domain syndromes),
S
j
=
c
(
w
j
)
+
e
(
w
j
)
=
e
(
w
j
)
S_j = c(w^j)+e(w^j) = e(w^j)
Sj=c(wj)+e(wj)=e(wj)
那么
S
j
=
e
i
1
w
j
i
1
+
⋯
+
e
i
v
w
j
i
v
,
j
=
1
,
⋯
,
2
t
S_j = e_{i_1}w^{ji_1}+\cdots+e_{i_v}w^{ji_v},\, j=1,\cdots,2t
Sj=ei1wji1+⋯+eivwjiv,j=1,⋯,2t
简记错误值
Y
l
=
e
i
l
Y_l = e_{i_l}
Yl=eil(error-value),错误位置
X
l
=
w
i
l
X_l = w^{i_l}
Xl=wil(error-location),就化为了关于
2
v
2v
2v个未知元的
2
t
2t
2t个非线性方程:
S
1
=
Y
1
X
1
+
Y
2
X
2
+
⋯
+
Y
v
X
v
S
2
=
Y
1
X
1
2
+
Y
2
X
2
2
+
⋯
+
Y
v
X
v
2
⋮
S
2
t
=
Y
1
X
1
2
t
+
Y
2
X
2
2
t
+
⋯
+
Y
v
X
v
2
t
\begin{aligned} S_1 &= Y_1X_1 + Y_2X_2 + \cdots + Y_vX_v\\ S_2 &= Y_1X_1^2 + Y_2X_2^2 + \cdots + Y_vX_v^2\\ &\vdots\\ S_{2t} &= Y_1X_1^{2t} + Y_2X_2^{2t} + \cdots + Y_vX_v^{2t}\\ \end{aligned}
S1S2S2t=Y1X1+Y2X2+⋯+YvXv=Y1X12+Y2X22+⋯+YvXv2⋮=Y1X12t+Y2X22t+⋯+YvXv2t
上述非线性方程组难以直接求解,我们首先计算错误定位器(error-locator),
Λ
(
x
)
=
(
1
−
x
X
1
)
(
1
−
x
X
2
)
⋯
(
1
−
x
X
v
)
=
1
+
∑
i
=
1
v
Λ
i
x
i
\begin{aligned} \Lambda(x) &= (1-xX_1)(1-xX_2)\cdots(1-xX_v)\\ &= 1+ \sum_{i=1}^v \Lambda_i x^i \end{aligned}
Λ(x)=(1−xX1)(1−xX2)⋯(1−xXv)=1+i=1∑vΛixi
一旦我们知道了它的系数
Λ
i
\Lambda_i
Λi,我们就可以计算出它的零点
X
l
−
1
,
l
=
1
,
⋯
,
v
X_l^{-1},l=1,\cdots,v
Xl−1,l=1,⋯,v,从而得到错误位置
X
l
X_l
Xl的值!
对于 l = 1 , ⋯ , v l=1,\cdots,v l=1,⋯,v,计算
Y l X l j + v ⋅ Λ ( X l − 1 ) = Y l ( X l j + v + Λ 1 X l j + v − 1 + ⋯ + Λ v X l j ) = 0 Y_lX_l^{j+v} \cdot \Lambda(X_l^{-1}) = Y_l(X_l^{j+v} + \Lambda_1 X_l^{j+v-1} + \cdots + \Lambda_v X_l^{j}) =0 YlXlj+v⋅Λ(Xl−1)=Yl(Xlj+v+Λ1Xlj+v−1+⋯+ΛvXlj)=0
相加得到
0 = ∑ l = 1 v Y l X l j + v + Λ 1 ∑ l = 1 v Y l X l j + v − 1 + ⋯ + Λ v ∑ l = 1 v Y l X l j = S j + v + Λ 1 S j + v − 1 + ⋯ + Λ v S j \begin{aligned} 0 &= \sum_{l=1}^v Y_lX_l^{j+v} + \Lambda_1\sum_{l=1}^v Y_lX_l^{j+v-1} +\cdots+ \Lambda_v\sum_{l=1}^v Y_lX_l^{j}\\ &= S_{j+v} + \Lambda_1S_{j+v-1} + \cdots + \Lambda_vS_{j} \end{aligned} 0=l=1∑vYlXlj+v+Λ1l=1∑vYlXlj+v−1+⋯+Λvl=1∑vYlXlj=Sj+v+Λ1Sj+v−1+⋯+ΛvSj
由于频域校验子 S j , j = 1 , ⋯ , 2 t S_j,j=1,\cdots,2t Sj,j=1,⋯,2t容易计算,我们就得到了非齐次线性方程组:
[ S 1 S 2 ⋯ S v S 2 S 3 ⋯ S v + 1 ⋮ S v S v + 1 ⋯ S 2 v − 1 ] ⋅ [ Λ v Λ v − 1 ⋮ Λ 1 ] = [ − S v + 1 − S v + 2 ⋮ − S 2 v ] \begin{bmatrix} S_1 & S_2 & \cdots & S_v\\ S_2 & S_3 & \cdots & S_{v+1}\\ \vdots\\ S_v & S_{v+1} & \cdots & S_{2v-1}\\ \end{bmatrix} \cdot \begin{bmatrix} \Lambda_v\\ \Lambda_{v-1}\\ \vdots\\ \Lambda_1\\ \end{bmatrix} = \begin{bmatrix} -S_{v+1}\\ -S_{v+2}\\ \vdots\\ -S_{2v}\\ \end{bmatrix} S1S2⋮SvS2S3Sv+1⋯⋯⋯SvSv+1S2v−1 ⋅ ΛvΛv−1⋮Λ1 = −Sv+1−Sv+2⋮−S2v
定理:假设 e ( x ) e(x) e(x)的汉明重量为 v v v,计算校验子方阵
M u = [ S 1 S 2 ⋯ S u S 2 S 3 ⋯ S u + 1 ⋮ S u S u + 1 ⋯ S 2 u − 1 ] M_u = \begin{bmatrix} S_1 & S_2 & \cdots & S_u\\ S_2 & S_3 & \cdots & S_{u+1}\\ \vdots\\ S_u & S_{u+1} & \cdots & S_{2u-1}\\ \end{bmatrix} Mu= S1S2⋮SuS2S3Su+1⋯⋯⋯SuSu+1S2u−1
如果 u = v u=v u=v,那么它是非奇异的;如果 u > v u>v u>v,那么它是奇异的。
Peterson algorithm:
- 输入字 c ( x ) + e ( x ) c(x)+e(x) c(x)+e(x),计算频域校验子 S j = e ( w j ) , j = 1 , ⋯ , 2 t S_j = e(w^j),j=1,\cdots,2t Sj=e(wj),j=1,⋯,2t
- 对于 u = t , t − 1 , ⋯ u=t,t-1,\cdots u=t,t−1,⋯,依次计算 d e t ( M u ) det(M_u) det(Mu),直到 d e t ( u ) ≠ 0 det(u)\neq 0 det(u)=0,于是我们找到了错误的汉明重量 v = u v=u v=u
- 计算 M v M_v Mv的逆矩阵,求解线性方程组得到错误定位器 Λ ( x ) \Lambda(x) Λ(x)的系数 Λ 1 , ⋯ , Λ v \Lambda_1,\cdots,\Lambda_v Λ1,⋯,Λv
- 计算 Λ ( x ) \Lambda(x) Λ(x)的零点 X l − 1 , l = 1 , ⋯ , v X_l^{-1},l=1,\cdots,v Xl−1,l=1,⋯,v,从而得到错误位置 X l = w w i l X_l=w^{w^{i_l}} Xl=wwil的值
于是,我们便把非线性方程组化为了关于 Y 1 , ⋯ , Y v Y_1,\cdots,Y_v Y1,⋯,Yv的线性方程组:
[ X 1 X 2 ⋯ X v X 1 2 X 2 2 ⋯ X v 2 ⋮ X 1 2 t X 2 2 t ⋯ X v 2 t ] ⋅ [ Y 1 Y 2 ⋮ Y v ] = [ S 1 S 2 ⋮ S 2 t ] \begin{bmatrix} X_1 & X_2 & \cdots & X_v\\ X_1^2 & X_2^2 & \cdots & X_v^2\\ \vdots\\ X_1^{2t} & X_2^{2t} & \cdots & X_v^{2t}\\ \end{bmatrix} \cdot \begin{bmatrix} Y_1\\ Y_2\\ \vdots\\ Y_v\\ \end{bmatrix} = \begin{bmatrix} S_{1}\\ S_{2}\\ \vdots\\ S_{2t}\\ \end{bmatrix} X1X12⋮X12tX2X22X22t⋯⋯⋯XvXv2Xv2t ⋅ Y1Y2⋮Yv = S1S2⋮S2t
且因为 X 1 , ⋯ , X v X_1,\cdots,X_v X1,⋯,Xv是不同的非零值,所以范德蒙矩阵(Vandermonde matrix)的行列式非零,
d e t [ 1 1 ⋯ 1 X 1 X 2 ⋯ X v X 1 2 X 2 2 ⋯ X v 2 ⋮ X 1 v − 1 X 2 v − 1 ⋯ X v v − 1 ] ≠ 0 det \begin{bmatrix} 1 & 1 & \cdots & 1\\ X_1 & X_2 & \cdots & X_v\\ X_1^2 & X_2^2 & \cdots & X_v^2\\ \vdots\\ X_1^{v-1} & X_2^{v-1} & \cdots & X_v^{v-1}\\ \end{bmatrix} \neq 0 det 1X1X12⋮X1v−11X2X22X2v−1⋯⋯⋯⋯1XvXv2Xvv−1 =0
于是只需前 v v v行,就可以计算出错误规模 Y 1 , ⋯ , Y v Y_1,\cdots,Y_v Y1,⋯,Yv的唯一值。
Gorenstein–Zierler algorithm:
- 输入字 c ( x ) + e ( x ) c(x)+e(x) c(x)+e(x),计算频域校验子 S j = e ( w j ) , j = 1 , ⋯ , 2 t S_j = e(w^j),j=1,\cdots,2t Sj=e(wj),j=1,⋯,2t
- 根据 Peterson algorithm 计算得到的错误位置 X = [ X 1 , ⋯ , X v ] ∈ G F ( q ) v X=[X_1,\cdots,X_v] \in GF(q)^v X=[X1,⋯,Xv]∈GF(q)v的值,由向量 X X X计算其他向量 X 2 , ⋯ , X v X^2,\cdots,X^v X2,⋯,Xv,构建方阵 [ X , X 2 , ⋯ , X v ] T [X,X^2,\cdots,X^v]^T [X,X2,⋯,Xv]T
- 计算上述方阵的逆矩阵,求解线性方程组得到错误值 Y 1 , ⋯ , Y v Y_1,\cdots,Y_v Y1,⋯,Yv
- 根据 X i X_i Xi和 Y j Y_j Yj,恢复出 e ( x ) e(x) e(x),从而输出码字 c ( x ) ∈ C c(x) \in \mathscr C c(x)∈C
虽然在分析中选取了 j 0 = 1 j_0=1 j0=1,但上述算法对于任意的 j 0 j_0 j0都有效。
在Peterson algorithm中,可以先计算 r a n k ( M t ) rank(M_t) rank(Mt),由于 ∣ M v ∣ |M_v| ∣Mv∣是 ∣ M t ∣ |M_t| ∣Mt∣的余子式,因此 v ≤ r a n k ( M t ) v \le rank(M_t) v≤rank(Mt),对于 u > r a n k ( M t ) u>rank(M_t) u>rank(Mt)的 d e t ( M u ) det(M_u) det(Mu)不必挨个测试。对于 Λ ( x ) \Lambda(x) Λ(x)的零点,方法是遍历所有的 n n n个可能的 w j w^j wj,利用 Horner’s rule 依次计算 Λ ( w j ) = 0 \Lambda(w^j)=0 Λ(wj)=0是否成立,复杂度 O ( n v ) O(nv) O(nv)。也可以使用NTT变换,根据频域分量是否为 0 ∈ G F ( q m ) 0 \in GF(q^m) 0∈GF(qm)来确定零点。