0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

汉明码编码原理介绍

倩倩 来源:网络整理 2018-03-02 16:07 次阅读

为了保证通信过程中数据传输的正确性和完整性,并且在通信过程中,如果数据传输发生一位错误,能够将其矫正过来,将信息数据进行汉明编码后再进行数据传输。

汉明码(Hamming Code)也叫海明码,是Richard Hamming(贝尔实验室)于1950年发明的,汉明码也是利用了奇偶校验位概念,通过在数据位后增加一些比特以验证数据的有效性,故汉明码也属于线性纠错码(可纠错1-bit错误检出2-bit错误)。汉明码无法实现2位及2位以上纠错。

汉明码原理

汉明码运算需要构造G生成矩***和H监督矩***,关于构造方法可参考相关计算机原理书籍,这里只需了解些简单的概念即可。

设数据位数为m,校验位数为k,则总编码位数为n,所以,n=m+k,则,

有Hamming不等式:

2^k-1》=n

也可表示为:2^k》=m+k+1,该不等式用于对比运算计算数据位数和检验位数,举个例子假设数据位为64,那么校验位则为(“2^k-k》=65” =》k=7)。

校验位数一般指最小值,因为k越小总信息位会越小,传输开销自然越小。

信息位数一般指最大值,但由于2^k-k只能在固定的离散值里取值,所以信息位也可能不是最大值,比如信息位为24,计算需要校验位5,但同样可信息位为25时,校验位同样是5。

校验位数VS信息位数关系如下表:

汉明码编码原理介绍

注:汉明码的特性决定,一般不会做太多信息位的校验,信息位越长出现多余两个错误的概率会越高,这将带来纠错的难度。

汉明码编码原理

设码长为n,信息位长度为k,监督位长度为r=n-k。如果需要纠正一位出错,因为长度为n的序列上每一位都可能出错,一共有n种情况,另外还有不出错的情况,所以我们必须用长度为r的监督码表示出n+1种情况。而长度为r的监督码一共可以表示2^r种情况 。因此

2^r 》= n + 1, 即r 》= log(n+1)

我们以一个例子来说明汉明码。假设k=4,需要纠正一位错误,则

2^r 》= n + 1 = k + r + 1 = 4 + r + 1

解得r 》= 3。我们取r=3,则码长为3+4=7。用a6,a5,。。.a0表示这7个码元。用S1,S2,S3表示三个监关系式中的校正子。我们作如下规定(这个规定是任意的):

S1 S2 S3 错码的位置

0 0 1 a0

0 1 0 a1

1 0 0 a2

0 1 1 a3

1 0 1 a4

1 1 0 a5

1 1 1 a6

0 0 0 无错

按照表中的规定可知,仅当一个错码位置在a2,a4,a5或a6时校正子S1为1,否则S1为0。这就意味着a2,a4,a5,a6四个码元构成偶校验关系:

S1 = a6⊕a5⊕a4⊕a2 (1)式

同理,可以得到:

S2 = a6⊕a5⊕a3⊕a1 (2)式

S3 = a6⊕a4⊕a3⊕a0 (3)式

在发送信号时,信息位a6,a5,a4,a3的值取决于输入信号,是随机的。监督为a2,a1,a0应该根据信息位的取值按照监督关系决定,即监督位的取值应该使上述(1)(2)(3)式中的S1,S2,S3为0,这表示初始情况下没有错码。即

a6⊕a5⊕a4⊕a2 = 0

a6⊕a5⊕a3⊕a1 = 0

a6⊕a4⊕a3⊕a0 = 0

由上式进行移项运算,得到:

a2 = a6⊕a5⊕a4

a1 = a6⊕a5⊕a3

a0 = a6⊕a4⊕a3

已知信息位后,根据上式即可计算出a2,a1,a0三个监督位的值。

接收端受到每个码组后,先按照(1)~(3)式计算出S1,S2,S3,然后查表可知错码情况。

例如,若接收到的码字为0000011,按照(1)~(3)计算得到:

S1 = 0, S2 = 1, S3 = 1

查表可得在a3位有一个错码。

这种编码方法的最小汉明距离为d=3,所以这种编码可以纠正一个错码或者检测两个错码。

汉明码实例

下文示例为(30,24)汉明码计算方法,用在MIPI DSI包头部分(MIPI Alliance Specification for Display Serial Interface,Chapter 9),DSI包头格式固定为24bits Data+8bits ECC,8bitsECC中预设P6=P7=0,所以实际n=30,m=24,k=6。

检验位计算方法参考MIPI DSI table22生成矩***(Px vs [DataBit0~DataBitx]),比如P5=D10^D11^.。。.D23,表示对应DataBit23的P5列,只有这些DataBit位为1。

int main() {

char res;

char in[20]={0};

char D0,D1,D2,D3,D4,D5,D6,D7,D8,D9,D10,D11,D12,D13,D14,D15,D16,D17,D18,D19,D20,D21,D22,D23;

char P0,P1,P2,P3,P4,P5,P6,P7;

cout《《“Checking Codes(eg.0x1234AF, \”-\“ for exit): 0x”;

cin》》in;

if(in[0]==‘-’) {

return 0;

}

for(int i=0;i《6;i++){

if((in[i]》=‘0’) && (in[i]《=‘9’)) {

in[i] = in[i]-0x30;

}else if((in[i]》=‘A’) && (in[i]《=‘F’)){

in[i] = in[i]-‘A’+10;

}else {

return 0;

}

}

D0=in[1]&0x01; D1=(in[1]&0x02)》》1;

D2=(in[1]&0x04)》》2; D3=(in[1]&0x08)》》3;

D4=in[0]&0x01; D5=(in[0]&0x02)》》1;

D6=(in[0]&0x04)》》2; D7=(in[0]&0x08)》》3;

D8=in[3]&0x01; D9=(in[3]&0x02)》》1;

D10=(in[3]&0x04)》》2; D11=(in[3]&0x08)》》3;

D12=in[2]&0x01; D13=(in[2]&0x02)》》1;

D14=(in[2]&0x04)》》2; D15=(in[2]&0x08)》》3;

D16=in[5]&0x01; D17=(in[5]&0x02)》》1;

D18=(in[5]&0x04)》》2; D19=(in[5]&0x08)》》3;

D20=in[4]&0x01; D21=(in[4]&0x02)》》1;

D22=(in[4]&0x04)》》2; D23=(in[4]&0x08)》》3;

P7=0;

P6=0;

P5=D10^D11^D12^D13^D14^D15^D16^D17^D18^D19^D21^D22^D23;

P4=D4^D5^D6^D7^D8^D9^D16^D17^D18^D19^D20^D22^D23;

P3=D1^D2^D3^D7^D8^D9^D13^D14^D15^D19^D20^D21^D23;

P2=D0^D2^D3^D5^D6^D9^D11^D12^D15^D18^D20^D21^D22;

P1=D0^D1^D3^D4^D6^D8^D10^D12^D14^D17^D20^D21^D22^D23;

P0=D0^D1^D2^D4^D5^D7^D10^D11^D13^D16^D20^D21^D22^D23;

res = ((P7&0x01)*8+(P6&0x01)*4+(P5&0x01)*2+(P4&0x01))*16+(P3&0x01)*8+(P2&0x01)*4+(P1&0x01)*2+(P0&0x01);

printf(“Result:0x%02X\r\n”,res);

return 0;

}

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 汉明码
    +关注

    关注

    0

    文章

    8

    浏览量

    8075
收藏 人收藏

    评论

    相关推荐

    实现汉明纠错码的编码和解码方案设计

    理解汉明码首先要理解奇偶校验,奇校验就是在一串编码里增加一位校验位使这一串编码里的1的个数位奇数。偶校验同理,使编码里1的个数为偶数。
    发表于 05-04 09:00 3006次阅读
    实现汉明纠错码的<b class='flag-5'>编码</b>和解码方案设计

    [6.6.1]--汉明码

    编码信息论
    jf_75936199
    发布于 :2023年01月08日 15:31:52

    请问汉明码(7,4)一共有多少种码字呢?

    我觉得应该是2^4=16种吧?汉明码(12,8)就是2^8=256种?请问对不对?
    发表于 05-22 00:09

    基于FPGA的交织编码技术研究及实现

    26期摘  要:对于采用信道编码技术进行纠错的系统,只能纠正随机错误,无法解决突发错误的问题。详细阐述了一种基于汉明码的交织编码技术,并以FPGA为平台进行了实现与仿真。仿真结果表明该交织编码
    发表于 05-11 14:09

    基于FPGA的汉明码译码器如何对码元数据添加噪声干扰?

    入门小白求助,我最近在做毕业设计的时候 看到一篇《基于FPGA的汉明码译码器》相关论文,其中学者对该译码器是这样设计的(附图),我想问一下在noise_add模块中是如何向输入数据添加噪声干扰
    发表于 02-26 23:29

    【原创】基于FPGA的汉明码编码解码设计

    基于FPGA的汉明码编码解码设计实验简述本实验的目的是实现汉明纠错码的编码和解码1.1汉明码简介 汉明码,是在电信领域的一种线性调试码,以发
    发表于 04-15 11:47

    如何提高汉明码的纠错能力?

    汉明码纠错原理是什么?怎样实现汉明码对连续多位差错纠正?怎样去设计汉明码测试程序?
    发表于 04-27 06:22

    提高汉明码对突发干扰的纠错能力

    在简要介绍汉明码编码原理的基础上,详细分析干扰对汉明码纠错的影响;通过对汉明码重新组织排列,在不增加代码冗余度的前提下,提高
    发表于 04-15 11:34 20次下载

    PIC单片机串行通信中的汉明编码自动检纠错

    基于汉明码(Hamning Code)编码方式实现串行通信中的自动检纠错功能。重点分析汉明码编码方式和纠错方式,并介绍实现算法。在算法中,将
    发表于 05-16 14:09 27次下载

    一种基于汉明码和湿纸码的隐写算法

    该文通过将载体图像分割成矩阵块,重复利用载体矩阵块像素,结合汉明码和湿纸码构造了一种新的双层结构隐写算法。该算法首先利用汉明码在载体矩阵的行向量中嵌入信息,然
    发表于 02-09 14:45 8次下载

    汉明码,汉明码是什么意思

    汉明码,汉明码是什么意思 汉明码是一种能够纠正单个错误的线性分组码。它有以下特点: (1)最小码距
    发表于 03-17 17:41 8419次阅读

    汉明码计算及其纠错原理详解

    汉明码(Hamming Code),是在电信领域的一种线性调试码,以发明者理查德·卫斯里·汉明的名字命名。汉明码在传输的消息流中插入验证码,以侦测并更正单一比特错误。由于汉明编码简单,它们被广泛应用于内存(RAM )。
    的头像 发表于 03-02 15:08 3w次阅读
    <b class='flag-5'>汉明码</b>计算及其纠错原理详解

    汉明码编译码器的数据手册免费下载

    本文档的主要内容详细介绍的是汉明码编译码器的数据手册免费下载。
    发表于 12-13 08:00 0次下载
    <b class='flag-5'>汉明码</b>编译码器的数据手册免费下载

    汉明码纠错的基本原理及优化解决方案

    通信数据量不大,还可以缩短编码长度,比如采用[8,4,3]8比特汉明码。这样虽然有效信息只是总编码长度的50%,但比起出现多个差错后而要求发送方重发数据要好。
    的头像 发表于 09-16 17:52 1.5w次阅读
    <b class='flag-5'>汉明码</b>纠错的基本原理及优化解决方案

    汉明码编译码文档

    电子发烧友网站提供《汉明码编译码文档.doc》资料免费下载
    发表于 11-17 16:04 2次下载
    <b class='flag-5'>汉明码</b>编译码文档