信息论与编码实验四.docx
《信息论与编码实验四.docx》由会员分享,可在线阅读,更多相关《信息论与编码实验四.docx(37页珍藏版)》请在冰豆网上搜索。
信息论与编码实验四
信息论与纠错编码实验报告
第四次实验
一.实验要求:
信源编码和信道编码的联合编译码实现信源符号经过信源编码后在进行信道编码,经过信道后码字产生错误跳变,体现信道编码纠检错的功能,再进行信道译码和信源译码后,输出译出的信源符号。
理解信源编码和信道编码的区别及联系。
二.实验代码:
代码:
#include
#include
#include
#defineMAXNUM1001
#defineNUM9
#definePe0.0001
usingnamespacestd;
stringinput1();
voidinputi();
voiddecode1(string);
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();
};
/*********************************初始化模块*********************************/
voidHMCoding:
:
Initializing(int_n,int_k)
{
n=_n;
k=_k;
r=_n-_k;
cout<<"请给定("<"<H=newint*[r+1];//初始化(n,k)汉明码监督矩阵
for(i=0;iH[i]=newint[n+1];
for(i=0;ifor(j=0;jcin>>H[i][j];//初始化增余项
for(j=0;jH[r][j]=1;
for(i=0;iH[i][n]=0;//为X分配存储单元
X=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';
else
temp+='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<cout<}
}
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<<"对("<"<cout<<"("<cout<<"("<inputi();
}
/*********************************编码模块*********************************/
//二进制序列合理性检测
intHMCoding:
:
Binary_Str_Check(stringtemp)
{
intflag=1;//先假设输入的消息串不含除0、1外的字符
for(inti=0;i{
if(!
(temp[i]=='0'||temp[i]=='1'))
{
flag=0;
break;
}
}
returnflag;
}
//汉明码编码
voidHMCoding:
:
Encoding()
{
A:
stringbinary_str;
intflag;
intbinary_num=0;
binary_str=input1();//将Huffman编码后结果作为信道编码输入
flag=Binary_Str_Check(binary_str);
while(binary_numbinary_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<<"进行("<\n"<}
//增余汉明码编码
voidHMCoding:
:
Encoding_Z()
{
code_str="";
A_Z:
stringbinary_str;
intflag;
intbinary_num=0;
binary_str=input1();//将Huffman编码后结果作为信道编码输入
flag=Binary_Str_Check(binary_str);
while(binary_numbinary_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';
else
partial_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_numbinary_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_numbinary_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';
else
partial_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<<"("<*表示无法识别的码元):
"<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';
else
partial_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<cout<<"第"<
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()
{
stringdecstr;
cout<<"("<"<for(i=0;i{
for(j=0;j{
cout<if(!
check_code[i][j])
decstr+='0';
else
decstr+='1';
}
}