实验三 汉明码编码与译码
- 格式: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;