汉明码卷积码实验.docx
《汉明码卷积码实验.docx》由会员分享,可在线阅读,更多相关《汉明码卷积码实验.docx(32页珍藏版)》请在冰点文库上搜索。
汉明码卷积码实验
天津理工大学实验报告
学院(系)名称:
计算机与通信工程学院
姓名
马生琴
学号
20135680
专业
信息与计算科学
班级
2013级1班
实验项目
抗干扰信道编码、译码
课程名称
信息论基础
课程代码
0665066
实验时间
2015年12月14日3、4节
实验地点
7号楼219
批改意见
成绩
教师签字:
实验目的:
1、使用编程软件进汉明码码编译器的代码编写、运行、仿真等操作。
2、使用编程软件进行卷积码编译器的代码编写、运行、仿真等操作。
3、熟练掌握相关软件、语句。
4、理解汉明码编译及卷积码编解码器的原理、知识
汉明码实验原理:
在随机信道中,错码的出现是随机的,且错码之间是统计独立的。
例如,由高斯白噪声引起的错码就具有这种性质。
因此,当信道中加性干扰主要是这种噪声时,就称这种信道为随机信道。
由于信息码元序列是一种随机序列,接收端是无法预知的,也无法识别其中有无错码。
为了解决这个问题,可以由发送端的信道编码器在信息码元序列中增加一些监督码元。
这些监督码元和信息码元之间有一定的关系,使接收端可以利用这种关系由信道译码器来发现或纠正可能存在的错码。
在信息码元序列中加入监督码元就称为差错控制编码,有时也称为纠错编码。
不同的编码方法有不同的检错或纠错能力。
有的编码就只能检错不能纠错。
汉明码是一种能够纠正一位错码且编码效率较高的线性分组码。
汉明码是一种多重(复式)奇偶检错系统。
它将信息用逻辑形式编码,以便能够检错和纠错。
用在汉明码中的全部传输码字是由原来的信息和附加的奇偶监督位组成的。
每一个这种奇偶位被编在传输码字的特定比特位置上。
推导并使用长度为m位的码字的汉明码,所需步骤如下:
1、确定最小的监督位数k,将它们记成D1、D2、…、Dk,每个监督位符合不同的奇偶测试规定。
2、原有信息和k个监督位一起编成长为m+k位的新码字。
选择k监督位(0或1)以满足必要的奇偶条件。
3、对所接收的信息作所需的k个奇偶检查。
4、如果所有的奇偶检查结果均为正确的,则认为信息无错误。
如果发现有一个或多个错了,则错误的位由这些检查的结果来唯一地确定。
卷积码实验原理:
卷积码将k个信息比特编成n个比特,但k和n通常很小,特别适合以串行形式进行传输,时延小。
与分组码不同,卷积码编码后的n个码元不仅与当前段的k个信息有关,还与前面的N-1段信息有关,编码过程中互相关联的码元个数为nN。
卷积码的纠错性能随N的增加而增大,而差错率随N的增加而指数下降。
汉明码程序编写:
#include
#include
usingnamespacestd;
#definePe0.0001
classHMCoding{
private:
intn,k,r;//汉明码参数
inti,j;//用于指示循环次数
int**H,*X,**G,**check_code;
string*H_Column,*H_Column_Z,code_str;
intcode_num,code_num_z;
public:
voidInitializing(int,int);
voidShow_H(int,int);
voidGet_G();
voidShow_G(int,int);
voidHM_Efficiency_Analysing();/*对汉明码进行编码效率分析*/
intBinary_Str_Check(string);
voidEncoding();//汉明码编码
voidEncoding_Z();//增余汉明码编码
voidDecoding();//汉明码译码
voidDecoding_Z();//增余汉明码译码
voidGet_H_Column();//获取汉明码监督矩阵的每一列
voidGet_H_Column_Z();//获取增余汉明码监督矩阵的每一列
voidGet_Judge_Result();//获取汉明码校码结果
voidGet_Judge_Result_Z();//获取增余汉明码校码结果
voidChecking();//汉明码校码
voidChecking_Z();//增余汉明码校码
voidGOTO_HMCding_Z();
};
HMCodinghmcoding;//全局变量
voidHMCoding:
:
Initializing(int_n,int_k)
{n=_n;k=_k;r=_n-_k;cout<<"\t\t\t请给定("<"<for(i=0;iH[i]=newint[n+1];
for(i=0;ifor(j=0;jcin>>H[i][j];//初始化增余项
for(j=0;jX=newint[n+1];
for(j=0;jX[j]=0;
Get_H_Column();//获取监督矩阵的每一列
Get_H_Column_Z();//进一步获取增余监督矩阵的每一列
}
voidHMCoding:
:
Get_H_Column()
{stringtemp;
H_Column=newstring[n+1];
for(i=0;i{temp="";
for(j=0;j{if(!
H[j][i])temp+='0';
elsetemp+='1';}
H_Column[i]=temp;
}
H_Column[n]="000";
}//获取增余监督矩阵的每一列,用于增余汉明码校码
voidHMCoding:
:
Get_H_Column_Z()
{H_Column_Z=newstring[n+2];
for(i=0;iH_Column_Z[i]=H_Column[i]+'1';
H_Column_Z[n+1]="0000";}
voidHMCoding:
:
Show_H(intx,inty)
{for(i=0;i{for(j=0;jcout<}}
voidHMCoding:
:
Get_G()
{G=newint*[k];
for(i=0;iG[i]=newint[n];
for(i=0;ifor(j=0;j{if(i==j)G[i][j]=1;
elseG[i][j]=0;}
for(i=0;ifor(j=0;jG[j][i+k]=H[i][j];
}
voidHMCoding:
:
Show_G(intx,inty){
Get_G();
for(i=0;i{for(j=0;jcout<cout<}
voidHMCoding:
:
HM_Efficiency_Analysing()
{cout<<"\t\t\t对("<"<cout<<"("<cout<<"("</*********************************编码模块*********************************///二进制序列合理性检测
intHMCoding:
:
Binary_Str_Check(stringtemp)
{intflag=1;//先假设输入的消息串不含除0、1外的字符
for(inti=0;temp[i]!
='\0';i++)
{
if(!
(temp[i]=='0'||temp[i]=='1'))
{flag=0;break;}
}
returnflag;}//汉明码编码
voidHMCoding:
:
Encoding()
{A:
stringbinary_str;
intflag;intbinary_num=0;
cout<<"请输入待编码的二进制序列:
"<cin>>binary_str;flag=Binary_Str_Check(binary_str);
while(binary_str[binary_num]!
='\0')
binary_num++;/*统计输入的二进制序列所含码元个数*/
if(binary_num%k!
=0&&flag)/*序列所含码元个数不是k的整数倍,无法全部编码*/
{cout<<"您输入的二进制序列存在冗余,请重新输入!
\n";gotoA;}
if(binary_num%k!
=0&&!
flag)
{cout<<"您输入的二进制序列存在冗余且含除0、1外的字符,请重新输入!
\n";
gotoA;}
if(binary_num%k==0&&!
flag)
{cout<<"您输入的二进制序列含除0、1外的字符,请重新输入!
\n";
gotoA;}
code_str="";
for(i=0;i{for(j=0;j{if(binary_str[i+j]=='0')
X[j]=0;
elseX[j]=1;}
inttemp;
stringpartial_str="";
for(intt=0;t{/*用k位信息元组成的向量与生成矩阵作矩阵乘法,得到对应n元码组*/
temp=0;
for(j=0;jtemp+=X[j]*G[j][t];
if(temp%2==0)partial_str+='0';
elsepartial_str+='1';}
code_str+=partial_str;}
cout<<"\t\t\t进行("<\n"<//增余汉明码编码
voidHMCoding:
:
Encoding_Z()
{code_str="";
A_Z:
stringbinary_str;
intflag;
intbinary_num=0;
cout<<"请输入待编码的二进制序列:
"<cin>>binary_str;
flag=Binary_Str_Check(binary_str);
while(binary_str[binary_num]!
='\0')
binary_num++;/*统计输入的二进制序列所含码元个数*/
if(binary_num%k!
=0&&flag)/*序列所含码元个数不是k的整数倍,无法全部编码*/
{cout<<"输入的二进制序列存在冗余,请重新输入!
\n";gotoA_Z;}
if(binary_num%k!
=0&&!
flag)
{cout<<"输入的二进制序列存在冗余且含除0、1外的字符,请重新输入!
\n";gotoA_Z;}
if(binary_num%k==0&&!
flag)
{cout<<"输入的二进制序列含除0、1外的字符,请重新输入!
\n";
gotoA_Z;}
for(i=0;i{for(j=0;j{if(binary_str[i+j]=='0')
X[j]=0;
elseX[j]=1;}
inttemp;
stringpartial_str="";
for(intt=0;t{/*用k位信息元组成的向量与生成矩阵作矩阵乘法,得到对应n元码组*/
temp=0;
for(j=0;jtemp+=X[j]*G[j][t];
if(temp%2==0)
{partial_str+='0';X[j+k]=0;
}
else{partial_str+='1';X[j+k]=1;}
}
//生成增余汉明码最后一位
//监督规则:
对原汉明码所有n个码元取模2和
intsum=0;
for(j=0;jsum+=X[j];
if(sum%2==0)
partial_str+='0';
elsepartial_str+='1';
code_str+=partial_str;}
cout<<"进行("<\n"</*********************************校码模块*********************************/
//利用汉明码校码
voidHMCoding:
:
Checking()
{
B:
stringbinary_str;
intflag;
intbinary_num=0;
cout<<"请输入待译的二进制序列:
"<cin>>binary_str;
flag=Binary_Str_Check(binary_str);
while(binary_str[binary_num]!
='\0')
binary_num++;
/*统计输入的二进制序列所含码元个数*/
if(binary_num%n!
=0&&flag)
/*序列所含码元个数不是n的整数倍,无法全部译码*/
{cout<<"输入的二进制序列存在冗余,请重新输入!
\n";
gotoB;
}
if(binary_num%n!
=0&&!
flag)
{cout<<"输入的二进制序列存在冗余且含除0、1外的字符,请重新输入!
\n";
gotoB;
}
if(binary_num%n==0&&!
flag)
{cout<<"输入的二进制序列含除0、1外的字符,请重新输入!
\n";
gotoB;}
code_num=binary_num/n;//统计n元码组的个数
check_code=newint*[code_num];
for(i=0;icheck_code[i]=newint[n];
for(i=0;i{/*每次取n个码元进行校正*/
for(j=0;j{check_code[i][j]=binary_str[i*n+j]-'0';}
}
Get_Judge_Result();}
//利用增余汉明码校码
voidHMCoding:
:
Checking_Z()
{B_Z:
stringbinary_str;
intflag;
intbinary_num=0;
cout<<"请输入待译的二进制序列:
"<cin>>binary_str;
flag=Binary_Str_Check(binary_str);
while(binary_str[binary_num]!
='\0')
binary_num++;
/*统计输入的二进制序列所含码元个数*/
if(binary_num%(n+1)!
=0&&flag)/*序列所含码元个数不是n+1的整数倍,无法全部译码*/
{cout<<"输入的二进制序列存在冗余,请重新输入!
\n";
gotoB_Z;}
if(binary_num%(n+1)!
=0&&!
flag)
{cout<<"输入的二进制序列存在冗余且含除0、1外的字符,请重新输入!
\n";
gotoB_Z;
}
if(binary_num%(n+1)==0&&!
flag)
{cout<<"输入的二进制序列含除0、1外的字符,请重新输入!
\n";
gotoB_Z;}
code_num_z=binary_num/(n+1);//统计n+1元码组的个数
check_code=newint*[code_num_z];
for(i=0;icheck_code[i]=newint[n+2];
for(i=0;i{/*每次取n+1个码元进行校正*/
for(j=0;j{check_code[i][j]=binary_str[i*(n+1)+j]-'0';
}
}
Get_Judge_Result_Z();}//获取汉明码校码结果
voidHMCoding:
:
Get_Judge_Result()
{inttemp;
intflag;
stringpartial_str;
cout<<"("<"<cout<<"码组状态"<for(intt=0;t{flag=0;partial_str="";
for(i=0;i{temp=0;
for(j=0;jtemp+=H[i][j]*check_code[t][j];
if(temp%2==0)
partial_str+='0';
elsepartial_str+='1';}//对partial_str进行判断
for(i=0;i{if(H_Column[i]==partial_str)
{flag=1;break;}
}
if(flag&&i{for(j=0;jcout<cout<<"第"<
check_code[t][i]=(check_code[t][i]+1)%2;//1变0,0变1
for(j=0;jcout<if(flag&&i==n)//表示全对
{for(j=0;jcout<cout<<"全对";
for(j=0;jcout<}
cout<}//获取增余汉明码校码结果
voidHMCoding:
:
Get_Judge_Result_Z()
{inttemp;
intflag;
stringpartial_str;
cout<<"("<*表示无法识别的码元):
"<for(intt=0;t{flag=0;partial_str="";for(i=0;i{temp=0;
for(j=0;jtemp+=H[i][j]*check_code[t][j];
if(temp%2==0)
partial_str+='0';
elsepartial_str+='1';
}//对partial_str进行判断
for(i=0;i{if(H_Column_Z[i]==partial_str)
{flag=1;break;}
}
if(flag&&i{check_code[t][n+1]=1;//表示正确接收
for(j=0;jcout<<"第"<
check_code[t][i]=(check_code[t][i]+1)%2;//1变0,0变1
for(j=0;jcout<if(flag&&i==n+1)//表示全对
{check_code[t][n+1]=1;//表示正确接收
for(j=0;jcout<cout<<"全对";
for(j=0;jcout<if(!
flag)
{check_code[t][n+1]=0;//表示两位出错并无法纠正
for(j=0;jcout<cout<<"某两位出错,无法纠正";
for(j=0;jcout<<'*';//*表示无法正确识别的码元
}
cout<}}
/*********************************译码模块*********************************/
//利用汉明码译码
voidHMCoding:
:
Decoding()
{cout<<"("<"<for(i=0;i{for(j=0;jcout<}
cout<}//利用增余汉明码译码
voidHMCoding:
:
Decoding_Z()
{cout<<"("<*表示无法识别的码元):
"<for(i=0;