汉明码卷积码实验Word文档格式.docx
《汉明码卷积码实验Word文档格式.docx》由会员分享,可在线阅读,更多相关《汉明码卷积码实验Word文档格式.docx(32页珍藏版)》请在冰豆网上搜索。
这些监督码元和信息码元之间有一定的关系,使接收端可以利用这种关系由信道译码器来发现或纠正可能存在的错码。
在信息码元序列中加入监督码元就称为差错控制编码,有时也称为纠错编码。
不同的编码方法有不同的检错或纠错能力。
有的编码就只能检错不能纠错。
汉明码是一种能够纠正一位错码且编码效率较高的线性分组码。
汉明码是一种多重(复式)奇偶检错系统。
它将信息用逻辑形式编码,以便能够检错和纠错。
用在汉明码中的全部传输码字是由原来的信息和附加的奇偶监督位组成的。
每一个这种奇偶位被编在传输码字的特定比特位置上。
推导并使用长度为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<
iostream>
#include<
string>
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请给定("
n<
,"
k<
)汉明码的监督矩阵H["
r<
]["
]:
endl;
H=newint*[r+1];
for(i=0;
i<
r+1;
i++)
H[i]=newint[n+1];
r;
for(j=0;
j<
n;
j++)
cin>
>
H[i][j];
//初始化增余项
n+1;
j++)H[r][j]=1;
i++)H[i][n]=0;
//为X分配存储单元
X=newint[n+1];
X[j]=0;
Get_H_Column();
//获取监督矩阵的每一列
Get_H_Column_Z();
//进一步获取增余监督矩阵的每一列
}
Get_H_Column()
{stringtemp;
H_Column=newstring[n+1];
{temp="
;
{if(!
H[j][i])temp+='
0'
elsetemp+='
1'
H_Column[i]=temp;
H_Column[n]="
000"
}//获取增余监督矩阵的每一列,用于增余汉明码校码
Get_H_Column_Z()
{H_Column_Z=newstring[n+2];
H_Column_Z[i]=H_Column[i]+'
H_Column_Z[n+1]="
0000"
}
Show_H(intx,inty)
{for(i=0;
x;
{for(j=0;
y;
H[i][j]<
"
}}
Get_G()
{G=newint*[k];
k;
G[i]=newint[n];
{if(i==j)G[i][j]=1;
elseG[i][j]=0;
G[j][i+k]=H[i][j];
Show_G(intx,inty){
Get_G();
G[i][j]<
HM_Efficiency_Analysing()
{cout<
\t\t\t对("
,"
)汉明码的评价:
("
,"
)汉明码的效率E=k/n*100%="
k*1.0/n*100<
%"
)汉明码的错误概率P=n*(n-1)*Pe*Pe="
n*(n-1)*Pe*Pe<
/*********************************编码模块*********************************///二进制序列合理性检测
intHMCoding:
Binary_Str_Check(stringtemp)
{intflag=1;
//先假设输入的消息串不含除0、1外的字符
for(inti=0;
temp[i]!
='
\0'
{
if(!
(temp[i]=='
||temp[i]=='
))
{flag=0;
break;
returnflag;
}//汉明码编码
Encoding()
{A:
stringbinary_str;
intflag;
intbinary_num=0;
请输入待编码的二进制序列:
binary_str;
flag=Binary_Str_Check(binary_str);
while(binary_str[binary_num]!
)
binary_num++;
/*统计输入的二进制序列所含码元个数*/
if(binary_num%k!
=0&
&
flag)/*序列所含码元个数不是k的整数倍,无法全部编码*/
{cout<
您输入的二进制序列存在冗余,请重新输入!
\n"
gotoA;
if(binary_num%k!
!
flag)
您输入的二进制序列存在冗余且含除0、1外的字符,请重新输入!
if(binary_num%k==0&
您输入的二进制序列含除0、1外的字符,请重新输入!
code_str="
binary_num;
i=i+k)
j++)/*获取k位信息元*/
{if(binary_str[i+j]=='
elseX[j]=1;
inttemp;
stringpartial_str="
for(intt=0;
t<
t++)
{/*用k位信息元组成的向量与生成矩阵作矩阵乘法,得到对应n元码组*/
temp=0;
temp+=X[j]*G[j][t];
if(temp%2==0)partial_str+='
elsepartial_str+='
code_str+=partial_str;
\t\t\t进行("
)汉明码编码后的二进制序列为:
code_str<
Encoding_Z()
{code_str="
A_Z:
stringbinary_str;
flag)/*序列所含码元个数不是k的整数倍,无法全部编码*/
输入的二进制序列存在冗余,请重新输入!
gotoA_Z;
输入的二进制序列存在冗余且含除0、1外的字符,请重新输入!
输入的二进制序列含除0、1外的字符,请重新输入!
for(j=0;
temp+=X[j]*G[j][t];
if(temp%2==0)
{partial_str+='
X[j+k]=0;
else{partial_str+='
X[j+k]=1;
//生成增余汉明码最后一位
//监督规则:
对原汉明码所有n个码元取模2和
intsum=0;
sum+=X[j];
if(sum%2==0)
partial_str+='
进行("
n+1<
,"
)增余汉明码编码后的二进制序列为:
\n"
/*********************************校码模块*********************************/
//利用汉明码校码
Checking()
B:
请输入待译的二进制序列:
)
/*统计输入的二进制序列所含码元个数*/
if(binary_num%n!
/*序列所含码元个数不是n的整数倍,无法全部译码*/
gotoB;
}
flag)
if(binary_num%n==0&
code_num=binary_num/n;
//统计n元码组的个数
check_code=newint*[code_num];
code_num;
check_code[i]=newint[n];
i++)
{/*每次取n个码元进行校正*/
{check_code[i][j]=binary_str[i*n+j]-'
Get_Judge_Result();
//利用增余汉明码校码
Checking_Z()
{B_Z:
if(binary_num%(n+1)!
flag)/*序列所含码元个数不是n+1的整数倍,无法全部译码*/
gotoB_Z;
输入的二进制序列存在冗余且含除0、1外的字符,请重新输入!
if(binary_num%(n+1)==0&
code_num_z=binary_num/(n+1);
//统计n+1元码组的个数
check_code=newint*[code_num_z];
code_num_z;
check_code[i]=newint[n+2];
{/*每次取n+1个码元进行校正*/
{check_code[i][j]=binary_str[i*(n+1)+j]-'
Get_Judge_Result_Z();
}//获取汉明码校码结果
Get_Judge_Result()
{inttemp;
stringpartial_str;
("
)汉明码校码结果如下:
码组状态"
partial_str="
{temp=0;
temp+=H[i][j]*check_code[t][j];
if(temp%2==0)
}//对partial_str进行判断
for(i=0;
{if(H_Column[i]==partial_str)
{flag=1;
if(flag&
n)//表示第i个码元出错,将其改正
{for(j=0;
check_code[t][j];
cout<
第"
i+1<
位错,可纠正"
;
check_code[t][i]=(check_code[t][i]+1)%2;
//1变0,0变1
i==n)//表示全对
全对"
}//获取增余汉明码校码结果
Get_Judge_Result_Z()
)增余汉明码校码结果如下(注:
*表示无法识别的码元):
码组状态校正后"
n+2;
{if(H_Column_Z[i]==partial_str)
if(flag&
n+1)//表示第i个码元出错,将其改正
{check_code[t][n+1]=1;
//表示正确接收
j++)cout<
i==n+1)//表示全对
{check_code[t][n+1]=0;
//表示两位出错并无法纠正
某两位出错,无法纠正"
'
*'
//*表示无法正确识别的码元
}}
/*********************************译码模块*********************************/
//利用汉明码译码
Decoding()
)汉明码译码结果为:
check_code[i][j];
}//利用增余汉明码译码
Decoding_Z()
)增余汉明码译码结果为(注:
*表示无法识别的码元):