Hamming码实验
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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++;
}