Hamming码实验

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

云南大学数学与统计学实验教学中心实验报告

一、实验目的:

通过实验掌握Hamming码编码实验的构造算法,以及其重要思想。

二、实验内容:

Hamming码编码实验

1.熟悉Hamming码的设计原理;

2.编程实现(15,11,3)Hamming的编码和译码算法;

3.验证Hamming码的检错能力和纠错能力

三、实验环境

Win7、Eclipse

四、实验过程(请学生认真填写):

实验过程、结果以及相应的解释:

1. 预备知识

A、与其他的错误校验码类似,汉明码也利用了奇偶校验位的概念,通过在数据位后

面增加一些比特,可以验证数据的有效性。利用一个以上的校验位,汉明码不仅

可以验证数据是否有效,还能在数据出错的情况下指明错误位置。

B、Hamming码中主要的是生成矩阵以及校验矩阵。通过得到这二者,我们就可以对

需要的字符串进行编码、检错、纠错、译码的工作了。

C、具体如下:

2. 实验过程

A、原理分析:

这里主要对如何纠错进行简要分析:编码所对应的码字为C = 0110011。若接收到R = 0110001 。有H*x=0可以判断其存在错误。Erro={1 1 0}。用Erro中的

元素与校验矩阵中的每一列表,与其中一列全部相同。则带便这一列有错。找到

第六位有错。异或运算后得到R = 0110011。

当然这里需要注意的是Hamming 码只能纠正一位错误。当出现两位错误时,将无法纠错后得到正确结果。

好了,废话不多说了。先把代码贴上来。

B、具体代码如下:

/* HammingCode的实验

*

*1.熟悉Hamming码的设计原理;

*2.编程实现(15,11,3)Hamming的编码和译码算法;

*3.验证Hamming码的检错能力和纠错能力。

*/

package HammingCode;

import java.util.Scanner;

/**

* @author卢富毓

* @see实现HammingCode的生成、检错、纠错

*

*/

public class HammingCode {

int[][] H;

int[][] G;

/**

* @param start

* () Hamming码的具体实现

* @param HMC

* 类的实例

*/

public void start(HammingCode HMC) {

int send[] = new int[11];

int receive[] = new int[15];

// step1 15,11Hamming 码的校验矩阵生成

H = HMC.CreateCheckArray();

// step1 15,11Hamming 码的生成矩阵生成

G = HMC.GenerateArray();

// 输入四个字符进行编码

System.out.print("请输入需编码的字符(0、1)11个:");

Scanner sc = new Scanner(System.in);

for (int i = 0; i < 11; i++) {

send[i] = sc.nextInt();

}

sc.reset();

HMC.encode(G, send); // 编码

System.out

.println("\n----------------------------------------------------------");

// 输入四个字符检测编码

System.out.print("请输入需译码字符(0、1)15个:");

for (int i = 0; i < 15; i++) {

receive[i] = sc.nextInt();

}

HMC.checkAndDecode(H, receive);// 检错以及译码

// sc.close();

}

/**

* @param ToBinary

* 校验矩阵十进制数转为二进制矩阵

* @return返回校验矩阵

*/

public int[][] CreateCheckArray() { // 二进制校验矩阵int m = 1;

int l = 1;

int[][] b = new int[4][16];

for (int i = 0; i < b.length; i++) {

for (int j = 1; j < b[i].length; j++) {

b[i][j] = 0;

}

}

for (int i = 1; i < 16; i++) { // 二进制

m = i;

if (i != 1 && i != 2 && i != 4 && i != 8) {

for (int j = 3; j >= 0; j--) {

b[j][l] = m % 2;

m = m / 2;

if (m < 0) {

break;

}

}

l++;

}

相关文档
最新文档