卷积码实验.docx

上传人:b****5 文档编号:7193215 上传时间:2023-01-21 格式:DOCX 页数:13 大小:35.74KB
下载 相关 举报
卷积码实验.docx_第1页
第1页 / 共13页
卷积码实验.docx_第2页
第2页 / 共13页
卷积码实验.docx_第3页
第3页 / 共13页
卷积码实验.docx_第4页
第4页 / 共13页
卷积码实验.docx_第5页
第5页 / 共13页
点击查看更多>>
下载资源
资源描述

卷积码实验.docx

《卷积码实验.docx》由会员分享,可在线阅读,更多相关《卷积码实验.docx(13页珍藏版)》请在冰豆网上搜索。

卷积码实验.docx

卷积码实验

天津理工大学实验报告

学院(系)名称:

计算机与通信工程学院

姓名

张彩云

学号

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;i

h[i]=newint[m*n0];

cout<<"请输入("<

"<

for(i=0;i

for(j=0;j

cin>>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;i

H[i]=newint[m*n0];

g=newint*[m*k0];

for(i=0;i

g[i]=newint[n0];

G=newint*[m*k0];

for(i=0;i

G[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语言课程里的很多知识掌握还不牢,时常需要翻书查阅。

对信息论与编码这门课的学习还要加深,只有深刻理解了要做的事情,才能把事情做好。

以后我要更加努力,逐步解决这些问题。

 

展开阅读全文
相关搜索

当前位置:首页 > 高等教育 > 研究生入学考试

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1