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) 上 (αi2 和 α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
α52 0110 6
α632 0111 7
α7= α3+α+1 1000 8
α8 = α2+1 1001 9
α93 1010 10
α102+α+1 1011 11
α1132 1100 12
α1232+α+1 1101 13
α1332+1 1110 14
α143+1 1111 15

根据表中 GF(24) 的元素列表及 BCH 码校验矩阵的形式,可以写出该 (15,11,4)BCH 码的检验矩阵 H 为:
![在这里插入图片描述](https://img-blog.csdnimg.cn/83f409fd6bab41a8afa97db4aec53f5d.png
根据校验矩阵 H 和生成矩阵 G 的对偶关系或者根据生成多项式 g(x) 及循环码生成多项式矩阵的构造方法可以写出该 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: 1prim_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     115     7     215     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: 1prim_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 码进行编译码。

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 的值必须相同,才能正确译码。

BCH编码与译码(MATLAB实现)相关推荐

  1. BCH编码译码误码率性能matlab仿真

    目录 1.算法描述 2.仿真效果预览 3.MATLAB部分代码预览 4.完整MATLAB程序 1.算法描述 BCH编译码是一种纠错能力强,构造简单的信道编译码.BCH编译码的生成多项式可以由如下的式子 ...

  2. RS+BCH级联编译码误码率性能matlab仿真

    目录 1.算法描述 2.仿真效果预览 3.MATLAB部分代码预览 4.完整MATLAB程序 1.算法描述 在实际情况中,在光通信信道中出现的错误有单独随机出现的误码,也有突发出现的无码,为了更好的提 ...

  3. 算术编码、译码以及matlab实现

    算术编码是一种采用的编码,我们用matlab语言来实现算术码的编码.译码过程. 首先,我们给定研究范围为 2元信号.用{0,1}符号来表示,然后我们假设发送方和接收方都知道符号0出现的概率p(0)和符 ...

  4. 【编码译码】基于matlab QC-LDPC码编码和译码【含Matlab译码 2194期】

    ⛄一.获取代码方式 获取代码方式1: 完整代码已上传我的资源:[编码译码]基于matlab QC-LDPC码编码和译码[含Matlab译码 2194期] 点击上面蓝色字体,直接付费下载,即可. 获取代 ...

  5. matlab完成信源编码译码,Huffman编码和译码的MATLAB实现.doc

    Huffman编码和译码的MATLAB实现.doc Huffman编码及译码的MATLAB实现 沈逸峰 (上海师范大学 信息与机电工程学院,上海 200333) 摘要:本论文首先介绍了Huffman编 ...

  6. 【BCH码1】系统BCH码编码原理及MATLAB实现(不使用MATLAB库函数)

    关注公号[逆向通信猿]更精彩!!! BCH编码原理 设一个 ( n , k ) (n,k) (n,k)循环码的生成多项式为 g

  7. bch verilog代码_基于FPGA的多进制BCH编码

    标签:编码(180)RS(99) 摘要:RS(Reed-Solomon)编码是一种具有较强纠错能力的多进制BCH编码,其既可纠正随机错误,又可纠正突发错误.RS编译码器广泛应用于通信和存储系统,为解决 ...

  8. 信道编解码(2)LDPC编码_译码

    LDPC编码_译码 1 LDPC码简介 2 LDPC编译码实例 3 仿真程序 1 LDPC码简介 LDPC码即低密度奇偶校验码(Low Density Parity Check Code,LDPC), ...

  9. 卷积码译码matlab程序,卷积码的编译码MATLAB程序

    <卷积码的编译码MATLAB程序>由会员分享,可在线阅读,更多相关<卷积码的编译码MATLAB程序(5页珍藏版)>请在人人文库网上搜索. 1.survivor state是一个 ...

  10. matlab完成信源编码译码,matlab哈夫曼译码

    Huffman 编码的 matlab 实现 一.信源编码介绍 为了...经典的方法还是仙农编码 法.费诺编码法和霍夫曼...信源编码和译码,而是事先规定一个 译码差错率的...... 2013 Vol ...

最新文章

  1. 打造自己的树莓派监控系统1--CPU监控-matplotlib显示数据
  2. [CareerCup] 17.7 English Phrase Describe Integer 英文单词表示数字
  3. Android App的架构设计:从VM、MVC、MVP到MVVM
  4. python中List的sort方法(或者sorted内建函数)的用法
  5. boost::smart_ptr模块boost/pointer_cast.hpp 的测试
  6. Linux下安装rpm出现error: Failed dependencies
  7. Android之百度地图定位最详细使用总结
  8. bmp怎么编辑底色_非标机械设计这个行业前景怎么样
  9. 2009年1月5日 洛基网络教室听课笔记
  10. pythonmatplotlib怎么设置曲线_python – Matplotlib的“symlog”选项:如何防止曲线“回来”?...
  11. 黑苹果mac未能安装在你的电脑上_mac电脑上全新视频剪辑软件安装包分享,让你剪辑视频从此无忧!...
  12. 单片机用C语言锯齿波,试用c语言编写一个能输出锯齿波信号的单片机c51程序
  13. 语句覆盖,判定覆盖,条件覆盖,条件/判定覆盖,条件组合覆盖,路径覆盖
  14. C# 使用NPOI.XSSF对Excel进行操作
  15. vs2021下载步骤
  16. [求助]python模拟布丰投针
  17. 如何让IE窗口保持最大化
  18. 云计算基础平台iaas(openstack)超级详细搭建(三)安装服务
  19. vue3+vite assets动态引入图片的几种方式,解决打包后图片路径错误不显示的问题
  20. op 反馈电阻并联二极管

热门文章

  1. Arm中国“战火”升级:第三封声明再次否认CEO吴雄昂被董事会罢免
  2. 【下载一】NI 系列软件卸载工具
  3. 内核调试技巧-逆向寻踪,揭开 LACP 协议流程的神秘面纱
  4. via浏览器如何拦截广告
  5. 联发科MT6763处理器参数MT6763芯片资料
  6. 板绘如何厚涂?绘画时应该怎样厚涂?教你利用SAI结合数位板进行厚涂绘画!
  7. Java实现自动映射原生JDBC查询出的数据库字段
  8. 20201021 plecs示波器导出高质量图片
  9. RRT 算法原理以及过程演示
  10. 基于ArcGIS和fragstats软件计算景观破碎度(一)