董赟荣、王新昊、潘悦、顾海军、郭金虎——纠错编码概述及汉明码的编码方式

目录

一、纠错编码概述   

二、汉明码(Hamming code)编码

2.1 汉明码的简介与历史

2.2 汉明码的原理与结构

 2.2.1 编码方式一

2.2.2 编码方式二

2.3 汉明码的纠错

2.4 汉明码的实现

目录

一、纠错编码概述   

二、汉明码(Hamming code)编码

2.1 汉明码的简介与历史

2.2 汉明码的原理与结构

 2.2.1 编码方式一

2.2.2 编码方式二

2.3 汉明码的纠错

三、其他纠错编码

3.1 卷积码(Convolutional code)

3.2 RS码(Reed-Solomon code)

四、总结与讨论


三、其他纠错编码

3.1 卷积码(Convolutional code)

3.2 RS码(Reed-Solomon code)

四、总结与讨论


一、纠错编码概述   

      纠错编码(Error correction code)是一种用于在传输过程中检测和纠正错误的编码方法。在数据传输过程中,由于噪声、干扰或其他原因,数据可能会发生错误。纠错编码通过在发送数据时添加冗余信息,使接收端能够检测并纠正部分错误。常见的纠错编码方法包括汉明码(Hamming code)卷积码(Convolutional code)RS码(Reed-Solomon code)等。

      纠错编码的原理通常是通过添加冗余比特来构造编码序列,使得接收端可以根据收到的编码序列进行错误检测和纠正。其中,错误检测是指接收端能够确定收到的编码序列是否有错误;错误纠正是指接收端能够根据收到的编码序列恢复出原始数据。不同的纠错编码方法有不同的纠错能力,即可以纠正的最大错误数量。

      纠错编码在许多通信系统中得到广泛应用,特别是在无线通信、存储系统和数字传输等领域。通过使用纠错编码,可以提高数据传输的可靠性和容错性,减少数据传输中的错误率,从而提高系统的性能和可靠性。

      本文着重介绍汉明码(Hamming code)。

二、汉明码(Hamming code)编码

2.1 汉明码的简介与历史

      汉明码(Hamming Code),是在电信领域的一种线性调试码,以发明者理查德·卫斯里·汉明的名字命名。汉明码在传输的消息流中插入验证码,当计算机存储或移动数据时,可能会产生数据位错误,以侦测并更正单一比特错误。由于汉明编码简单,它们被广泛应用于内存(RAM)和磁盘纠错的编码。汉明码不仅可以用来检测转移数据时发送的错误,还可以用来修正作物。(汉明码只能发现和修正一位错误,对于两位及两位以上的错误无法发现和纠正)。

      1940年,汉明于贝尔实验室(Bell Labs)工作,运用贝尔模型V(Bell Model V)电脑,一个周期时间在几秒钟内的机电继电器机器。输入端是依靠打孔卡(Punched Card),这不免有些读取错误。在平日,特殊代码将发现错误并闪灯(flash lights),使得操作者能够纠正这个错误。在周末和下班期间,在没有操作者的情况下,机器只会简单地转移到下一个工作。汉明在周末工作,他对于不可靠的读卡机发生错误后,总是必须重新开始项目变得愈来愈沮丧。在接下来的几年中,他为了解决调试的问题,开发了功能日益强大的调试算法。在1950年,他发表了今日所称的汉明码,现在汉明码有着广泛的应用。

2.2 汉明码的原理与结构

      汉明码的核心思想是在原始数据中插入冗余比特,以便在传输或存储过程中能够检测出错误并进行纠正。它采用了一种特殊的矩阵结构,称为汉明校验矩阵。首先,假设我们要对一个k位二进制序列进行编码,需要确定一个最小的冗余比特数量r,使得 k + r 位的编码序列能够检测并纠正最多r位的错误。将要进行检测的二进制源码为n位,为使其具有纠错能力,需要再加上k位的检测位,组成n+k=m位的二进制。那么,新增加的检测位数k应满足:

​      这就是汉明码不等式,规定所得到的m位编码位上插入特殊的校验码,其余位把源码按顺序放置。n位二进制和校验码位数k的关系:

 2.2.1 编码方式一

      编码规则:在新的编码的位上填入0(即校验位)。

在新的编码的其余位把源码按原顺序填入校验位的编码方式为:第k位校验码从则从新的编码的第位开始,每计算位的异或,跳位,再计算下一组位的异或,填入位。比如:

第1位校验码位于新的编码的第1位==1(汉明码从1位开始),计算1,3,5,7,9,11,13,15,…位的异或,填入新的编码的第1位。

第2位校验码位于新的编码的第2位== 2,计算2,3,6,7,10,11,14,15,…位的异或,填入新的编码的第2位。

第3位校验码位于新的编码的第4位 == 4,计算4,5,6,7,12,13,14,15,20,21,22,23,…位的异或,填入新的编码的第4位。

第4位校验码位于新的编码的第8位== 8,计算8-15,24-31,40-47,…位的异或,填入新的编码的第8位。

第5位校验码位于新的编码的第16位 == 16,计算16-31,48-63,80-95,…位的异或,填入新的编码的第16位。

编码示例:以10101源码为例,n = 5,由公式≥n+k得k = 4,如下表所示编码结果为001101011。

计算校验码的第1位(1,3,5,7,9进行异或): 结果为0,所以汉明码第2^0位为0,结果为0 _ 1 _ 0 10 _ 1

计算校验码的第2位(2,3,6,7进行异或): 结果为0,所以汉明码第2^1位为0,结果为001 _ 0 10 _ 1

计算校验码的第3位(4,5,6,7进行异或): 结果为1,所以汉明码第2^2位为1,结果为0011 0 10 _ 1

计算校验码的第4位(8, 9进行异或): 结果为1,所以汉明码第2^3位为1,结果为001101011

所以最终编码为001101011。

2.2.2 编码方式二

      编码规则:通过k值将源码分为组,第1组为 ,第2组为,第3组为,同理以此类推分组按照同时分组后插入的校验码的位置也是按照次规律插入,位插入第1个校验码,即组第1位,位插入第2个校验码,即组第1位,位插入第3个校验码,即组第1位,以此类推。

同时也可以通过下表方式来划分组。

将编号转成二进制从右向左,如果第1位是1,例如编号是1,3,5,7…的就分入P1组,如果第2位是1的,例如编号2,3,6,7,10…的就分入第P2组,以此类推将所有的编号分入相应的组中。

当分好组之后,P1组中第1位(校验位)应使1,3,5,7,9,11…位中“1”的个数为偶数。P2组中第2位(校验位)应使2,3,6,7,10,11,14,15…位中“1”的个数为偶数。P3组中第4位(校验位)应使4,5,6,7,12,13,14,15…位中“1”的个数为偶数。汉明码还存在配奇原则,与之相反。

编码示例: 以10101源码为例n = 5,由公式≥n+k得k = 4,,如下表所示编码结果为001101011,C1,C2,C3,C4为插入的校验码。

如果按照配偶原则来配置汉明码,则C1应使1,3,5,7,9位中“1”的个数为偶数;C2应使2,3,6,7位中“1”的个数为偶数;C3应使4,5,6,7位中“1”的个数为偶数;C4应使8,9位中的“1”的个数为偶数。所以10101源码的汉明码为001101011。

2.3 汉明码的纠错

      根据以上说的汉明码的配偶原则和配奇原则我们来看汉明码的纠错。设接收到的错误汉明码(按配偶原则配置)是001101001,我们可以根据上述规律来确定出错位。

      那么新的检测位为:

P1=1位^ 3位^ 5位^ 7位^ 9位,得到0。

P2=2位^ 3位^ 6位^ 7位,得到0。

P3=4位 ^ 5位^ 6位^ 7位,得到0。

P4=8位^ 9位,得到1。

​      根据P4P3P2P1构成的二进制是1000,将1000转换成十进制为8,说明是第8位出错,或者根据配偶原则的规律,其“1”的个数必须是偶数也能判断出是第8位,所以第8位应将“1”改为“0”,那么正确的汉明码应为001101011。

​      汉明码属于分组奇偶校验,P4P3P2P1=0000,说明接收方生成的校验位和收到的校验位相同,否则不同说明出错。由于分组时校验位只参加一组奇偶校验,有效信息参加至少两组奇偶校验,若果校验位出错,P4P3P2P1的某一位将为1,刚好对应位号8、4、2、1;若果有效信息出错,将引起P4P3P2P1中至少两位为1。

2.4 汉明码的代码实现

以下是使用 MATLAB 编写的汉明编码实现示例:

function hammingCode = encodeHamming(bits)
    % 计算奇偶校验位数
    numParityBits = ceil(log2(length(bits) + 1));
    
    % 插入奇偶校验位
    hammingCode = zeros(1, length(bits) + numParityBits);
    pIndex = 1;
    bIndex = 1;
    for i = 1:length(hammingCode)
        if pIndex == i
            hammingCode(i) = NaN; % 标记为奇偶校验位
            pIndex = pIndex * 2;
        else
            hammingCode(i) = bits(bIndex);
            bIndex = bIndex + 1;
        end
    end
    
    % 设置奇偶校验位的值
    for i = 1:numParityBits
        mask = bitshift(1, i-1);
        parity = mod(sum(hammingCode(bitand([1:length(hammingCode)], mask) ~= 0)), 2);
        hammingCode(mask) = parity;
    end
end

将上面的代码保存为一个名为 encodeHamming.m 的 MATLAB 函数文件。此函数接受一个位数组作为输入,并返回插入了奇偶校验位的汉明编码。

三、其他纠错编码

3.1 卷积码(Convolutional code)

      卷积码(Convolutional code)的计算方法主要涉及到两个部分:编码和解码。下面我将简要介绍这两个部分的计算方法。

编码步骤如下:

初始化状态寄存器:根据卷积码的特定结构,初始化一个或多个状态寄存器为初始状态。
输入数据位处理:按照编码率将输入数据位进行分组。
生成冗余位:对于每个输入数据组,通过与生成多项式进行卷积运算生成相应数量的冗余位。
更新状态寄存器:根据当前输入数据以及生成多项式,更新状态寄存器的值。
输出:将输入数据位和冗余位组合起来作为编码后的输出。


解码(使用Viterbi算法)

初始化:初始化Viterbi解码器的状态度量,以及路径度量和路径回溯等相关参数。
接收数据位:接收编码后的数据位序列。
计算度量值:根据接收到的数据位和已知生成多项式,计算每个可能状态的度量值。
更新路径度量和路径回溯:根据度量值,更新当前的路径度量和路径回溯信息。
进行决策:通过比较不同路径的度量值,选择最可能的路径作为解码后的输出。
回溯:根据路径回溯信息,从最可能路径回溯到起始状态,得到解码后的数据位序列。

      需要注意的是,卷积码的计算方法涉及到一系列复杂的数学运算和算法,特别是Viterbi解码算法。因此,在实际应用中,通常会使用专门的编码器和解码器芯片来处理卷积码的计算,以提高效率和准确性。

3.2 RS码(Reed-Solomon code)

      RS码(Reed-Solomon code)是一种具有纠错能力的块编码技术。它的计算公式如下:

      编码: 假设要发送的数据为 D = d[0], d[1], d[2], ...,其中 d[i] 表示第 i 个数据位。
RS码的编码过程可以用以下公式表示:
R(x) = D(x) * x^(N-K) mod G(x)

其中 R(x) 是编码后的结果,D(x) 是输入数据的多项式表示,x 是多项式变量,N 是码字长度,K 是信息位长度,G(x) 是生成多项式。

      解码: 假设接收到的码字为 R = r[0], r[1], r[2], ...,其中 r[i] 表示第 i 个接收到的码字位。
RS码的解码过程主要使用了幂残差定理和Forney修正。解码的公式如下:

S(x) = R(x) mod G(x)
E(x) = Ω(x) * S(x) mod x^N-K

其中 S(x) 是解码后的结果,Ω(x) 是错误定位多项式,E(x) 是纠错多项式。

通过求解多项式 E(x) 的根,可以确定错误发生的位置,并根据根的位置进行纠错。

需要注意的是,这里的乘法运算和模运算都是在有限域上进行的,常用的是GF(256)有限域。具体的计算方法会涉及到有限域上的数学运算和矩阵运算等,实际应用中通常使用专门的编码器和解码器芯片来处理RS码的计算,以提高效率和准确性。

四、总结与讨论

      在现代通信和数据存储系统中,数据传输和存储的可靠性是至关重要的。然而,由于信道噪声、传输错误或存储介质损坏等因素的存在,数据可能会发生错误。为了解决这个问题,纠错编码技术被广泛应用。汉明码通过插入冗余比特来实现错误检测和纠正。它具有简单、高效、纠错能力强等特点,被广泛应用于存储介质、通信领域等需要高可靠性的数据传输和存储场景中。阻碍通信质量进一步提高的根本因素是运算和设备的复杂度。可以期望,随着大规模集成电路和信号处理技术的发展,信道编码技术将会会继续发展。


研究小组成员

P02114146 董赟荣  P02114147 王新昊  P02114148 潘悦  P02114151 顾海军  P02114153 郭金虎 

指导教师:李莉萍

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值