卷积码实验.docx
《卷积码实验.docx》由会员分享,可在线阅读,更多相关《卷积码实验.docx(13页珍藏版)》请在冰豆网上搜索。
卷积码实验
天津理工大学实验报告
学院(系)名称:
计算机与通信工程学院
姓名
张彩云
学号
20135683
专业
信息与计算科学
班级
2013级1班
实验项目
卷积码的编译
课程名称
信息论
课程代码
0665066
实验时间
实验地点
7号楼219
批改意见
成绩
教师签字:
实验目的:
1、使用编程软件进行卷积码编译器的代码编写、运行、仿真等操作。
2、熟练掌握相关软件、语句。
3、理解卷积码编解码器的原理、知识
实验原理:
卷积码将k个信息比特编成n个比特,但k和n通常很小,特别适合以串行形式进行传输,时延小。
与分组码不同,卷积码编码后的n个码元不仅与当前段的k个信息有关,还与前面的N-1段信息有关,编码过程中互相关联的码元个数为nN。
卷积码的纠错性能随N的增加而增大,而差错率随N的增加而指数下降
程序编写:
#include
#include
usingnamespacestd;
classJuanjiCode{
private:
inti,j,t;
intn0,k0,r0,m;
int**h,**H,**g,**G;//实现编码所需变量
intcode;
stringInfo_str,Code_str;
inttotal_num,extra_num;
public:
voidInitializing();
voidTrans_h_to_H();
voidTrans_h_to_g();
voidPrint_g();
voidTrans_g_to_G();
voidPrint_G();//编码
voidBefore_Encoding();//编码前的准备
intCheck(string);
voidEncoding();
};
/**********************初始化模块**********************/
voidJuanjiCode:
:
Initializing()
{
cout<<"请输入码字长n0=";
cin>>n0;
cout<<"请输入信息元个数k0=";
cin>>k0;
cout<<"请输入关联长度m=";
cin>>m;//监督元个数
r0=n0-k0;//动态分配存储单元
h=newint*[r0];
for(i=0;ih[i]=newint[m*n0];
cout<<"请输入("<"<for(i=0;ifor(j=0;jcin>>h[i][j];//检测,输出h
cout<<"您输入的基本监督矩阵h["<\n"<for(i=0;i{
for(j=0;j{
cout<if((j+1)%n0==0)
cout<<"";
}
cout<}
cout<H=newint*[m*r0];
for(i=0;iH[i]=newint[m*n0];
g=newint*[m*k0];
for(i=0;ig[i]=newint[n0];
G=newint*[m*k0];
for(i=0;iG[i]=newint[m*n0];
}//由基本监督矩阵h导出一致监督矩阵H并打印输出
voidJuanjiCode:
:
Trans_h_to_H()
{
cout<<"该卷积码对应的一致监督矩阵H["<\n"<for(t=0;t{
for(i=0;i{
for(j=0;j<(t+1)*n0;j++)
{
H[t*r0+i][j]=h[i][(m-t-1)*n0+j];
cout<if((j+1)%n0==0)
cout<<"";
}
cout<}
cout<}
}//由基本监督矩阵h导出基本生成矩阵g并打印输出
voidJuanjiCode:
:
Trans_h_to_g()
{
for(t=0;t{
for(i=0;i{
for(j=0;j{
if(j>=k0)
g[k0*t+i][j]=h[j-k0][t*n0+i];
else
{
if(t==m-1&&i==j)
g[k0*t+i][j]=1;
else
g[k0*t+i][j]=0;
}
}
}
}
Print_g();
}
voidJuanjiCode:
:
Print_g()
{
cout<<"该卷积码对应的基本生成矩阵g["<\n"<for(i=0;i{
for(j=0;j{
cout<}
if((i+1)%k0==0)
cout<cout<}
}//由基本生成矩阵g导出一致生成矩阵G并打印输出
voidJuanjiCode:
:
Trans_g_to_G()
{
for(t=0;t{
for(i=0;i{
for(j=0;j{
if(i<(t+1)*k0)
G[i][t*n0+j]=g[(m-(t+1))*k0+i][j];
else
G[i][t*n0+j]=0;
}
}
}
Print_G();
}
voidJuanjiCode:
:
Print_G()
{cout<<"该卷积码对应的一致生成矩阵G["<\n"<for(i=0;i{for(j=0;j{if(j
cout<<"";//为0的块不输出
else
cout<if((j+1)%n0==0)
cout<<"";
}
if((i+1)%k0==0)
cout<cout</**********************编码模块**********************/
//利用一致生成矩阵G及基本生成矩阵g编码
voidJuanjiCode:
:
Before_Encoding()//编码前的准备
{
C:
intflag;
cout<<"请输入待编码的0、1信息序列:
"<cin>>Info_str;
flag=Check(Info_str);
if(!
flag)
{
cout<<"您输入的信息序列含除0、1外的其他字符,请重新输入!
"<gotoC;
}
else
{
if(total_num{
cout<<"您输入的信息元个数不足,无法进行编码,请重新输入!
"<gotoC;
}
elseif(total_num%k0!
=0)
{
cout<<"您输入的信息序列存在冗余,无法进行编码,请重新输入!
"<gotoC;
}
}
}
intJuanjiCode:
:
Check(stringInfo_str)
{
intflag=1;
total_num=0;
for(i=0;Info_str[i]!
='\0';i++)
{
if(!
(Info_str[i]=='0'||Info_str[i]=='1'))
{
flag=0;
break;
}
total_num++;//统计输入的0、1的数目
}
returnflag;
}
voidJuanjiCode:
:
Encoding()
{
Before_Encoding();
Code_str="";
//前m个码组通过一致生成矩阵G编出
for(i=0;i{
code=0;
for(j=0;j{
if(Info_str[j]=='1')
code+=G[j][i];
else
code+=0;
}
if(code%2==0)
Code_str+='0';
else
Code_str+='1';
}//其余的码组由基本生成矩阵编出
extra_num=total_num/k0-m;
for(t=0;t{
for(i=0;i{
code=0;
for(j=(t+1)*k0;j<(m+t+1)*k0;j++)
{
if(Info_str[j]=='1')
code+=g[j-(t+1)*k0][i];
else
code+=0;
}
if(code%2==0)
Code_str+='0';
else
Code_str+='1';
}
}//输出截短码组
cout<<"经编码后,得到如下序列:
"<for(i=0;i{
cout<if((i+1)%n0==0)
cout<<"";
}
cout<<"..."<}
/**********************主函数**********************/
voidmain()
{
JuanjiCodeJ_Code;
charchoice='';
intflag=0;
cout<<"\n";
while(choice!
='3')
{C:
cout<<""<<"*************************卷积码简易编码器*************************\n";
cout<<""<<"1.初始化"<<""<<"2.编码"<<""<<"3.退出\n";
cout<<"请输入您要操作的步骤:
";
cin>>choice;
if(choice=='1')
{
if(!
flag){//初次执行初始化操作
flag=1;
}
J_Code.Initializing();
J_Code.Trans_h_to_H();
J_Code.Trans_h_to_g();
J_Code.Trans_g_to_G();
}
elseif(choice=='2')
{
if(!
flag)
{
cout<<"操作错误!
请执行初始化操作后再进行本操作!
"<gotoC;
}//编码
J_Code.Encoding();
}
elseif(choice=='3')
{
exit(0);//退出
}
else//如果选了选项之外的就让用户重新选择
{
cout<<"您没有输入正确的步骤,请重新输入!
"<}
cout<}
}
运行结果:
这次的实验是实现汉明码的编码与译码,达到纠错功能。
通过信息论的课程,我基本了解了汉明码编译的原理和方法,但在编程的过程中遇到了不小的困难。
首先还是理解汉明码概念的问题,因为还存在纠错的功能,所以汉明码的编码方式和以前学的哈夫曼编码或Fano
编码比起来要复杂不少,开
始的时候理解起来有些困难。
不过通过仔细看PPT,很快就弄懂了汉明码的原理。
但是最开始编出来的程序运行的结果总是不正确,和书上的码字不一样,后来发现是在校验矩阵上出了问题,自己对矩阵方面的知识一直把握得不是很好。
经过调试,程序很快就能够正确运行了。
到现在为止,我已经学了C语言程序设计、数据结构等课程,这次的信息论与编码实验让我感觉到以前学习的东西有了用武之地,把知识和理论付诸实践才能有所提高。
在编程的过程中,我发现自己的编程能力还非常有待提高,以前C语言课程里的很多知识掌握还不牢,时常需要翻书查阅。
对信息论与编码这门课的学习还要加深,只有深刻理解了要做的事情,才能把事情做好。
以后我要更加努力,逐步解决这些问题。