BCH码
维基百科,自由的百科全书
BCH 码取自 Bose、Ray-Chaudhuri 与 Hocquenghem 的缩写,是编码理论尤其是纠错码中研究得比较多的一种编码方法。用技术的术语来说,BCH 码是用于校正多个随机错误模式的多级、循环、错误校正、变长数字编码。BCH 码也可以用于质数级或者质数的幂级的多级相移键控。11 级的 BCH 码已经用于表示 10 进制数外加一个符号位。
目录 |
[编辑] 构建
BCH 码使用有限域上的域論与多项式。为了检测错误可以构建一个检测多项式,这样接收端就可以检测是否有错误发生。
The BCH code with designed distance δ over the field GF(qm) is constructed by first finding a polynomial over GF(q) whose roots include δ consecutive powers of γ, some root of unity.
要构建一个能够检测、校正两个错误的 BCH 码,我们要使用有限域 GF(16) 或者 Z2[x]/<x4 + x + 1>。如果 α 是 m1(x) = x4 + x + 1 的一个根,那么 m1 就是 α 的极小多项式,这是因为
- m1(x) = (x - α)(x - α2)(x - α4)(x - α8)=x4 + x + 1。
如果要构建一个能够纠正一个错误的 BCH 码,那么就使用 m1(x),这个代码就是所有满足
- C(x) ≡ 0 (mod m1(x))
且根为 α, α2, α4, α8 的多项式 C(x)。
This does not allow us to choose many codewords - so we look for the minimal polynomial for the missing power of α from above - α3, and then the minimal polynomial for this is
- m3(x) = x4 + x3 + x2 + x + 1.
which has roots α3, α6, α12, α24=α9.
We take codewords having all of these as roots, so we form the polynomial
- m1,3(x) = m1(x)m3(x) = x8 + x7 + x6 + x4+1
and take codewords corresponding to polynomials of degree 14 such that
- C(x) ≡ 0 (mod m1,3(x))
So now C(α) = C(α2) = ... = C(α8) = 0. (*)
Now in GF(16) we have 15 nonzero elements, and thus our polynomial will be of degree 14 with 8 check and 7 information bits - we have 8 check bits since we have (*).
[编辑] 编码
构建码字为
- (c14, c13, ..., c8)
这样多项式为
- c14+c13+...+c8
我们将它称为 CI。
然后就要找出 CR 满足 CR=CI (mod m1,3(x))=c7+c6+...+c0
这样就得到待发的码字 C(x) = CI+CR (mod m1,3(x)) = 0
例如,如果我们要对 (1,1,0,0,1,1,0) 进行编码
- CI=x14+x13+x10+x9
and using polynomial long division of m1,3(x) and CI to get CR(x), in Z2 we obtain CR to be
- x3+1
这样,待发的码字为
- (1,1,0,0,1,1,0, 0,0,0,0,1,0,0,1)
[编辑] 解码
BCH 的解码过程可以分为以下四步
- 计算接收到的向量 R 的 2t 伴随矩阵
- 计算错误定位多项式
- 解多项式,得到错误位置
- 如果不是二进制 BCH 码,就计算错误位置的误差值
假设我们收到一个码字向量 r,即多项式 R(x))。
如果没有错误,那么 R(α)=R(α3)=0
如果有一个错误,例如 r=c+ei,其中 ei 表示 R14 的第 i个基向量 于是
- S1=R(α)=C(α)+αi=αi
- S3=R(α3)=C(α3)+(α3)i
- =(αi)3=S13
这样就可以纠正错误。α 的指数显示的数据位变化可以帮助我们校正错误。
如果有两个错误
- r=c+ei+ej
那么
- S1=R(α)=C(α)+αi+αj
- S3=R(α3)=C(α3)+(α3)i+(α3)j
- = (α3)i+(α3)j
这与 S13 不同,所以我们认为有两个错误。更进一步的代数方法可以帮助校正着两个错误。
开头两段内容出自 Federal Standard 1037C
上面的文字摘自:http://bch-code.foosquare.com/
[编辑] BCH 解码算法
流行的解码算法有,
- Peterson Gorenstein Zierler 算法
- Berlekamp-Massey 算法
[编辑] Peterson Gorenstein Zierler 算法
[编辑] 假设
Peterson 算法是普通 BCH 解码过程的第二步,这这里使用 Peterson 算法计算多项式 Λ(x) = 1 + λ1X + λ2X2 + ... + λ2tX2t 的错误定位多项式系数 λ1,λ2...λ2t
这样给定 BCH 码 (n,k,dmin),可以校正 个错误的 Peterson Gorenstein Zierler 算法就是
[编辑] 算法
- 首先生成 2t 伴随矩阵
- 然后生成元素为
的矩阵 Stxt
- 生成元素为
的矩阵 ctx1
- 让 Λ 表示未知的多项式系数,用
表示
- 这样就得到矩阵方程
- 如果矩阵 存在行列式,那么我们就可以找到这个矩阵的逆,然后就可以得到 Λ 的值
- 如果 , 那么按照
if t = 0
then
declare an empty error locator polynomial
stop Peterson procedure.
end
set
continue from the beginning of Peterson's decoding
- 在 Λ 的值确定之后,自然就得到错误定位多项式
- 结束 Peterson procedure。
[编辑] 错误定位多项式的因式分解
在得到 Λ(x) 多项式之后,用 Chiens search 算法就可以得到它的解 Λ(x) = (αiX + 1)(αjX + 1)...(αkX + 1)。根据素元 α 的指数幂就能得到接收到的码字中错误的位置,这也就是误差定位多项式名称的由来。
[编辑] 错误校正
对于二进制的 BCH 码,可以直接根据错误定位多项式因数素元指数的位置校正接收到的向量。最后,对这些位置接收到的数值取反,就可以得到正确的 BCH 解码码字。
另外也可以使用 Berlekamp-Massey 算法确定错误定位多项式,从而解决 BCH 解码的问题。
[编辑] 参考文献
- S. Lin and D. Costello. Error Control Coding: Fundamentals and Applications. Prentice-Hall, Englewood Cliffs, NJ, 2004.
- Step by step decoding instructions (pdf file).
- Federal Standard 1037c: http://federal-standard-1037c.foosquare.com/
- Galois Field Calculator: http://www.geocities.com/myopic_stargazer/gf_calc.zip
- Decoding Algorithms for BCH codes: http://students.uta.edu/mx/mxa6471/research/ecc-report.pdf
- Source code for BCH channel simulation: http://students.uta.edu/mx/mxa6471/research/ecc-code.tgz