1、卷积码编码器和译码器的设计卷积码编码器和译码器的设计摘 要为了在太空通讯时对受到干扰的信息进行纠正,应该使用纠错码对信息进行编码和译码,卷积码是很好的一种纠错码,本文使用Verylog HDL硬件描述语言对卷积码的编码和译码进行了研究,其中以(2,1,3)码为例,讲解了编码器状态转换图,篱笆图,按最大似然法则试图寻找最小汉明距离的路径等,并且得到了几点结论,完成了编码和译码的设计。关键字 卷积码;Verilog HDL;编码;译码The design of Encode&Decode of Convolution CodeAbstractIn order to communicate in s
2、pace to interfere with the information correct, should use Error correcting code information for encoding and decoding, convolution code is a very good Error correcting code, this paper used Verylog HDL hardware description language to the encoding and decoding convolution code, among them with (2,1
3、,3) code, for example, explained encoder state transition figure, the fence figure, at maximum likelihood law trying to find the minimum distance of the route of the han, and get some conclusion, complete the coding and decoding design.Keywords Convolution code; Verilog HDL; Encode; Decode目录第1章 绪论 1
4、1.1 引言 1第2章 卷积码的编码 22.1 卷积码的定义 22.2 卷积码编码器 22.2.1 (2,1,3)编码器说明 32.2.2 由生成序列求出编码信息 42.2.3 由信息序列得到码序列的计算 5第3章 Verilog HDL设计卷积码的编码器及仿真研究 73.1 编码器的Verilog HDL程序 73.1.1 Verilog HDL源程序 73.1.2 Verilog HDL测试程序 83.2 前仿真波形 8第4章 卷积码的译码 114.1 卷积码译码主要方法 114.2 Viterbi译码原理 124.3 (2,1,3)卷积码状态转换图 134.4(2,1,3)卷积码篱笆图
5、144.5 译码分析 164.5.1幸存路径选择过程 17第5章 译码模块与程序 355.1 译码模块 355.2 Verylog HDL程序 355.2.1 距离计算模块 355.2.2 矩阵计算模块 365.2.3 比较选择模块 375.2.4 路径和信号输入模块 375.2.5 路径存储模块 385.2.6 信号存储模块 405.2.7 矩阵迭代模块 415.2.8 矩阵化简模块 425.2.9 输出判断模块 425.2.10 D触发器模块 445.2.11 总模块 445.3 测试 465.3.1 测试方案一 465.3.2 测试方案二 475.3.3 测试方案三 485.3.4 测试
6、方案四 49结 论 51致 谢 52参 考 文 献 53附录A 译文 54卷积码的维比特译码和费诺译码的比较研究 54附录B 外文原文 61第1章 绪论1.1 引言在太空、宇宙空间和地面的通讯以及卫星和地面的通讯中,信息不可能不受到其他噪声的干扰,如何在接收到的受到干扰的带有错码的信息中,译出正确的原码,这个问题在有关专业一直是一个热门话题,人们往往使用纠错码,卷积码是其中的一种。为了使用卷积码进行传送,必须对原始信息进行编码和译码。卷积码是深度空间通信系统和无线通信系统中常用的一种差错控制编码。在编码过程中,卷积码充分利用了各码字间的相关性。在与分组码同样的码率和设备复杂性的条件下,无论从理
7、论上还是从实践上都证明,卷积码的性能都比分组码具有优势。而且卷积码在实现最佳译码方面也较分组码容易。因此卷积码广泛应用于卫星通信,CDMA数字移动通信等通信系统,是很有前途的一种编码方式。对其进行研究有很大的现实意义。本文主要分四部分,第一部分主要讲述了卷积码的定义,卷积码的编码器说明,本文中一律采用(2,1,3)卷积码为例。第二部分主要讲述的是卷积码编码器源程序和测试程序,以及经过调试得出的波形图。第三部分主要讲述了卷积码译码主要方法,维特比译码的原理,作出了卷积码状态转换图和篱笆图,并对它们作了详细的讲解。对于幸存路径的选择过程一步步作了分析,十分直观。第四部分主要是译码模块的程序,以及对
8、其纠错性能的几种测试方法。最终得出了一些结论。 第2章 卷积码的编码2.1 卷积码的定义卷积码是由麻省理工学院的埃里亚斯(Elisa)于1955年提出的。在任意给定的时间单位时刻,编码器输出的n0个码元中,每一个码元不仅和此时刻输入的信息元有关,而且还与之前连续m个时刻输入的信息元有关。这是与分组码最大的区别,分组码的n0个码元,每一个码元仅和此时刻输入的k0个信息元有关。通常,n0和k0都是小的整数。m为编码存储。卷积码通常用(n0,k0,m)表示。卷积码码元和信息元都属于0,1,所以我们定义模2加法运算,即0+0=0,0+1=1+0=1,1+1=0。本文的所有运算都是模2加法运算。从卷积码
9、的定义,我们可以得到结论: k0是在在任一时刻单元,送入编码器的信息元的个数。n0是在任一时刻单元,从编码器输出的每一个已被编码的子码应含有的码元数。m 是指从编码器输出的任一个子码中的码元不仅与此时此刻的信息元有关,而且还与前m个时刻的信息元有关,因此在编码过程中,每m+1=N个子码之间有互相约束关系。与此同时,移位寄存器的个数就是m 。卷积码的纠错性能随N的增加而增大,而差错率随N的增加而指数下降。在编码器复杂性相同的情况下,卷积码的性能优于分组码。但卷积码没有分组码那样严密的数学分析手段,目前大多是通过计算机进行好码的搜索。2.2 卷积码编码器若n0=2、k0=1、m=3,则得到的是(n
10、0,k0,m)=(2,1,3)卷积码。由上可知(2,1,3)卷积码有一位输入(k0=1),两位输出(n0=2),移位寄存器的个数为3(m=3),在编码过程中,编码器输出的任一个子码中的码元不仅与此时此刻的信息元有关,而且还与前3个时刻的信息元有关,即每4个子码之间有互相约束关系。下面是它的编码器示意图:图2.1 卷积码编码器示意图2.2.1 (2,1,3)编码器说明设待编码的信息序列为X,编码前,先将它以k0=1个码元为单位分成各组,编码器内含m=3个移位寄存器,命名为temp1、temp2、temp3 ,每个移位寄存器都有k0=1位。在每单元时刻内,k0个信息码元输入到编码器内,和编码器内t
11、emp1、temp2、temp3这3个移位寄存器内存储的内容按照模2加法进行逻辑运算后输出,随后相应的每个移位寄存器内存储的k0位前一时刻输入的各信息元都移动到后一个移位寄存器内,为后一时刻运算作准备。 系统初始化时,将temp1、temp2和temp3全部复位清0。信号序列说明:在(2,1,3)卷积码中,因为k0=1,所以设信息序列为X= x0(1)x1(1)x2(1),其中xt(1)表示第t个时刻的第k0个信息元。即x0(1)是第零个信息元(t=0时刻),x1(1)是第一个信息元(t=1时刻),x2(1)是第二个信息元(t=2时刻),以此类推。乘法器说明:图中gp(i,j)表示常数乘法器,
12、(i=1,2,3, -k0)、( j=0,1,2, -n0-1)、(p=0,1,m),共有(m+1)n0个,当gp(i,j)=1时,连接线接通,当gp(i,j)=0时,连接线断开。开关K在每单元时刻内移动n0次,所以在每单元时刻内输入此编码器k0个信息元而输出n0个码元。由图2.1可知:g(1,0)= g0(1,0)g1(1,0)g2(1,0)g3(1,0) =1111 g(1,1)= g0(1,1)g1(1,1)g2(1,1)g3(1,1) =1001生成序列: 我们称g(1,1)和g(1,0)为(2,1,3)卷积码的生成序列,它应有n0k0个(即2个)。每1个有(m+1)位(即4位),它们
13、是g0(1,1)、g1(1,1) 、g2(1,1)、g3(1,1) 和g0(1,0) 、g1(1,0) 、g2(1,0)、g3(1,0)。有了编码器的生成序列,就可以求出在任意t时刻编码器的输出。编码规则:g(1,0)=1111表示,在任一时刻t时,输出端0的码元Ct(0)是由此时刻输入的信息元xt(1)与前1个时刻输入的信息元xt-1(1)以及前2个时刻输入的信息元xt-2(1)和前3个时刻输入的信息元xt-3(1)模2相加后的和。g(1,1)=1001表示,在任一时刻t时,输出端1的码元Ct(1)是由此时刻输入的信息元xt(1)与前3个时刻输入的信息元xt-3(1)模2相加后的和。结论:只
14、要编码器结构gp(i,j)给定以后,在任一时刻t时,就可根据输入信息元来求出由编码器输出的码元。2.2.2 由生成序列求出编码信息上一节我们已经知道生成序列为:g(1,0)= g0(1,0)g1(1,0)g2(1,0)g3(1,0) =1111;g(1,1)= g0(1,1)g1(1,1)g2(1,1)g3(1,1) =1001; 公式推导如下:Ct(0)=xt(1)g0(1,0)+xt-1(1)g1(1,0)+xt-2(1)g2(1,0)+xt-3(1)g3(1,0) 代入生成序列的具体值后得:Ct(0)= xt(1)+xt-1(1)+xt-2(1)+xt-3(1); Ct(1)=xt(1)
15、g0(1,1)+xt-1(1)g1(1,1)+xt-2(1)g2(1,1)+xt-3(1)g3(1,1) 代入生成序列的具体值后得:Ct(1)= xt(1)+xt-3(1)或者表示为:Ct(1-j)= xt-p(1)gp(1,1-j) j=0,1卷积码名称就是由上式得出:任一时刻编码器的输出Ct(1-j)可以由信息元与生成序列的离散卷积运算求出。2.2.3 由信息序列得到码序列的计算计算:设输入信息系列为X=(x0(1)x1(1)x2(1)x3(1)x10(1)=(10011101000)代入公式得:C0(0)= x0(1)=1C1(0)= x1(1)+ x0(1)=0+1=1C2(0)= x
16、2(1)+ x1(1)+ x0(1)=0+0+1=1C3(0)= x3(1)+ x2(1)+ x1(1)+ x0(1)=1+0+0+1=0C4(0)= x4(1)+ x3(1)+ x2(1)+ x1(1)=1+1+0+0=0C5(0)= x5(1)+ x4(1)+ x3(1)+ x2(1)=1+1+1+0=1C6(0)= x6(1)+ x5(1)+ x4(1)+ x3(1)=0+1+1+1=1C7(0)= x7(1)+ x6(1)+ x5(1)+ x4(1)=1+0+1+1=1C8(0)= x8(1)+ x7(1)+ x6(1)+ x5(1)=0+1+0+1=0C9(0)= x9(1)+ x8
17、(1)+ x7(1)+ x6(1)=0+0+1+0=1C10(0)= x10(1)+ x9(1)+ x8(1)+ x7(1)=0+0+0+1=1得:输出的码序列C0=(11100111011)C0(1)= x0(1)=1C1(1)=x1(1)=0C2(1)=x2(1)=0C3(1)=x3(1)+ x0(1)=1+1=0C4(1)=x4(1)+ x1(1)=1+0=1C5(1)=x5(1)+ x0(1)=1+0=1C6(1)=x6(1)+ x3(1)=0+1=1C7(1)=x7(1)+ x4(1)=1+1=0C8(1)=x8(1)+ x5(1)=0+1=1C9(1)=x9(1)+ x6(1)=0
18、+0=0C10(1)=x10(1)+ x7(1)=0+1=1得:输出的码序列C1=(10001110101)而码序列C=C0(1) C0(0) C1(1) C1(0) C2(1) C2(0) C3(1) C3(0)C10(1) C10(0);即C=(11 01 01 00 10 11 11 01 10 01 11)在任一时刻单元,送入编码器一个信息元(k0=1),编码器输出由两个(n0=2)码元组成的一个码组,我们称之为子码,每个子码中的码元不仅和此时刻的信息元有关,而且还与前m=3时刻的信息元有关。因此,在编码过程中,每四个(m+1=N=4)子码之间互相约束。我们称N=m+1=4为编码的约束
19、度,它表示编码过程中互相约束的子码数。称N*n0为编码约束长度,它表明编码过程中互相约束的码元数。对(2,1,3)卷积码来说,N=4,N*n0=8。(2,1,3)卷积码是个非系统码,因为在码序列C中的每个子码不是系统的码字结构。由(2,1,3)非系统卷积码的生成,我们不难推广到任一(n0,1,m)非系统卷积码的生成。对于(n0,1,m)码,它的生成完全由n0个生成序列所确定,即由g(1,0),g(1,1),g(1,n0)所确定。如果用矢量表示每个生成序列,则每个矢量中含有N个元素,N=m+1。第3章 Verilog HDL设计卷积码的编码器及仿真研究3.1 编码器的Verilog HDL程序3
20、.1.1 Verilog HDL源程序例如:设串行输入信息系列为X=(x0(1)x1(1)x2(1)x3(1)x10(1)=(10011101000),左边为先入的信号,由上计算可知输出的码序列为C0=(11100111011),C1=(10001110101),即在每单元时刻输入为1位,输出为2位,也就是输出码组序列为C=(11 01 01 00 10 11 11 01 10 01 11)。注意,在每单元时刻,C1为输出的高位,C0为输出的低位,用4进制来描述,就是C=(3 1 1 0 2 3 3 1 2 1 3 ) 从上面的分析,我们可以得到卷积码的编码器模块,而该编码器的Verilog
21、HDL源程序如下:/-convolution.v-(2,1,3)module convolution(reset,c,u,clk); /定义一个编码模块,名字是convolutionoutput1:0 c;/定义输出为2位input u;input clk,reset;/输入时钟信号和复位信号reg1:0c;reg temp1,temp2,temp3;/三个移位寄存器always (posedge clk) begin if(!reset) begin temp1 =0;/全部置零 temp2 =0; temp3 =0; end else begin temp1 = u; temp2 = te
22、mp1; temp3 = temp2; endendalways (posedge clk) begin c0=utemp1temp2temp3;/g(1,0)=(1111) c1=utemp3;/g(1,1)=(1001)endendmodule3.1.2 Verilog HDL测试程序编码器的Verilog HDL测试程序如下: /-convolution1_top.v-timescale 1ns/100ps/时间单位为1ns,时间精度为100psdefine clk_cycle 50/宏定义include “./convolution.v”/文件包含处理,将另一个源文件的内容全部包含过来
23、module clk_top;reg clk,reset,u;wire 1:0 c;/线网类型always #clk_cycle clk=clk;initial begin clk=0; reset=1; #100 reset=0;/复位信号在100个时间单位后是0 #100 reset=1;u=1; #100 u=0; #100 u=0; #100 u=1; #100 u=1; #100 u=1; #100 u=0; #100 u=1;#100 u=0;#100 u=0; #100 u=0 #1800 $stop;end convolution convolution (.reset(res
24、et),.c(c),.u(u),.clk(clk); endmodule3.2 前仿真波形下面列出(2,1,3)卷积码编码器的前仿真波形:若输入是10011101000,输出是31102331213。图3.1 (2,1,3)卷积码编码器输出波形图a若输入的是10101110000,则输出是 31222133230。图3.2(2,1,3)卷积码编码器输出波形图b若输入是00011101000,输出是00032331213图3.3 (2,1,3)卷积码编码器输出波形图c第4章 卷积码的译码4.1 卷积码译码主要方法卷积码译码历时多年,主要方法有以下三种:(1 ) 门限译码法:在1963年由梅西(M
25、ASSEY)提出,这是一种利用码代数结构的代数译码;它的主要特点是算法简单,易于实现,为译出每一个信息元所需的译码运算时间是一个常数,即译码时间是固定的,这是它最大的优点。(2 ) 序列译码法:首先在1961年由乌曾克拉夫特(Wozencraft)提出,之后在1963年时费诺(Fano)改进了序列译码法,这是一种基于码树图结构上的一种准最佳的概率译码,但是序列译码的延时是随机的,它与信道干扰情况有关,这种情况非常难控制。(3 ) 维特比最大似然译码法:在1967年由维特比(Viterbi)提出,这是基于码的篱笆(trellis)图基础上的一种最大似然译码算法,它的运算时间是固定的,其译码的复杂
26、性与m成指数增长,是一种最佳的概率译码方法。在维特比提出以后的两年后,小村(Omura,1969)指出:维特比算法等价于在一个加权图上求取最短路径。1973年,福尼(G.D.Forney)最终证明了维特比算法实质上就是卷积码的最大似然译码。这就是说,从似然的角度上,这种算法已是最优的。后来,Forney又指出,维特比算法不仅可以用于卷积码译码,也可用于宽带有限、存在严重码间干扰的信道的信号的接收。由于最优的特性和相对适中的复杂度,维特比算法在m=10的卷积码译码中已是首选的,最普遍采用的算法。概率译码方法不仅考虑了码的结构,还考虑了信道的统计特性,使译码的性能更好。维特比译码和序列译码是两种最
27、基本的概率译码方法。卷积码的概率译码最早始于1961年由乌曾克拉夫特(Wozencraft)提出的序列译码,这是第一个提出的实用卷积码的概率译码方法。1963年费诺(Fano)对序列译码进行改进,提出了费诺算法,从而推动了序列译码的实际应用。1967年维特比(Witerbi)提出了另一种概率译码算法Viterbi(以下简称VB)算法,它是一种最大似然译码算法。在BSC信道情况下,最大似然译码就是最小距离译码。在码的约束度较小时,它比序列译码算法效率更高、速度更快、译码器也较简单。因而自VB算法提出以来,无论在理论上还是实践上都得到了极其迅速的发展,并被广泛地应用于数字传送系统,特别是被应用于卫
28、星通讯。 4.2 Viterbi译码原理卷积码本质上是一个有限状态机,它的码字是前后相关的。对于编码器输出的任何码字序列,在网格图上一定可以找到一条连续的路径与之对应,这种连续性正是卷积码码字前后相关的体现。但在译码端,一旦输入传输过程中出现差错,输入到译码器的接收码字流在网格图上就找不到一条对应的连续路径,而只能输出不确定,断续的路径供译码参考。从译码器译出的码字序列必须与编码器一致,也对应一条连续路径,否则肯定是译码出现了错误。Viterbi译码算法,通过Trellis图找到具有最大度量的路径,即最大似然路径或最大似然码字。即将接收到的信号序列和所有可能的发送信号序列比较,选择其中汉明距离
29、最小的序列认为是当前发送的序列。维特比译码可分为网格图建立,寻找最优路径,译码这三部分。译码程序流程如图4.1所示:图4.1 译码流程图当译码器接收到一个码字R后,就要按照编码的规则对R进行译码后输出信息码组的估值S。但是信息码组与码字之间是有固定规则的,这也就是相当于信道译码器能给出码字C的估值C,当C与C不相等时,就出现了译码错误,因为只有当C与C相等时,S与S才相等。当译码器收到某一个接收码字R后,根据最大后验概率P(C/R)进行译码判决,一定是译码错误概率最小。根据贝叶斯(Bayes)公式有P(C/R)=P(C)P(R/C)/P(R)。 在给定接收码字R的条件下,在码字集合中,选择使后
30、验概率P(C/R)最大的码字作为译码输出的估值C,这个准则称为最大后验概率译码准则。如果所有码字C的先验概率P(C)相同,则后验概率P(C/R)最大就等效于要求概率P(R/C)具有最大值。我们称P(R /C)为似然函数,这时最大后验译码相当于最大似然函数译码。在二进制对称信道(BSC)下, 可以证明最大似然译码就相当于最小距离译码。实际上在信道传输过程中,码元出错少的概率最大,所以在BSC中,最小距离译码必定是译码错误最小的方法。Viterbi(VB)译码算法是一种最大似然译码算法,也就是最小距离译码,这是我们强调的。在VB译码中,我们利用时间状态图来描述卷积码的编码过程。我们用有限状态机(FSM)来描述该编码器在不同输入的信息序列下,它的各状态之间的转移关系和输出情况。4.3 (2,1,3)卷积码状态转换图下面我们对(2,1,3)卷积码状态转换进行分析:内部暂存寄存器temp3temp2temp1组成了一个3位2进制的状态机,temp3为高位,temp1为低位,总共有8个状态:000、001、010、011、100、101、110、111,可以用S0、S1、S2、S3、S4、S5、S6、S7来记录。初始状态为000,相当于S0。以后每次输入可以是0或者1,而得到相应的输出C(1)C(0),C(1)是高位,C(0)是低位,以及相应的转移得到的新的状态。我