简单介绍

若循环码的生成多项式具有如下形式\(g(x)=LCM[m_{1}(x),m_{3}(x)..m_{2t-1}(x)]\)

其中LCM表示最小公倍式,t为纠错个数,\(m_{i}(x)\)为素多项式,则由此生成的循环码称为BCH码,其最小码距\(d\ge d_{0}=2t+1\),其中\(d_{0}\)为设计码距,则这个码能纠正t个随机独立差错。

举个例子来有个先验感知:BCH(15,5)码,可纠正3个随机独立差错(t=3),求它的生成多项式。

码距应该为\(d\ge d_{0}=2*3+1=7\)

n=15,根据\(n=2^{m}-1\),得出m等于4;查下表不可约多项式可知:

阶数 编号 多项式(二进制表示)
2 1 111
3 1 1101
4 1 3 5 010011 011111 000111
5 1 3 5 100101 111101 110111

于是就有了\(m_{1}(x)=x^{4}+x+1\),\(m_{3}(x)=x^{4}+x^{3}+x^{2}+x+1\),\(m_{5}(x)=x^{2}+x+1\)

这样就得出:

\(g(x)=LCM[m_{1}(x),m_{3}(x),m_{5}(x)]=x^{10}+x^{8}+x^{5}+x^{4}+x^{2}+x+1\)

基本知识

BCH 码是用于校正多个随机错误模式的多级、循环、错误校正、变长数字编码,是迄今为止所发现的一类很好的线性纠错码类。它的纠错能力很强,特别在短和中等码长下,其性能接近于理论值,并且构造方便,编码简单。特别是它具有严格的代数结构,因此它在编码理论中起着重要的作用。

BCH码是循环码的一个子类,他的纠错能力是通过:先声明期望码能纠错随机错误的的个数,然后再构造这样的码生成多项式。

如果一个域F仅具有有限多个元素,比如仅有q个元素,这样的域称为有限域或称之为伽罗瓦域,记为GF(q)。

\(GF(2^{m})\)的构成

可以将\(GF(p)\)延伸为一个含有\(p^{m}\)个元素的域,称为GF(p)的扩展域,表示为\(GF(p^{m})\)

由这个我们就可以知道二进制域\(GF(2)\)是扩展域\(GF(2^{m})\)的一个子域,类似于实数域是复数域的一个子域一样。除了数字0和1之外,在扩展域中还可以用a来表示特殊元素,\(GF(2^{m})\)中任何非0元素都可由a的幂次表示。这样\(GF(2^{m})\)的元素可表示为\(GF(2^{m})={0,a^{0},a^{1},a^{2},.........a^{2^{m}-2}}\)

系数取自GF(2)上的(m-1)次多项式,即

\[a(\alpha)=a_{0}+a_{1}\alpha+...+a_{m-1}\alpha^{m-1}
\]

其中\(a_{i}\in GF(2),i=0,1,2...m-1\)。这些多项式的总数正好等于\(2^{m}\)。我们希望能将这些数据作为\(GF(2^{m})\)上的元素,这些元素可以通过多项式或者是m维二元矢量进行表示。

举一个例子,m=4时,对于\(GF(2^{4})\)的16个元素可以如下表所示:

接下来引入\(GF(2^{m})\)中元素间的加法和乘法运算,系数之间的运算采用模2运算。

先来看加法

\(m(\alpha)=1+\alpha+\alpha^{3}\)---->1101

\(n(\alpha)=1+\alpha^{2}​\)----------->1010

则\(m(\alpha)+n(\alpha)=(+\alpha+\alpha^{3})+(1+\alpha^{2})=\alpha+\alpha^{2}+\alpha^{3}\)

------>0111

但是当我们在乘法的时候,就会有问题:

\(m(\alpha)*n(\alpha)=1+\alpha+\alpha^{2}+\alpha^{5}\)

超过了最高次数项,必须把它简化为小于等于3的多项式。如何才能简化?可以通过令\(\alpha\)是某个4次多项式\(\pi(x)\)的根。在上述的例子里,我们可以令\(\alpha\)为\(\pi(x)=1+x+x^{4}\)的根,即\(\alpha^{4}=1+\alpha\)

从而

\[\begin{eqnarray}m(\alpha)*n(\alpha)&=&1+\alpha+\alpha^{2}+\alpha^{5}\\&=&1+\alpha+\alpha^{2}+\alpha(1+\alpha)\\&=&1 \end{eqnarray}
\]

即(1101)*(1010)=(1000).这样用多项式表示\(GF(2^{4})\)元素对于多项式乘法是封闭的。

我们总结一下,如果需要生成有限域\(GF(2^{m})\),则\(\pi(x)\)必须是m次多项式。这里的\(\pi(x)\)必须是\(GF(2)\)上的既约多项式(\(\pi(x)\)在\(GF(2)\)上不能进一步因式分解,或者说\(\pi(x)\)没有次数小于m-1,系数在\(GF(2)\)上的多项式作为因式)

关于GF域有以下几个定理:

1.如果\(\pi(x)\)是\(GF(2)\)上次数等于m的既约多项式,则对\(GF(2)\)上每个次数小于m的多项式c(a)存在唯一的逆元:\(c^{-1}(a)\in GF(2^{m})\)

2.令\(\lambda\)为\(\sum_{i=1}^{t}1=0\)成立的最小整数t(这里的1为单位元素),该\(\lambda\)称为有限域\(GF(q)\)的特征,该特征一定是质数。

循环码的定义和多项式表示

一个二元n维矢量\(v=(v_{0},v_{!},...,v_{n-1})\),若把它的分量循环向右一位,则得到另一个n维矢量\(v^{(1)}=(v_{n-1},v_{0},v_{1},.....v_{n-2})\),这里把\(v^{(1)}\)称为v的循环移位。

一个(n,k)线性码l,若它的每个码字矢量的循环移位也是该码的码字,则称l为循环码。我们可以把码字矢量\(v=(v_{0},v_{!},...,v_{n-1})\)看成是如下的多项式:

\[v(x)=v_{0}+v_{1}x+v_{2}x^{2}+....+v_{n-1}x^{n-1}=\sum_{j=0}^{n-1}v_{j}x^{j}
\]

其中系数\(v_{j}\in {0,1}\),\(v_{j}x^{j}\)实际上只是表示这个矢量v的第j+1位分量是\(v_{j}\),因此\(x^{j}\)是位置算子。

每个码字矢量与一个不高于n-1次的多项式对应,于是与\(v^{1}\)对应的多项式为:\(v^{1}(x)=v_{n-1}+v_{0}x+....+v_{n-2}x^{n-1}\)

观察\(v(x)\)与\(v^{1}(x)\)的关系可得:\(x*v(x)=v^{1}(x)+v_{n-1}(x^{n}+1)\)(二元计算中+1和-1是等价的,所以将-1换成了+1);进一步我们可以总结出:\(v^{1}(x)\equiv x*v(x)mod(x^{n}+1)\)

意思是说\(v^{i}(x)\)等于x与v(x)的乘积后再除以\(x^{n}+1\)以后的余式。

假如我们现在有一个n-k循环码的生成多项式:\(g(x)=1+x^{2}+x^{4}\),则生成的(6,2)循环码的码字矢量和码字多项式如下:

消息矢量 码字矢量 码字多项式
\((u_{0},u_{1})\) \((v_{0},v_{1},v_{2},v_{3},v_{4},v_{5})\)
(0,0) (0,0,0,0,0,0) \(v_{0}(x)=0*g(x)=0\)
(0,1) (1,0,1,0,1,0) \(v_{1}(x)=1*g(x)=g(x)\)
(1,0) (0,1,0,1,0,1) \(v_{2}(x)=x*g(x)=x+x^{3}+x^{5}\)
(1,1) (1,1,1,1,1,1) \(v_{3}(x)=(x+1)*g(x)=1+x+x^{2}+x^{3}+x^{4}+x^{5}\)

根据循环码的定义(循环移位后仍然是在这个循环码内的码字)知道,((000000),(01010101),(10101010),(111111))是循环码。消息矢量可以看成是代表的k位消息数据比特,在这个例子里是2.

给出一个定理:若g(x)是n-k次多项式,而且是\(x^{n}+1\)的因式,则g(x)生成一个(n,k)循环码。

有限域的本原多项式

一个多项式是本原多项式的充要条件:一个m阶的不可约多项式f(x),如果f(x)整除\(x^{n}+1\)的最小正整数n满足\(n=2^{m}-1\),则该多项式是本原的。

例如用本原多项式\(p(x)=1+x+x^{3}\)来构造GF(8),设GF(8)上的本原元为a,通过将a的幂模p(a)得到GF(8)上的所有元素:

极小多项式

系数定义在基域\(GF(q)\)上且在扩展域\(GF(q^{m})\)上有根\(\beta _{j}\)的最小次数多项式称为\(\beta_{j}\)的极小多项式。

设\(b_{1},b_{2}...b_{p-1}\)为GF(p)上的非零域元素,则\(x^{p-1}+1=(x+b_{1})(x+b_{2})...(x+b_{p-1})\)

从上面的循环码知识我们知道,为了找到分组长度为n的循环码的生成多项式,首先分解\(x^{n}+1\),因此\(x^{n}+1\)可以表示为多个因子的乘积,即\(x^{n}+1=f_{1}(x)f_{2}(x)....f_{w}(x)\)

在扩展域\(GF(p^{m})\)中,\(n=p^{m}-1\)

编码

对于一个分组长度\(n=p^{m}-1\)、确定可纠正t个错误的BCH码的生成多项式的步骤如下:

1.选取一个次数为m的素多项式并构造\(GF(p^{m})\)

2.求\(a^{i},i=0,1,2...n-2\)的极小多项式\(f_{i}(x)\)

3.可纠正t个错误的码的生成多项式为:

\[g(x)=LCM[(f_{1}(x),f_{2}(x),f_{3}(x).....f_{2t}(x)]
\]

d=2t+1称为码的设计距离,一旦确定了n和t,我们便可以确定BCH码的生成多项式。

表中第2列是第3列多项式的根。

然后用生成多项式,按照生成循环码的方式生成的就为BCH码。

实现

bch_n=15    # (n,k)中的n
bch_k=5 # (n,k)中的k
bch_c=bch_n-bch_k
g=[1,0,1,0,0,1,1,0,1,1,1] # 这个要自己计算
def encode(origin_data):
zero=[0]
bb=[]
bb.extend((bch_c)*zero)
for i in range(bch_k):
freeback=origin_data[i]^bb[0]
if freeback!=0:
for j in range(bch_c-1):
if g[j]!=0:
bb[j]=bb[j+1]^freeback
else:
bb[j]=bb[j+1]
bb[bch_c-1]=g[bch_c-1]&freeback
else:
for j in range(bch_c-1):
bb[j]=bb[j+1]
bb[bch_c-1]=0
return bb def main():
origin_data=[1,0,0,1,1]
print("Word to be encoded:")
print(origin_data)
data=[]
data=encode(origin_data)
print("Encoded it is:")
print(data) main()

BCH code的更多相关文章

  1. 二维码详解(QR Code)

    作者:王子旭链接:https://zhuanlan.zhihu.com/p/21463650来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 2016.7.5 更新:长文 ...

  2. Delphi xe7 FireMonkey / Mobile (Android, iOS)生成 QR Code完整实例

    这个实例在windows.OS X.IOS和Android等平台运行正常.本文参考这个网站提供的方法:http://zarko-gajic.iz.hr/firemonkey-mobile-androi ...

  3. Atitit java 二维码识别 图片识别

    Atitit java 二维码识别 图片识别 1.1. 解码11.2. 首先,我们先说一下二维码一共有40个尺寸.官方叫版本Version.11.3. 二维码的样例:21.4. 定位图案21.5. 数 ...

  4. QR二维码(转)

    二维码又称QR Code,QR全称Quick Response,是一个近几年来移动设备上超流行的一种编码方式,它比传统的Bar Code条形码能存更多的信息,也能表示更多的数据类型:比如:字符,数字, ...

  5. (转)QR二维码生成及原理

    二维码又称QR Code,QR全称Quick Response,是一个近几年来移动设备上超流行的一种编码方式,它比传统的Bar Code条形码能存更多的信息,也能表示更多的数据类型:比如:字符,数字, ...

  6. 二维码的生成细节和原理 -- 转http://news.cnblogs.com/n/191671/

    二维码又称 QR Code,QR 全称 Quick Response,是一个近几年来移动设备上超流行的一种编码方式,它比传统的 Bar Code 条形码能存更多的信息,也能表示更多的数据类型:比如:字 ...

  7. 【来龙去脉系列】QRCode二维码的生成细节和原理

    二维码又称QR Code,QR全称Quick Response,是一个近几年来移动设备上超流行的一种编码方式,它比传统的Bar Code条形码能存更多的信息,也能表示更多的数据类型:比如:字符,数字, ...

  8. 二维码 : QRcode

    1 1 1 ★什么是二维码 通俗解释: 二维码是一种能存储信息的特定格式图片. 技术解释: 二维码(2-dimensional bar code) ,又称二维条码, 是用某种特定的几何图形按一定规律在 ...

  9. Delphi使用Zxing创建二维码

    效果 DelphiZXingQRCode下载地址:https://www.debenu.com/open-source/delphizxingqrcode/ 为了调用方便unit DelphiZXIn ...

随机推荐

  1. win7安装linux双系统

    整体流程大概就是下载启动盘制作工具以及linux镜像,这些步骤网上很多,我就不再重复了 这里以centos举例说几个我踩到的坑吧 1.选择开始安装后提示 Warning: /dev/root does ...

  2. SpringBoot27 JDK动态代理详解、获取指定的类类型、动态注册Bean、接口调用框架

    1 JDK动态代理详解 静态代理.JDK动态代理.Cglib动态代理的简单实现方式和区别请参见我的另外一篇博文. 1.1 JDK代理的基本步骤 >通过实现InvocationHandler接口来 ...

  3. 我使用的网址--Hadoop

    1.Hadoop 官网下载:http://hadoop.apache.org/releases.html 各版本网址:http://mirror.bit.edu.cn/apache/hadoop/co ...

  4. 2.Border Layout 自定义一个Layout来完成布局。

    目标: 1.添加控件的函数 void QLayout::addWidget ( QWidget * w ) 在这个例子里面我们重载这个函数 void addWidget ( QWidget * w, ...

  5. Python3 网络爬虫开发实战学习弱点书签

    1. urllib.robotparse模块对robot.txt文件的解析,can_fetch()方法和parse()方法. Page121 2. lxml.etree模块自动补全Html代码,Htm ...

  6. 第十二课 Actionlib(1)

    一\Actionlib概念 在ROS系统中,有时需发送请求给某个节点完成相应的任务,同时获得一个一个响应,这种情况下可以通过ROS服务来 完成;然而,在某些情况下,服务需要很长时间才能执行完,如让机器 ...

  7. 浏览器访问www.meituan.com过程

    “从浏览器输入 xxx 到跳转完成的过程发生了什么”,是一个常见的比较综合的面试题,以下是我查阅了一些资料后总结的,如有错误,还望批评指正.(以美团网为例) 1.在浏览器地址栏输入:meituan.c ...

  8. 3.python 发送邮件之smtplib模块

    SMTP(Simple Mail Transfer Protocol)是简单邮件传输协议,它是一组用于由源地址到目的地址的邮件传输规则. python中对SMTP进行了简单的封装,可以发送纯文本邮件, ...

  9. (转)jQuery基础之选择器

    原文地址: http://www.cnblogs.com/webmoon/p/3169360.html 选择器是jQuery的根基,在jQuery中,对事件处理.遍历DOM和Ajax操作都依赖于选择器 ...

  10. android Base64字符串与Bitmap相互转换

    /** * 将bitmap转换成base64字符串 * * @param bitmap * @return base64 字符串 */ public String bitmaptoString(Bit ...