BCH码的定义
BCH码是由Bose、Chandhari 和 Hocquenhem 分别独立提出的一种能够纠正多个随机错误的循环码。
BCH 码的定义:给定任一有限域 GF(q)及其扩域 GF(qm)(其中 q 为素数或素数幂),m 为某一正整数,若码元取自 GF(q) 循环码的生成多项式 g(x) 的根集合 R 中有 σ-1 个连续根 αm0, αm0+1, αm0+σ-2,则该循环码称为 q 进制 BCH 码。其中 α∈GF(qm) 是域中的 n 级元素,αm0+i∈GF(qm)(0 ≤ i≤ σ-2),m0 是任意整数,通常取值为 0 或 1,当 m0=1 时生成的 BCH 码为狭义 BCH 码。如果在生成多项式 g(x) 的根中有 GF(qm) 的本原元,则 BCH 码的码长 n=qm-1,相应的 BCH 称为本原 BCH 码。
设 mi(x) 和 ei 分别是 αm0+i(i = 1,2,…,σ-2) 元素的最小多项式和级,则 BCH 码的生成多项式和码长分别为:
BCH码的性质
对于 BCH 码,有如下性质和结论。
①(BCH 限)BCH 码的最小距离 d 至少为 σ;若 BCH 码的生成多项式 g(x) 的根集合为 R = {αm0, αm0+c,αm0+(σ-2)c} 且 (n,c) = 1,则其最小距离 d ≥ σ。
②(HT 限)如果 BCH 码的生成多项式 g(x) 的根集合 R 中有 s 组 σ-1 个 α 的连续元素(α∈GF(qm) 是 n 级元素),即 R = {αm0+σi+j ,i = 0,1,…,s-1; j = 0,1,…,σ-2} 且 (n,α) = 1 ,则 BCH 码的最小距离 d ≥ σ + s - 1。类似的,(GHT 限)如果 BCH 码的生成多项式 g(x) 的根集合为 R= {αm0+σ1i+σ2j ,i = 0,1,…,s-1; j = 0,1,…,σ-2} 且 (n,σ1) < σ,σ ≥ 2 ,则 BCH 码的最小距离 d ≥ σ + s - 1。
③如果二进制本原 BCH 码的码长 n = 2m-1 ,设计距离为 σ = 2t+1 ,则如果满足 :
则,当 t --> 0 时 BCH 码的实际距离等于设计距离。
④若二进制 BCH 码的码长 n = ab 且设计距离为 σ = a ,则码的实际距离就为 a 。
⑤如果 GF(q) 上 BCH 码的码长为 n = qm-1 ,设计距离 σ = qh-1 ,则码的实际距离为 σ 。
⑥ GF(q) 上设计距离为 σ 的本原 BCH 码的实际最小距离 d ≤ qσ +q-2 。
在我们平时的编码中,主要讨论的是 q = 2 的二进制狭义 BCH 码。
BCH的构造
对于二进制 BCH 码,其码元取自 GF(2) 。根据 BCH 码的定义,若设 m0=1, σ=2t+1,α 为 GF(2m) 上的本原元【0、1】,若码以 α,α2,…,α2t 为根,每个根对应的最小多项式为 mi(x),i = 1,2,…,2t,则二进制 BCH 码的生成多项式为:
该 BCH 码能够纠正 t 个错误。
在特征为 2 的 GF(2m) 上 (αi)2 和 αi 的最小多项式相同,因此 BCH 码以 α ,α3,…,α2t-1 为根,其生成多项式可以写成:
相应的码长为:
其中,ei(i = 1,3,…,2t-1) 为 αi(i = 1,3,…,2t-1) 的级。
根据生成多项式以及循环码(https://blog.csdn.net/weixin_45115771/article/details/125571083?spm=1001.2014.3001.5501)的循环移位特性可以构造 BCH 码的生成矩阵 G。若设 C(x) = q(x)g(x) 是 BCH 码的任一码字,则 α ,α3,…,α2t-1 为码多项式 C(x) 的根,即若码多项式为:
则有:
根据 CHT = 0,可知 BCH 码的校验矩阵 H 为:
对于二进制 BCH 码,有如下结论:
对于任意正整数 m 和 t,一定存在一个二进制 BCH 码,以 α ,α3,…,α2t-1 为根,码长为 n = 2m-1 或 2m-1 的因子,能够纠正 t 个错误,码中校验元的个数为 mt 个(生成多项式 g(x) 的次数)。
例:对于定义在 GF(24) 上的本原 BCH 码,m = 4,α 为 GF(24) 上的本原元,GF(24) 上的本原多项式 p(x) = x4+x+1,则针对不同的 t 值,可以构造不同码参数的 BCH 码(假设码长 n = 2m-1 = 15)。
①如果 t = 1,则构造的 BCH 码以 α 为根,同时 α2,α4,α8 也是该 BCH 码的根,α 的最小多项式就是本原多项式,所以生成多项式为 g(x) = x4+x+1,校验元的个数为 mt = 4,得到的是纠错能力 t=1 的(15,11,4)BCH 码。
参考下表:
幂次表示 | 二进制表示 十进制表示 | |
---|---|---|
0 | 0000 | 0 |
1 | 0001 | 1 |
α1 | 0010 | 2 |
α2 | 0011 | 3 |
α3 | 0100 | 4 |
α4=α+1 | 0101 | 5 |
α5=α2+α | 0110 | 6 |
α6 =α3+α2 | 0111 | 7 |
α7= α3+α+1 | 1000 | 8 |
α8 = α2+1 | 1001 | 9 |
α9=α3+α | 1010 | 10 |
α10=α2+α+1 | 1011 | 11 |
α11=α3+α2+α | 1100 | 12 |
α12 =α3+α2+α+1 | 1101 | 13 |
α13=α3+α2+1 | 1110 | 14 |
α14 =α3+1 | 1111 | 15 |
根据表中 GF(24) 的元素列表及 BCH 码校验矩阵的形式,可以写出该 (15,11,4)BCH 码的检验矩阵 H 为:
及循环码生成多项式矩阵的构造方法可以写出该 BCH 码的生成矩阵 G。
②如果 t = 2,则构造的 BCH 码以 α ,α3 为根,α 的最小多项式为 m1(x) = x4+1,α3 的最小多项式为 m3(x) = x4+ x3+ x2+x+1,所以生成多项式为:g(x) = m1(x) m3(x) = x8+ x7+ x6+x4+1,校验元的个数为 mt = 8,得到的是纠错能力 t = 2 的(15,7,5)BCH 码。参考上表中 GF(24) 的元素列表及 BCH 码校验矩阵的形式,可以写出该 (15,7,5)BCH 码的校验矩阵 H 为:
根据校验矩阵 H 和生成矩阵 G 的对偶关系或者根据生成多项式 g(x) 及循环码生成多项式矩阵的构造方法可以写出该 BCH 码的生成矩阵 G。
③如果 t = 3,则构造的 BCH 码以α ,α3, α5 为根,α 的最小多项式为 m1(x) = x4+1,α3 的最小多项式为 m3(x) = x4+ x3+ x2+x+1,α5 的最小多项式为 m5(x) = x2+x+1,所以生成多项式为:g(x) = m1(x) m3(x)m5(x) = x10+ x8+ x5+x4+x2+x+1,校验元的个数为 mt = 12,得到的是纠错能力 t = 3 的(15,5,7)BCH 码。参考上表中 GF(24) 的元素列表及 BCH 码校验矩阵的形式,可以写出该 (15,5,7)BCH 码的校验矩阵 H 为:
④如果 t = 4,则构造的 BCH 码以α ,α3, α5 , α7为根,α 的最小多项式为 m1(x) = x4+1,α3 的最小多项式为 m3(x) = x4+ x3+ x2+x+1,α5 的最小多项式为 m5(x) = x2+x+1,α7 的最小多项式为 m7(x) = x4+ x3+1,所以生成多项式为:g(x) = m1(x) m3(x)m5(x)m7(x) = x14+ x13+x12+x11+x10+x9+ x8+x7+x6+ x5+x4+x3+ x2+x+1,得到的是(15,1,15)BCH 码,也即重复码。该码的设计距离为 σ = 2t+1 = 9,可以计算该码的实际最小距离 d = 15。在此情况下,设计距离不等于实际最小距离,码设计太过度了,该码实际可纠 (d-1)/2 = 7个随机错误。
与线性分组码和循环码类似,也可以通过增加全校验位实现扩展 BCH 码。
BCH码编码
BCH 码编码的关键是生成多项式的选取,或者说生成矩阵 G 和校验矩阵 H 的构造。对于定义在 GF(qm) 上分组长度 n = qm-1、可纠正 t 个错误的 BCH 码,编码步骤如下:
①选取一个次数为 m 的既约多项式并构造 GF(qm) 。
②求 αi,i = 1,3,…,2t-1的最小多项式 mi(x)。
③构造可纠 t 个错误的码生成多项式 g(x) = m1(x) m3(x)… m2t-1(x)。
④按照循环码的编码方法和编码电路及逆行编码(所有加法运算和乘法运算都在 GF(qm)。
在MATLAB中提供了 BCH 码的编码和译码相关函数和 Simulink 仿真模块,具体说明如下:
—bchgenpoly—:该函数根据码长 n 和信息组长度 k 计算狭义 BCH 码的生成多项式。语法结构为:
genpoly = bchgenpoly(n,k)
genpoly = bchgenpoly(n,k,prim_poly)
[genpoly,t] = bchgenpoly(……)
其中,输入参数 n 为码长,k 为信息组长度,码长 n 必须等于 2m-1,3 ≤ m ≤ 16,输入 prim_poly 为按幂次下降顺序排列的整数,表示本原多项式的系数。输出 genpoly 是 GF(2) 上按幂次下降顺序排列的生成多项式系数,输出 t 表示该码的纠错能力。
例:生成纠错能力为 3 的(15,5)BCH 码的生成多项式。
m = 4;
n = 2^m-1; % 码长
k = 5; % 信息组长度
[genpoly,t] = bchgenpoly(n,k) % 计算生成多项式和纠错能力
disp(genpoly); % 显示 genpoly
disp(t); % 显示 t
输出结果:
genpoly:
1×11 gf 数组 - 属性:
x: [1 0 1 0 0 1 1 0 1 1 1]
m: 1
prim_poly: 3
t:
3
有了生成多项式,就可以进行 BCH 码的编码和译码了。
—bchnumerr—:该函数计算给定参数条件下 BCH 码的可纠正错误数,语法结构为:
T = bchnumerr(N)
T = bchnumerr(N,K)
语法结构 1 表示在给定码长 N 的条件下返回所有可能的信息组长度 K 组成不同 (N,K) BCH 码时的可纠正错误数 T,其返回值 T 为一个包含 3 列元素的矩阵,第 1 列为码长 N ,第 2 列为可能的信息组长度 K,第3列为纠错能力T。
例:当N=15时,输出结果T为:
T = bchnumerr(15);
T =
15 11 1
15 7 2
15 5 3
也即对于N=15的情况,可以生成信息组长度K分别为 11 , 7 和 5 的 BCH 码,其纠错能力分别为 1、2 和 3。
语法结构 2 要求输入信息组长度 K,函数执行后返回 (N,K) BCH 码的纠错能力 T。
—bchenc—:该函数为 BCH 码的编码函数,语法结构为:
code = bchenc(msg,n,k)
code = bchenc(……,paritypos)
该函数使用狭义(n,k)BCH 码的生成多项式对输入信息组 msg 进行 BCH 码编码。其中信息组 msg 定义在 GF(2) 上,可以是矩阵形式,每行包含 k 个元素作为一个信息组。最左边为最高位符号。在输出的 GF(2) 域上编码码字 code 中检验符号位于每个码字的右端。
语法结构 2 中参数 paritypos 用于指定检验符号的位置,值可以是 “end” 或 “beginning”,分别表示校验符号位于输出码字信息组的开始部分和结束部分,默认值为 “end”。
例:假设对(15,5)BCH 码进行编码,输入为:
code = bchenc(msg,n,k)
code = bchenc(……,paritypos)
若输入为:
msg = gf([1 0 1 0 1; 0 1 0 1 0 ]);
code = bchenc(msg,15,5);
则输出为:
code:
2×15 gf 数组 - 属性:
x: [2×15 uint32]
[1,0,1,0,1,1,0,0,1,0,0,0,1,1,1;
0,1,0,1,0,0,1,1,0,1,1,1,0,0,0]
m: 1
prim_poly: 3
BCH码译码
一、伴随式译码
BCH 码的伴随式译码分为如下3个步骤:
①根据接收码多项式 R(x) ,利用公式:
计算伴随式 S(x)。
②根据伴随式 S(x),在码字纠错能力范围内得到错误图样 E(x) 的估计 E^(x)。
③估计发送码字 C^(x) = R(X)+E^(x)。
二、迭代译码
BCH 码伴随式译码中最复杂的部分是错误位置多项式系数的计算和根的求解。Berlekamp 提出了一种通过迭代方式求解错误位置多项式根的方法(BM 算法),结合 Chien搜索电路,可以加快错误多项式的求解,简化译码过程。
BCH 码的迭代译码分为如下5个步骤:
①根据接收码多项式 R(x),利用公式:
计算伴随式 S(x)。
②用 BM 算法求解错误位置多项式的系数。
③用 Chien 搜索法求错误位置多项式的根。
④计算错误值(对于二元码,可以省略该步骤)。
⑤根据错误位置(和错误值)获得错误图样 E(x) 的估计 E^(x)并译码, C^(x) = R(X)+E^(x)。
—bchenc—:该函数为 BCH 码的译码函数,使用BM算法进行 BCH 码的译码。语法结构为:
decoded = bchdec(code,n,k)
decoded = bchdec(……,paritypos)
[decoded,cnumerr] = bchdec(……)
[decoded,cnumerr,ccode] = bchdec(……)
其中,输入参数 n 和 k 分别表示码长和信息组长度,code 为定义在 GF(2) 上的接受码符号序列,paritypos 用于指定校验符号的位置(与 bchenc 中相对应)。
输出参数中 decoded 表示译码输出码字,定义在有限域上,可以是矩阵形式,每一行对应输入 code 中一行码字的译码输出。如果 bchdec 函数检测到在 code 的行中出现超过其纠错能力 t 的错误(错误数大于 t),则译码失败,这种情况下 bchdec 函数因输出输入 code 中每一行的前 k 个符号(默认 paritypos = “end”)。输出参数中 cnumerr 返回的是列矢量,其中每个元素是对输入 code 的每行译码时纠正的错误说,如果某行译码失败,则 cnumerr 列矢量中相应的元素值为 -1。输出参数中 ccode 返回的是纠正了 code 中的错误之后的码向量(或矩阵),其格式与输入 code 相同。如果译码失败,则直接输出 code 中相应的行。
例:对(15,5)BCH 码进行编译码。文章来源:https://www.toymoban.com/news/detail-808530.html
n = 15;
k = 5;
dat = randi([0,1],4,k);
msg = gf(dat);
code = bchenc(msg,n,k);
decode = bchdec(code,n,k);
% 检查译码过程是否正确
chk = isequal(decode,msg);
在上述例子中,要求编码函数 bchenc 和译码函数 bchdec 中参数 paritypos 的值必须相同,才能正确译码。文章来源地址https://www.toymoban.com/news/detail-808530.html
到了这里,关于BCH编码与译码(MATLAB实现)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!