卷积码实验Word格式.docx
- 文档编号:20294411
- 上传时间:2023-01-21
- 格式:DOCX
- 页数:13
- 大小:35.74KB
卷积码实验Word格式.docx
《卷积码实验Word格式.docx》由会员分享,可在线阅读,更多相关《卷积码实验Word格式.docx(13页珍藏版)》请在冰豆网上搜索。
1、使用编程软件进行卷积码编译器的代码编写、运行、仿真等操作。
2、熟练掌握相关软件、语句。
3、理解卷积码编解码器的原理、知识
实验原理:
卷积码将k个信息比特编成n个比特,但k和n通常很小,特别适合以串行形式进行传输,时延小。
与分组码不同,卷积码编码后的n个码元不仅与当前段的k个信息有关,还与前面的N-1段信息有关,编码过程中互相关联的码元个数为nN。
卷积码的纠错性能随N的增加而增大,而差错率随N的增加而指数下降
程序编写:
#include<
iostream>
#include<
string>
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;
请输入信息元个数k0="
k0;
请输入关联长度m="
cin>
m;
//监督元个数
r0=n0-k0;
//动态分配存储单元
h=newint*[r0];
for(i=0;
i<
r0;
i++)
h[i]=newint[m*n0];
请输入("
n0<
"
k0<
m<
)卷积码的基本监督矩阵h["
r0<
]["
m*n0<
]:
endl;
for(j=0;
j<
m*n0;
j++)
h[i][j];
//检测,输出h
您输入的基本监督矩阵h["
]如下:
\n"
{
if((j+1)%n0==0)
"
}
//动态分配存储单元
H=newint*[m*r0];
m*r0;
H[i]=newint[m*n0];
g=newint*[m*k0];
m*k0;
g[i]=newint[n0];
G=newint*[m*k0];
G[i]=newint[m*n0];
}//由基本监督矩阵h导出一致监督矩阵H并打印输出
Trans_h_to_H()
cout<
该卷积码对应的一致监督矩阵H["
m*r0<
]如下(未输出部分全为0):
for(t=0;
t<
t++)
for(i=0;
for(j=0;
(t+1)*n0;
H[t*r0+i][j]=h[i][(m-t-1)*n0+j];
H[t*r0+i][j];
if((j+1)%n0==0)
}
}//由基本监督矩阵h导出基本生成矩阵g并打印输出
Trans_h_to_g()
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;
g[k0*t+i][j]=0;
Print_g();
Print_g()
该卷积码对应的基本生成矩阵g["
m*k0<
g[i][j];
if((i+1)%k0==0)
}//由基本生成矩阵g导出一致生成矩阵G并打印输出
Trans_g_to_G()
if(i<
(t+1)*k0)
G[i][t*n0+j]=g[(m-(t+1))*k0+i][j];
G[i][t*n0+j]=0;
}
Print_G();
Print_G()
{cout<
该卷积码对应的一致生成矩阵G["
{for(j=0;
{if(j<
i/k0*n0)
//为0的块不输出
G[i][j];
if((j+1)%n0==0)
}}
/**********************编码模块**********************/
//利用一致生成矩阵G及基本生成矩阵g编码
Before_Encoding()//编码前的准备
C:
intflag;
请输入待编码的0、1信息序列:
Info_str;
flag=Check(Info_str);
if(!
flag)
您输入的信息序列含除0、1外的其他字符,请重新输入!
gotoC;
if(total_num<
m*k0)
您输入的信息元个数不足,无法进行编码,请重新输入!
elseif(total_num%k0!
=0)
您输入的信息序列存在冗余,无法进行编码,请重新输入!
intJuanjiCode:
Check(stringInfo_str)
intflag=1;
total_num=0;
Info_str[i]!
='
\0'
(Info_str[i]=='
0'
||Info_str[i]=='
1'
))
flag=0;
break;
total_num++;
//统计输入的0、1的数目
returnflag;
Encoding()
Before_Encoding();
Code_str="
//前m个码组通过一致生成矩阵G编出
code=0;
if(Info_str[j]=='
)
code+=G[j][i];
code+=0;
if(code%2==0)
Code_str+='
}//其余的码组由基本生成矩阵编出
extra_num=total_num/k0-m;
extra_num;
for(j=(t+1)*k0;
(m+t+1)*k0;
code+=g[j-(t+1)*k0][i];
}//输出截短码组
经编码后,得到如下序列:
total_num/k0*n0;
{
Code_str[i];
if((i+1)%n0==0)
..."
/**********************主函数**********************/
voidmain()
JuanjiCodeJ_Code;
charchoice='
'
intflag=0;
while(choice!
3'
{C:
*************************卷积码简易编码器*************************\n"
1.初始化"
2.编码"
3.退出\n"
请输入您要操作的步骤:
choice;
if(choice=='
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'
操作错误!
请执行初始化操作后再进行本操作!
}//编码
J_Code.Encoding();
exit(0);
//退出
else//如果选了选项之外的就让用户重新选择
您没有输入正确的步骤,请重新输入!
运行结果:
这次的实验是实现汉明码的编码与译码,达到纠错功能。
通过信息论的课程,我基本了解了汉明码编译的原理和方法,但在编程的过程中遇到了不小的困难。
首先还是理解汉明码概念的问题,因为还存在纠错的功能,所以汉明码的编码方式和以前学的哈夫曼编码或Fano
编码比起来要复杂不少,开
始的时候理解起来有些困难。
不过通过仔细看PPT,很快就弄懂了汉明码的原理。
但是最开始编出来的程序运行的结果总是不正确,和书上的码字不一样,后来发现是在校验矩阵上出了问题,自己对矩阵方面的知识一直把握得不是很好。
经过调试,程序很快就能够正确运行了。
到现在为止,我已经学了C语言程序设计、数据结构等课程,这次的信息论与编码实验让我感觉到以前学习的东西有了用武之地,把知识和理论付诸实践才能有所提高。
在编程的过程中,我发现自己的编程能力还非常有待提高,以前C语言课程里的很多知识掌握还不牢,时常需要翻书查阅。
对信息论与编码这门课的学习还要加深,只有深刻理解了要做的事情,才能把事情做好。
以后我要更加努力,逐步解决这些问题。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 卷积码 实验