卷积码编码器及Viterbi译码器的设计.docx
《卷积码编码器及Viterbi译码器的设计.docx》由会员分享,可在线阅读,更多相关《卷积码编码器及Viterbi译码器的设计.docx(26页珍藏版)》请在冰点文库上搜索。
卷积码编码器及Viterbi译码器的设计
毕业论文(设计)
题目:
卷积码编码器及Viterbi译码器的设计
学生姓名:
琳
学号:
所在系别:
电气信息工程学院
专业名称:
通信工程
届次:
指导教师:
目录
前言2
1卷积码3
1.1卷积码基本概念3
1.2卷积码的编码4
1.3卷积码的译码4
1.4卷积码的Viterbi译码5
2.卷积码编码器及Viterbi译码器的设计系统方案制定8
2.1方案提出8
2.2方案论证8
2.3方案选择9
2.4硬件实现10
3.卷积码编码器及Viterbi译码器的设计系统的仿真和调试10
3.1仿真软件介绍10
3.2系统仿真实现10
3.3卷积码实现12
3.4数据分析14
4SIMULINK下仿真设计15
4.1卷积码的仿真15
4.2SIMULINK模块仿真参数设置及意义16
5总结20
5.1设计小结20
5.2收获体会20
5.3展望21
6参考文献:
21
卷积码编码器及Viterbi译码器的设计
学生:
陈琳(指导老师:
王千春)
(淮南师范学院电气信息工程学院)
摘要:
本毕业设计主要解决对一个卷积码序列进行维特比(Viterbi)译码输出,并通过Matlab软件进行设计与仿真,并进行误码率分析。
在毕业设计中,系统开发平台为WindowsVistaUltimate,程序设计与仿真均采用MatlabR2007a(7.4),最后仿真详单与理论分析一致。
关键词:
毕业论文;卷积码译码器;Matlab;设计与仿真
DesignoftheViterbiConvolutionalCodeEncoderandDecoder
Student:
ChenLin(Instructor:
WANGqianchun)
(Electricalandinformationengineeringcollegeofcommunicationengineering)
Abstract:
ThiscoursedesignmainlyresolvestoaconvolutionalcodesequenceforViterbiViterbidecodingoutput,andthroughtheMatlabsoftwaretocarryonthedesignandsimulation,andanalysisofbiterrorrate.Incurriculumdesign,systemdevelopmentplatformforWindowsVistaUltimate,programdesignandsimulationusingMatlabR2007a(7.4),andfinallythesimulationlistisconsistentwiththeoreticalanalysis.
Keywords:
graduationthesis;Convolutionalcodedecoder;Matlab;Designandsimulation
前言
本毕业设计主要解决对一个卷积码序列进行维特比(Viterbi)译码输出,并通过Matlab软件进行设计与仿真。
卷积码的译码有两种方法——软判决和硬判决,此毕业设计采用硬判决的维特比译码。
随着现代通信的发展,高速信息传输和高可靠性传输成为信息传输的两个主要方面,而可靠性尤其重要。
卷积码以其高速性和可靠性在实际应用中越来越广泛。
1967年Viterbi译码算法的提出,使卷积码成为信道编码中最重要的编码方式之一[1]。
在对卷积码的研究中,其中编码器较简单,模式也很统一。
主要是研究提高卷积码的译码速度和可靠度。
译码算法中最重要的卷积码的Viterbi算法问世以来,软件仿真和实现都得到了迅速发展。
目前,利用计算机仿真Viterbi算法,模拟在各种不同情况下(使用不同码率、不同约束度等)卷积编码时的译码性能,寻找Viterbi算法的最佳适用信道和不同要求(如误码率)下最优编码。
在卷积码中,因为Viterbi算法效率高,速度快,结构相对简单等特点,被广泛应用于各种数据传输系统。
特别是深空通信、卫星通信系统中。
在现代信息处理系统中,需要处理的信息量越来越大,实时性要求越来越高。
为减少对主处理器各种资源的占用,要求通信模块方面的大部分工作能独立完成。
因此采用Viterbi译码算法具有非常现实的意义[2]。
由于卷积码的优良特性,被广泛的应用于深邃通信,卫星通信和2G及3G移动通信中,卷积码有三种译码方法:
门限译码,概率译码和Viterbi算法,其中Viterbi算法是一种基于网格图的最大似然译码算法,是卷积码的最佳译码方式,具有效率高、速度快等优点。
Viterbi译码充分发挥了卷积码的特点,使译码错误概率达到最小,在码的约束度教小时,它有译码算法效率高,速度快,译码也简单的特点[3]。
这次毕业设计研究卷积码的编码方法和解码方式。
编写卷积码的编码和解码程序。
掌握卷积码编码及Viterbi译码的基本原理。
分析卷积码编码及Viterbi译码的关键技术。
对卷积码编码器及Viterbi译码器进行设计。
用卷积码编码器及Viterbi译码器进行仿真,并进行性能分析。
理解卷积码的编码和解码原理和过程,会通过编码和解码程序对一些卷积码进行仿真。
对卷积码编码器及Viterbi译码器进行仿真验证,并分析性能。
尽可能对系统进行优化。
能运用MATLAB软件进行仿真[4]。
1卷积码
1.1卷积码基本概念
卷积码是一种性能优越的信道编码。
(n,k,N)表示把k个信息比特编成n个比特,N为编码约束长度,说明编码过程中互相约束的码段个数。
卷积码编码后的n个码元不仅与当前组的k个信息比特有关,而且与前N-1个输入组的信息比特有关。
编码过程中相互关联的码元有N×n个。
R=k/n是卷积码的码率,码率和约束长度是衡量卷积码的两个重要参数。
卷积码的编码描述方式有很多种:
冲激响应描述法、生成矩阵描述法、多项式乘积描述法、状态图描述,树图描述,网格图描述等。
卷积码的纠错能力随着N的增加而增大,而差错率随着N的增加而指数下降。
在编码器复杂性相同的情况下,卷积码的性能优于分组码。
分组码的译码算法可以由其代数特性得到。
卷积码虽然可以采用适用于分组码的门限译码(即大数逻辑译码),但性能不如维特比译码和序列译码[5]。
1.2卷积码的编码
图1一种卷积码编码器方框图
图1卷积码的编码器一般都比较简单。
下图1是一般情况下的卷积码编码器框图。
它包括:
一个由N段组成的输入移位寄存器,每段有k级,共Nk位寄存器;一组n个模2和相加器;一个由n级组成的输出移位寄存器。
对应于每段k个比特的输入序列,输出n个比特。
由图可知,n个输出比特不但与当前k个比特的输入比特有关,而且与以前的(N-1)k个输入信息有关。
整个编码过程可以看成是输入信息序列与由移位寄存器和模2加法器的连接方式所决定的另一个序列的卷积,卷积码由此得名。
1.3卷积码的译码
卷积码的译码方式有三种:
(1)1963年由梅西((Massey)提出的门限译码,这是一种基于码代数结构的代数译码,类似于分组码中的大数逻辑译码;
(2)1963年由费诺(Fano)改进的序列译码,这是基于码的树状图结构上的一种准最佳的概率译码;(3)1967年由维特比提出的Viterbi算法。
这是基于码的网(trellis)图基础上的一种最大似然译码算法,是一种最佳的概率译码方法。
其中,代数译码,利用编码本身的代数结构进行译码,不考虑信道本身的统计特性。
该方法的硬件实现简单,但性能较差,其中具有典型意义的是门限译码。
另一类是概率译码,这种译码通常建立在最大似然准则的基础上。
由于计算是用到了信道的统计特性.因而提高了译码性能,但这种性能的提高是以增加硬件的复杂度为代价的。
常用的概率译码方法有维特比译码和序列译码。
维特比译码具有最佳性能,但硬件实现复杂;门限译码性能最差,但硬件简单;序列译码在性能和硬件方面介于维特比译码和门限译码之间[6]。
1.4卷积码的Viterbi译码
卷积码概率译码的基本思路是:
以接收码流为基础,逐个计算它与其他所有可能出现的、连续的网格图路径的距离,选出其中可能性最大的一条作为译码估值输出。
概率最大在大多数场合可解释为距离最小,这种最小距离译码体现的正是最大似然的准则。
卷积码的最大似然译码与分组码的最大似然译码在原理上是一样的,但实现方法上略有不同。
主要区别在于:
分组码是孤立地求解单个码组的相似度,而卷积码是求码字序列之间的相似度。
基于网格图搜索的译码是实现最大似然判决的重要方法和途径。
用格图描述时,由于路径的汇聚消除了树状图中的多余度,译码过程中只需考虑整个路径集合中那些使似然函数最大的路径。
如果在某一点上发现某条路径已不可能获得最大对数似然函数,就放弃这条路径,然后在剩下的“幸存”路径中重新选择路径。
这样一直进行到最后第L级(L为发送序列的长度)。
由于这种方法较早地丢弃了那些不可能的路径[7]。
1.4.1维特比译码原理
采用概率译码的基本思想是:
把已接收序列与所有可能的发送序列做比较,选择其中码距最小的一个序列作为发送序列。
如果发送L组信息比特,那么对于(n,k)卷积码来说,可能发送的序列有2kL个,计算机或译码器需存储这些序列并进行比较,以找到码距最小的那个序列。
当传信率和信息组数L较大时,使得译码器难以实现。
维特比算法则对上述概率译码做了简化,以至成为了一种实用化的概率算法。
它并不是在网格图上一次比较所有可能的2kL条路径(序列),而是接收一段,计算和比较一段,选择一段最大似然可能的码段,从而达到整个码序列是一个最大似然值得序列[8]。
下面以图2(a)的(2,1,3)卷积码编码器所编出的码为例,来说明维特比解码的方法和运作过程。
为了能说明解码过程,这里给出该码的状态图,如图2(b)所
图2(a)(2,1,3)卷积码编码器图2(b)(2,1,3)卷积码状图
示。
维特比译码需要利用图来说明移码过程。
根据卷积码画网格的方法,我们可以画出该码的网格图,如图3所示。
该图设输入信息数目L=5,所以画L+N=8个时间单位,图中分别标以0至7。
这里设编码器从a状态开始运作。
该网格图的每一条路径都对应着不同的输入信息序列。
由于所有可能输入信息序列共有2kL个,因而网格图中所有可能的路径也为2kL条。
这里节点a=00,b=01,c=10,d=11。
图3(2,1,3)卷积码网格图
设输入编码器的信息序列为(11011000),则由编码器对应输出的序列为Y=(1101010001011100),编码器的状态转移路线为abdcbdca。
若收到的序列R=(0101011001011100),对照网格图来说明维特比译码的方法[9]。
由于该卷积码的约束长度为6位,因此先选择接收序列的前6位序列R1=(010101)同到达第3时刻的可能的8个码序列(即8条路径)进行比较,并计算出码距。
该例中到达第3时刻a点的路径序列是(000000)和(111011),他们与R1的距离分别为3和4;到达第3时刻b点的路径序列是(000011)和(111000),他们与R1的距离分别为3和4;到达第3时刻c点的路径序列是(001110)和(110101),他们与R1的距离分别为4和1;到达第3时刻d点的路径序列是(001101)和(110110),他们与R1的距离分别为2和3。
上述每个节点都保留码距较小的路径作为幸存路径,所以幸存路径码序列是(000000)、(000011)、(1101001)和(001101),如图4所示。
用于上面类似的方法可以得到第4、5、6、7时刻的幸存路径[10]。
图4维特比译码第3时刻幸存路径
需要指出的是,对于某个节点,如果比较两条路径与接收序列的累计码距值相等时,则可以任意选者一条路径作为幸存路径,吃时不会影响最终的译码结果。
在码的终了时刻a状态,得到一条幸存路径。
如果5所示。
由此可看到译码器输出是R’=(1101010001011100),即可变换成序列(11011000),恢复了发端原始信息。
比较R’和R序列,可以看到在译码过程中已纠正了在码序列第1和第7位上的差错。
当然如果差错出现太频繁,以致超出卷积码的纠错能力,还是会发生纠误的[11]。
图5第8时刻幸存路径
2.卷积码编码器及Viterbi译码器的设计系统方案制定
2.1方案提出
卷积码的译码方式有三种:
(1)1963年由梅西((Massey)提出的门限译码,这是一种基于码代数结构的代数译码,类似于分组码中的大数逻辑译码;
(2)1963年由费诺(Fano)改进的序列译码,这是基于码的树状图结构上的一种准最佳的概率译码;(3)1967年由维特
比提出的Viterbi算法。
这是基于码的网(trellis)图基础上的一种最大似然译码算法,是一种最佳的概率译码方法[12]。
上。
由于计算是用到了信道的统计特性.因而提高了译码性能,但这种性能的提高是以增加硬件的复杂度为代价的。
常用的概率译码方法有维特比译码和序列译码。
维特比译码具有最佳性能,但硬件实现复杂;门限译码性能最差,但硬件简单;序列译码在性能和硬件方面介于维特比译码和门限译码之间[13]。
2.2方案论证
图6是卷积码解码原理图,由此图可见,当信息位出现一个错码时,仅当它位于信息位移存器的第6、3、2和1级时,才使校正子等于“1”。
因此,这时校正子序列为100111;反之,当监督位出现一个错码时,校正子序列将为100000。
由此可见,当校正子序列出现第一个“1”时,表示已经检出一个错码。
此卷积码除了能够纠正两位在约束长度中的随机错误外,还能够纠正部分多于两位的错误。
为了克服突发错误,可以采用更长的约束长度和在约束长度中能纠正更多错误的码[14]。
654321
图6(2,1,6)卷积码解码器原理方框图
2.3方案选择
由于维特比解码算法比较简单,计算快,故得到广泛应用,特别是卫星通信和蜂窝网通信系统中应用。
所以这里选择维特比解码。
2.4硬件实现
图7译码器硬件实现方框图
3卷积码编码器及Viterbi译码器的设计系统的仿真和调试
3.1仿真软件介绍
Matlab是英文MATrixLABoratory(矩阵实验室)的缩写。
Matlab自1984年由MathWorks公司推向市场以来,历经20多年的发展和竞争,现在风靡世界。
可靠的数值计算和符号计算功能,强大的绘图功能、简单易学的语言体系以及为数众多的应用工具箱是Matlab区别于其他科技应用软件的显著标志[6]。
3.2系统仿真实现
3.2.1编码程序
%header,后面的寄存器需补零
fori=1:
size(G,2)/k-1input_matrix=[coder_input(i*k:
-1:
1),zeros(1,size(G,2)-i*k)];
%取输入序列的前i*k个,其后补0
gg_out=G*input_matrix';
%生成矩阵和寄存器单元中的内容相乘得到输出
forl=1:
nchannel_input(n*(i-1)+l)=rem(gg_out(l),2);
%进行模二运算得到编码器输出
end
end
%body
fori=size(G,2)/k:
depth_of_input
input_matrix=[coder_input(k*i:
-1:
k*i-G_2+1)];
%取输入序列的G-2个,即与寄存器个数相等
gg_out=G*input_matrix';
forl=1:
nchannel_input(n*(i-1)+l)=rem(gg_out(l),2);
%模二运算
end
end
%tailer,前面的寄存器需补零
fori=(G_2/k-1):
-1:
1input_matrix=[zeros(1,G_2-i*k),coder_input(depth_of_input*k:
-1:
(depth_of_input-i)*k+1)];;
%前G_2-i*k个补0
gg_out=G*input_matrix';
forl=1:
nchannel_input(n*(G_2/k-i-1)+l+depth_of_input*n)=rem(gg_out(l),2);
%模二运算
end
3.2.2解码程序
forj=0:
step:
number_of_states-1;
forl=0:
2^k-1branch_metric=0;
binary_output=deci2bin(output(j+1,l+1),n);
%将理想输出转化为二进制
forll=1:
n
%计算汉明距branch_metric=branch_metric+metric(channel_output_matrix(ll,i),binary_output(ll));
end
%在AWGN信道下,最大似然估计转化为求最小汉明距
%如果下一状态度量距离大于当前距离加汉明距,或是下一状态未被遍历过则设为当前状态下一状态的幸存状态,当前距离加汉明距设为下一状态的距离if((state_metric(nextstate(j+1,l+1)+1,2)>state_metric(j+1,1)+branch_metric)|flag(nextstate(j+1,l+1)+1)==0)state_metric(nextstate(j+1,l+1)+1,2)=state_metric(j+1,1)+branch_metric;%更改汉明距
survivor_state(nextstate(j+1,l+1)+1,i+1)=j;
%更改幸存路径
flag(nextstate(j+1,l+1)+1)=1;
end
end
end
%开始回溯最佳路径,从最佳路径中找出解码
%state_sequence(1x结点深度)矩阵,1~dep分别记载各个阶段的路径(即前一状态数)。
1~dep分别记载各个阶段的路径(即前一状态数)。
%从最佳路径中产生解码
%由后到前得到各级的状态
state_sequence=zeros(1,depth_of_trellis+1);state_sequence(1,depth_of_trellis)=survivor_state(1,depth_of_trellis+1);
%开始回溯最佳路径
fori=1:
depth_of_trellisstate_sequence(1,depth_of_trellis-i+1)=survivor_state((state_sequence(1,depth_of_trellis+2-i)+1),depth_of_trellis-i+2);
end
3.3卷积码实现
(3,1)卷积码的仿真:
随机输入一组序列,本仿真实验中输入的序列是:
10110100。
通过卷积编码程序对所输入的序列进行编码,得到卷积码输出,再对这个卷积码进行噪声干扰,在实际通信系统中即相当于在空中传输过程中出现传输错误,出现误码,译码器接收到错误的码字进行解码,理论上按照Viterbi译码算法可以回溯到原始的正确码字,即正确的输入序列。
现在对于编码程序在MATLAB系统中对该实验进行仿真,验证译码是否正确,以得出是否有差错控制的功能,即卷积码可以实现差错控制[7]。
设置编码器输入端:
随机输入序列:
coder_input=[10110100]
输入(2,1)卷积码的生成矩阵:
G=[101101111;110110011;111001001]
设置输入端个数:
k=1
则通过仿真得到编码器输出的卷积码序列:
channel_output=[111011010010100001011100000000100011110111000000]
当通信过程中遇到噪声干扰,出现错码时。
例如本例中将第一位、第五位、第十位和最后一位更改。
得到噪声之后的序列,之后再将噪声之后序列送入译码程序进行译码输出。
经过维特比译码之后输出的输出序列理论上是原始的输入序列,若与输入序列相同,则验证成功。
设置译码器输入端:
编码器输出的卷积码序列:
channel_output=[111011010010100001011100000000100011110111000000]
加了噪声之后的序列(被送到译码器中进行译码的序列):
channel_output=[011001010110100001011100000000100011110111000001]
经过译码器译码之后的输出序列:
decoder_output=[10110100]
该序列与原始的输入序列coder_input=[10110100]相同,即还原到了原始的输入序列,达到了纠错的目的。
验证成功[8]。
3.4数据分析
解码的结果见图8和图9。
Hereisanexampleofhowthefunctionstepworks:
ConsiderarandomlygeneratedstableTransferFunctionModel:
oftheformG(s)=num(s)/den(s):
num=
00-0.03760.0896-0.0533
den=
1.00002.97372.82170.91420.0908
图8解码结果
图9解码仿真结果图
4SIMULINK下仿真设计
4.1卷积码的仿真
图10卷积码的编译译码框图
如上图10的信号流程可以表示为先由BernoulliBinaryGenerater(贝努利二进制序列产生器)产生一个0,1等概序列,经过ConvolutionalEcoder(卷积编码器)对输入的二进制序列进行卷积编码,并用BPSK解调制后送人ViterbiDcoder(viterbi译码器)进行硬判决译码。
最后经过ErrorRateCaculation(误码统计)后由Display(显示输出)。
然后通过Selector(数据选通器)将结果输出到Toworkspace(工作区间)。
4.2SIMULINK模块仿真参数设置及意义
在建立如果10所示的仿真模块后,对各个模块分别一一进行设置后并运行仿真
图11贝努利二进制序列产生器模块的设置框图
如上图11是贝努利二进制序列