实验三 汉明码编码与译码

  • 格式:doc
  • 大小:96.50 KB
  • 文档页数:11

实验三 汉明码编码与译码

一、实验题目

1、写一个错误生成器模块,在给定的一个比特流作输入时,它的输出流的每个比特流都以概率p发生了改变,即比特错误概率为p。

2、对m=3,将汉明码编码后的比特流输入到上述模块,然后对收到的字用译码器进行译码。

二、实验目的

1、理解和掌握汉明码编码与译码的原理;

三、算法设计

四、程序分析

1、错误生成模块:任一给以p,系统任意生成一数,若比p小则让其出错,否则不出错。

2、编码:首先随机生成H矩阵,由H矩阵生成G矩阵,利用C=mG编码。

3、解码:

若v*H’=0,则没有出错,直接输出v中前k位;

若v*H’!=0,列出所有的e和e*H’得到伴随阵s,若能在s中找到s=v*H

则c0=v-e,输出c0中前k位;若找不到s,则输出“错误位数大于纠错能力,无法解码”。

五、程序代码

#include

#include // 字符串处理头文件

#include // 输入输出控制头文件

#include

#include

#include

using namespace std;

void Err_Pro();

void Hamming_Decode();

int

m,n,k,t,err,r,R[100],N[100],COUNT[100],num[100][100],Th[100][100],PT_S[100][100],PT_D[100][100];

int

H[100][100],HT[100][100],Ig[100][100],P[100][100],G[100][100],Ibit[100],Cbit[100],Err_Cbit[100],V[100];

/**************************************************************************/

/*函数名:void Binary_Conversion(int i) */

/*功能:十-二进制转换 */

/*说明:该函数输出二进制数为低位在前,高位在后 */

/**************************************************************************/

void Binary_Conversion(int i)

{

int j=0,temp=0;

do // 生成完整n个二进制

{

temp = i % 2; // 判断相应最低位为0或1(若为2的倍数则为0,否则为1)

i = i / 2; // 为考虑前一位为0或1做准备

if(j < m) // m确定二进制的位数 {

N[j] = temp;

j++;

}

}while(i != 0); // 等待i等于0(即等待十进制数为0时不进行二进制转换)

}

/**************************************************************************/

/*函数名:void Random_Array() */

/*功能:将数组的列随机排放 */

/**************************************************************************/

void Random_Array()

{

srand(unsigned(time(NULL))); // 随机生成条件(抵消rand函数伪随机效果)

cout << endl << "产生随机数为:" << endl;

for(int j=0;j

{

loop:r= rand() % n; // 随机生成范围为0~n-1的正整数

for(int i=0;i

{

if(R[i] == r) // 如果随机产生的数与已产生的数相等,则重新随机产生数

{

goto loop;

}

}

R[j] = r; // 产生不重复的随机数

cout << setw(4) << r + 1;

for(int i=0;i

{

PT_D[i][j] = PT_S[i][r]; // 顺序转置系数矩阵->随机转置系数矩阵

}

}

}

/**************************************************************************/

/*函数名:void Creat_H() */

/*功能:创建系统型奇偶校验矩阵H */

/*说明:系统型奇偶校验矩阵H由转置负系数矩阵和单位矩阵组成 */

/**************************************************************************/

void Creat_H()

{ int i,j,count0=0,count1=0,count2=0,count3=0;

/*************生成单位矩阵Ih************/ //教材P101

for(i=0;i

{

for(j=0;j

{

if((j >= k) && (i+k == j))

Ih[i][j] = 1;

else

Ih[i][j] = 0;

}

}

/*********生成转置负系数矩阵PT**********/

for(i=0;i

{

for(j=0;j

{

PT_S[i][j] = num[j][i]; // 生成顺序转置系数矩阵

}

}

Random_Array();//将数组的列随机排放

for(j=0;j

{

for(i=0;i

{

if(PT_D[i][j] == 0)

count0 ++;

}

count1 = count0; // count1记录每一列1的个数

count0 = 0;

if(count1 == (m-1)) // 将只有一位为1其余位为0的列的所有位置0

{

for(i=0;i

{

PT_D[i][j] = 0;

}

}

else

// COUNT数组记录只有一位为1其余位为0的列为0,其余位的值为PT_D列的位置值+1

COUNT[count2] = j + 1; count2 ++;

}

for(int q=0;q

{

if(COUNT[q] > 0)

{

for(i=0;i

PT[i][count3] = PT_D[i][q];

count3 ++;

}

}

cout << endl;

/********生成系统型奇偶校验矩阵H********/

for(i=0;i

{

for(j=0;j

{

H[i][j] = PT[i][j] + Ih[i][j];

}

}

cout << endl << "系统型奇偶校验矩阵H为:" << endl;

for(i=0;i

{

for(j=0;j

{

cout << setw(2) << H[i][j] << setw(2);

}

cout << endl;

}

}

/**************************************************************************/

/*函数名:void Creat_G() */

/*功能:创建系统型生成矩阵G */

/*说明:系统型生成矩阵G由单位矩阵和系数矩阵组成 */

/**************************************************************************/

void Creat_G()

{

int i,j;

/*************生成单位矩阵Ig************/

for(i=0;i

{

for(j=0;j

{ if(i == j)

Ig[i][j] = 1;

else

Ig[i][j] = 0;

}

}

/*************生成系数矩阵P*************/

for(j=0;j

{

for(i=0;i

{

if(j>k-1)

P[i][j] = PT[j-k][i];

}

}

/**********生成系统型生成矩阵G**********/

for(i=0;i

{

for(j=0;j

{

G[i][j] = P[i][j] + Ig[i][j];

}

}

cout << endl << "系统型生成矩阵G为:" << endl;

for(i=0;i

{

for(j=0;j

{

cout << setw(2) << G[i][j] << setw(2);

}

cout << endl;

}

}

/*******************************主函数*************************************/

int main()

{

int i,j;

cout << setw(30) << "汉明码" << endl;