卷积码译码课程设计报告Word格式.docx

上传人:b****6 文档编号:20445418 上传时间:2023-01-23 格式:DOCX 页数:24 大小:1.63MB
下载 相关 举报
卷积码译码课程设计报告Word格式.docx_第1页
第1页 / 共24页
卷积码译码课程设计报告Word格式.docx_第2页
第2页 / 共24页
卷积码译码课程设计报告Word格式.docx_第3页
第3页 / 共24页
卷积码译码课程设计报告Word格式.docx_第4页
第4页 / 共24页
卷积码译码课程设计报告Word格式.docx_第5页
第5页 / 共24页
点击查看更多>>
下载资源
资源描述

卷积码译码课程设计报告Word格式.docx

《卷积码译码课程设计报告Word格式.docx》由会员分享,可在线阅读,更多相关《卷积码译码课程设计报告Word格式.docx(24页珍藏版)》请在冰豆网上搜索。

卷积码译码课程设计报告Word格式.docx

2、课程设计结束后与“课程设计小结”、“学生成绩单”一并交院教务存档。

摘要

卷积码(convolutioncode)是一种性能优越的信道编码技术。

它的编码器和译码器都比较容易实现,同时它具有较强的纠错能力。

随着纠错编码理论研究的不断深入,卷积码的实际应用越来越广泛。

本次课程设计依据Viterbi译码原理,实现了(2,1,2)卷积码的译码。

维特比译码是一种极大似然译码方式,利用了编码网格图的特殊结构,对比接收码字和幸存路径汉明距,选择最佳路径实现译码,降低了计算的复杂性。

由于其较强的纠错能力,并且实现算法相对简单,所以在无线通信和移动通信系统被广泛使用。

关键字:

卷积码、信道译码、串行通信

目录

前言1

第二章译码原理和系统组成3

2.1译码原理3

2.2卷积码译码系统组成5

2.2.1卷积码译码模块6

2.2.2通信模块6

第三章系统的设计实现7

3.1译码模块设计7

3.1.1数码管显示7

3.1.2译码8

3.2串行通信模块设计11

第四章系统调试12

第五章结论14

参考文献15

附录16

1、程序代码:

16

2、硬件实物图:

21

3、整体连线图22

前言

1948年,Bell实验室的C.E.Shannon发表的《通信的数学理论》,是关于现代信息理论的奠基性论文。

其中有噪信道编码定理指出,任何一个通信信道都有确定的信道容量C,如果通信系统所要求的传输速率R小于C,则存在一种编码方法,当码长n充分大时,信息的错误概率可以达到任意小。

Shannon指出了可以通过差错控制码在信息传输速率不大于信道容量的前提下实现可靠通信,但却没有给出具体实现差错控制编码的方法。

20世纪40年代,R.Hamming和M.Golay提出了第一个实用的差错控制编码方案汉明码(线性分组码)。

通过采用一定的算法,汉明码不仅能够检测到是否有错误发生,同时还可以找到发生单个比特错误的比特的位置。

分组码存在译码运算量随n增大指数上升的缺点,卷积码的想法由此产生。

P.Elias在1955年首先提出了卷积码。

卷积码与分组码的不同在于:

它充分利用了各个信息块之间的相关性。

通常卷积码记为(n,k,m)码。

卷积码的编码过程是连续进行的,依次连续将每k个信息元输入编码器,得到n个码元,编码得到的码元中的检验位不仅与本码组的信息位有关,还与以前时刻输入到编码器的信息位有关。

同样,在卷积码的译码过程中,不仅要从本码组中提取译码信息,还要充分利用以前和以后时刻收到的码组.从这些码组中提取译码相关信息,而且译码也是可以连续进行的,这样可以保证卷积码的译码延时相对比较小。

相对于线性分组码,卷积码的信息块长度和码字长度都要比分组码的信息块长度和码字长度小,纠错能力更强。

随后的几十年的研究,科学家们不断改进卷积码译码的算法,J.M.Wozencraft提出了适合大编码约束度的卷积码的序列译码,J.L.Massey提出了实现简单的门限译码,A.J.Viterbi提出了适合小编码约束度的卷积码Viterbi算法。

1974年,L.R.Bahl等人又提出一种支持软输入软输出(SISO,Soft-InputSoft-Output)的最大后验概率(MAP,MaximumAPosteriori)译码——BCJR算法。

其中,Viterbi算法有力地推动了卷积码的广泛应用,BCJR算法为后续Turbo码的发现奠定了基础。

50多年来,人们不断创新努力,一步步朝着Shannon极限接近。

但时延、装备复杂性与可行性都是实际应用的严峻要求,而如果不考虑时延因素及复杂性本来就没有意义。

因此信道编码或编码调制理论与技术在向Shannon极限逼近的创新过程中,其难点是要同时兼顾考虑好编码及交织等处理时延、比特误码率门限要求、系统带宽、码率、编码增益、有效吞吐量、信道特征、抗衰落色散及不同类别干扰能力以及装备复杂性,等等要求。

在1993年Claude.Berrou等人首次提出Turbo码,其实质是一种并行级联卷积码,成为人们普遍公认的快速逼近Shannon极限的一种有跃变性改进的码类,在新兴的4G甚至5G中都有着重要的应用。

但其时延、复杂性依然为其最严峻的挑战因素。

第二章译码原理和系统组成

2.1译码原理

1)、基本信息

该(2,1,2)卷积码,一位输入有两位输出,两位都是检验位,信息位被隐藏。

生成多项式为g1(x)=x²

+x+1g2(x)=x²

+1

生成矩阵为G=

校验矩阵为H=

生成多项式S=EHT=YHT=YH

2)、卷积码的网格图

在时间轴上展开在各时刻的状态图。

编码器的各种可能状态再图中用小圆点(节点)表示,两点间的连线则表示一个确定的状态转移方向,若输入信息比特为1,连线用虚线表示;

若为0,用实线表示。

图2.2(2,1,2)卷积码网格图

4)、译码

维特比算法的实质是最大似然译码,译码问题就是在网格图中选择一条路径(每条可能的路径对应着一个码字),使得上式右端最大。

但它利用了编码网格图的特殊结构。

该算法计算网格图上在时刻ti到达各个状态的路径和接收序列之间的相似度(或者说距离),去除不可能成为最大似然选择对象的网格图上的路径,即如果有两条路径到达同一状态,则具有最佳量度的路径被选中,称为幸存路径。

较早地抛弃不可能的路径降低了译码器的复杂性。

选择最优路径可以表述为选择具有最大似然量度的码字,或者选择具有最小汉明距离的码字。

图2.3译码路径示意

网格图中每个时刻ti上有2m个状态.这里的m是寄存器的个数。

每种状态都可经两条路径到达,维特比译码计算到达每个状态的两条路径的路径量度(累计各分支汉明距离之和)。

其中幸存路径量度就是该时刻的该状态量度。

图2.4译码示意图1

图2.5译码示意图2

最后选择状态量度最小的路径作为译码最终路径,即最后时刻图中Γa=1的路径

,对应译码输出是11011。

2.2卷积码译码系统组成

卷积码的编译码系统实现对输入信息的卷积码编码,单片机之间信息传输,卷积码的译码的功能。

将一串信息序列通过0,1按键输入的方式输入,并在数码管上进行显示,按下编码按键后,卷积码的编码模块对其进行(2,1,2)卷积码编码,而后编码后的输出通过信息传输模块输入译码模块,在数码管上显示译码还原的原序列。

译码模块还支持按键输入码字序列,对其进行译码,并验证维特比译码的纠错功能。

图2.1系统整体框图

2.2.1卷积码译码模块

译码模块通过两种译码输入方式输入数据。

第一种是将编码后的输出通过通信模块输入,接收串行通信的数据保存在数组,校验数据正确性后,译码并将译码结果显示在数码管上。

译码具有一定程度的纠错能力,即使通信模块在传输过程中出现少数差错,译码仍然能将结果正确译出并显示。

图2.6译码模块框图

2.2.2通信模块

串行通信是指数据一位一位地按顺序传送,串行通信通过串行口来实现。

51单片机内部的串行口本身具有通信的功能,该串口可作为通信接口,利用该串口与其他单片机或Pc机的串口进行串行通信。

本模块设计是通过RS232芯片设计硬件实现将编码模块的编码输出传输到译码模块作为译码输入,因此本可以是只需要一条发送线单向传输,考虑到传输可靠性仍要加一条线作为反馈校验。

软件部分,通过通信协议进行发送接收,主机先送AAH给从机,当从机接收到AAH后,向主机回答BBH。

主机收到BBH后就把数码表TAB[16]中的10个数据送给从机,并发送检验和。

从机收到16个数据并计算接收到数据的检验和,与主机发送来的检验和进行比较,若检验和相同则发送00H给主机;

否则发送FFH给主机,重新接收。

从机收到16个正确数据后送到一个数码管显示。

串行口的工作方式为8位UART,波特率可变(T1溢出率/n)。

定时器的工作方式为工作方式2。

图2.8RS-232电平信号传输的连接图

第三章系统的设计实现

3.1译码模块设计

译码模块采用维特比译码方式译码,其具有校检数据、译码和纠错的能力,另外还需考虑的部分是数码管显示。

图3.1译码系统总程序流程图

3.1.1数码管显示

数码管显示:

数码管显示使用8位共阴数码管动态显示,数码管段选信号由单片机P2发出,位选信号通过P0.0P0.1P0.2口连接三八译码器控制控制。

位选信号i从0到数组长度循环,段选信号是第i个数组值的16进制段码。

在数码管上动态显示数组

图3.2动态数码管显示模块电路

图3.3动态数码管显示程序流程图

3.1.2译码

卷积码译码路径总是从t=0时刻0状态开始,到t=1时刻,共有两条路径,t=2时刻共有4条路径,t>

2的时刻有八条路径。

t到t+1时刻路径输入输出,以及状态转换如下图所示。

用数组对其进行描述:

p(0,0)=0;

c(0,0)=00;

p(0,1)=2;

c(0,1)=11;

p(1,0)=0;

c(1,0)=10;

p(1,1)=2;

c(1,1)=01;

p(2,0)=1;

c(2,0)=11;

p(2,1)=3;

c(2,1)=00;

p(3,0)=1;

c(3,0)=01;

p(3,1)=3;

c(3,1)=10;

图3.4状态转换路径图

p(i,j)=s表示到达t+1时刻i状态的第0条路径,来自t时刻的状态s。

用于寻找上一个状态。

c(i,j)=os表示到达t+1时刻i状态的第0条路径,路径输出是o。

用于对比接收码字的汉明距。

将接收的码字两两分组,与数组c对比,计算汉明距,找到每个状态的最小汉明距的路径,保存汉明距和路径输出。

用p数组找到上一个状态,加上上一个时刻累计汉明距作为本状态的状态量度。

一直循环直到最后一组数据对比完成,选择状态量度最小的路径作为最后译码输出路径。

程序流程图如下:

图3.5译码程序流程图

3.2串行通信模块设计

用8051串行接口通信,如果两台8051单片机之间的距离很近(不超过1.5m),可以采用直接将两台8051单片机的串行接口直接相连,利用其自身的TTL电平(0-5V)直接传输数据信息。

如果传输距离较远(超过1.5m),由于传输线的阻抗与分布电容,会产生电平损耗和波形畸变,以至于检测不出数据或数据出错。

此时可利用RS232标准总线接口,用MAX232芯片完成TTL和RS-232的双向电平转换。

MAX232外围的4个电容与内部电路构成了电荷泵进行升降压。

芯片外围电容值通常通过下面的图判断:

图3.4Max232外围电容选取参考

一图是输出负载电压和负载电流之间的关系,二图表明了可用输出电流和数据流之间的关系,三图是芯片的关断和芯片上的各个点之间电压的变化。

参考图上信息,考虑通讯的稳定性、通讯距离的长度、波特率的高低等因素,在最后的电路焊接中,选择了1uf电容作为外围电容。

MAX232和单片机串口连接的电路如图所示:

图3.4串口通信模块电路

第四章系统调试

本课设选择(2,1,2)卷积码来进行译码实验,因为编译结果直接通过51单片机的数码管进行显示,所以数据输入最多8位。

实验结果:

A、输入8位数据00111000

输出结果在数码管显示0101

图4.1无错正确译码示意图

结果:

译码成功。

B、输入8位数,00111001(修改最后一位为1)

输出结果在数码管显示0100

图4.2错误在最后两位译码错误

译码结果为0100,译码失败,纠错失败。

C、输入8位数据00101000(修改第四位为0)

图4.3错误不在最后两位译码

译码结果为0101,译码成功,纠错成功。

证明该译码具有一位错码的纠错能力,测试证明,4位输入的情况下纠错能力最大只有一位,错误更多则无法纠正。

纠错失败原因:

接收码字只最后两位出错的情况下,将会有两条路径最终状态量度都为1,其路径只在最后时刻产生差异。

而程序面对最终状态量度相同时,默认将选择上面一条路径,这将导致这种情况译码只有50%的纠错成功率。

错误不在最后两位时,其路径相差较大,可以正确译码。

图4-4纠错失败示意图

第五章结论

本次课程设计是利用单片机实现(2,1,2)卷积码的译码。

(2,1,2)卷积码是一种最简单的卷积码,在将信息位隐藏之后,编码后的每一位都是检验位,这加大了译码的难度,但同时也带给了这种卷积码更强的纠错性能。

维特比译码是一种相对简单又有效的译码方式。

其译码能力在其路径图可以明显的体现,在只有4比特输入的情况下其最终时刻状态量度几乎最大都是3,由此决定了该(2,1,2)卷积码最多具有4比特纠正一位错码的能力限制。

因为受数码管数量的限制,不能输入更多位的数据,更有效的验证卷积码和维特比译码的纠错能力。

这是这个系统最大的遗憾,改进的话可以有效利用16x16点阵实现数据显示,或者直接跳出单片机限制,直接使用电脑软件设计程序。

参考文献

[1]郭惠,吴讯等.单片机C语言程序设计[M].北京:

电子工业出版社2008

[2] 

谭浩强. 

C程序设计[M].北京:

清华大学出版社,2009. 

[3]孙近平.51系列单片机原理、开发与应用实例[M].北京:

中国电力出版社,2009

[4] 

张先庭单片机原理、接口与C51应用程序设计[M].北京:

国防工业出版社,2011. 

[5]陈涛著.单片机应用及C51程序设计[M].北京:

机械工业出版社,2011

[6]王普斌.单片机接口与应用[M].北京:

冶金工业出版社,2016

[7]荆轲.单片机原理及应用基于KeilC与Proteus[M].北京:

机械工业出版社,2016

[8]周兴华.手把手教你学单片机C程序设计[M].北京:

北京航空航天大学出版社,2007

[9]周荫清.信息理论基础第四版[M].北京:

北京航空航天大学出版社,2012

[10]曹雪虹、张宗橙信息论与编码[M]北京:

清华大学出版社2016

附录

#include"

reg52.h"

#defineuintunsignedint

#defineuncharunsignedchar

uinty[20];

//={1,1,0,1,0,1,0,1};

uinta[10];

uintcount=0;

sbitA_38=P0^0;

//?

?

sbitB_38=P0^1;

sbitC_38=P0^2;

sbitin0=P0^5;

sbitin1=P0^6;

sbitcoding=P0^7;

voidkeyscan();

voiddisplay2();

uncharcodetable[]={0xfc,0x60};

voiddelayms(uintxms)//?

{

uinti,j;

for(i=xms;

i>

0;

i--)

for(j=110;

j>

j--);

}

voidt38(intx)//38?

switch(7-x)

{

case0:

A_38=0;

B_38=0;

C_38=0;

break;

case1:

C_38=1;

case2:

B_38=1;

case3:

case4:

A_38=1;

case5:

case6:

case7:

default:

;

}

voiddecode()//译码函数

uinti,j,t,s,de;

//i?

j?

t?

s?

de?

uintd1,d2;

uintmin=0;

//?

uintdes[4]={0,0,0,0};

uintpathout[4][10];

uintp[4][2]={{0,2},//?

{0,2},

{1,3},

{1,3}};

uintpc[4][2][2]={{{0,0},{1,1}},//?

{{1,1},{0,0}},

{{1,0},{0,1}},

{{0,1},{1,0}}};

for(t=0;

t<

count;

t++)

{

if(t==0)//?

{

des[0]=y[0]+y[1];

pathout[0][0]=0;

des[1]=(y[0]+1)%2+(y[1]+1)%2;

pathout[1][0]=1;

s=2;

}

if(t==1)//?

{

s=4;

i=des[0];

j=des[1];

des[0]+=y[2]+y[3];

pathout[0][1]=0;

des[1]=i+(y[2]+1)%2+(y[3]+1)%2;

pathout[1][0]=0;

pathout[1][1]=1;

des[2]=j+(y[2]+1)%2+y[3];

pathout[2][0]=1;

pathout[2][1]=0;

des[3]=j+y[2]+(y[3]+1)%2;

pathout[3][0]=1;

pathout[3][1]=1;

if(t>

1)//?

uintdes1[4];

uintpathoutptr[4][10];

for(i=0;

i<

4;

i++)

{

des1[i]=des[i];

for(j=0;

j<

t;

j++)

pathoutptr[i][j]=pathout[i][j];

}

//4?

?

for(i=0;

i++)

{

d1=des1[p[i][0]]+(pc[i][0][0]+y[2*t])%2+(pc[i][0][1]+y[2*t+1])%2;

d2=des1[p[i][1]]+(pc[i][1][0]+y[2*t])%2+(pc[i][1][1]+y[2*t+1])%2;

if(d1<

d2)

{

des[i]=d1;

{

pathout[i][j]=pathoutptr[p[i][0]][j];

}

pathout[i][t]=i%2;

else

{

des[i]=d2;

{

pathout[i][j]=pathoutptr[p[i][1]][j];

}

}

}

de=des[0];

for(i=0;

s;

if(des[i]<

=de)

{

de=des[i];

min=i;

}

}

a[i]=pathout[min][i];

voidkeyscan()//?

if(in0==0)

delayms(5);

if(in0==0)

{

y[count]=0;

//display();

count++;

while(!

in0);

if(in1==0)

if(in1==0)

y[count]=1;

in1);

if(coding==0)

if(coding==0)

decode();

display2();

coding);

voiddisplay2()//?

while

(1)

inti;

for(i=0;

count/2;

P2=codetable[a[count/2-1-i]];

t38(i);

delayms

(2);

}

voiddisplay()//?

{

int

展开阅读全文
相关资源
猜你喜欢
相关搜索

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

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

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