【具体实施方式】
以下结合具体实施例对译码流程进行详细说明。
步骤A:在时间单元t=m开始,计算进入每一状态的单个路径的部分量度。存储每一状态下的幸存路径及其量度。
步骤B:t增加一个时间单元,获取该时间单元内各个状态下的幸存路径及量度。将进入某一状态的分支量度与前一时间单元有关的幸存路径的量度相加,计算进入该状态的所有2k路径的部分量度。对每一状态,比较进入该状态的所有2k路径的量度,选择具有最大量度的路径(幸存路径),存储该路径及其量度,并删除其他所有路径。其他状态同此操作。
上述步骤A和步骤B与传统的维特比译码方法相同,在此不赘述。
步骤C:如果t<m+t0,重复步骤B;否则,将当前2n个路径的量度转化为相应的度量状态码x。其中,t0是令所有2n个状态都能拥有幸存路径及其量度所需要的时间。由卷积码原理及状态的可达性知,在刚开始的若干时间单元,不是所有2n个状态都能拥有幸存路径及其量度。要令所有2n个状态都能拥有幸存路径及其量度所需要的时间为t0。一旦卷积码的参数被确定,t0也就随之确定,即一种型号的卷积码对应一个确定的t0。例如(2,1,3)型卷积码,t0为2个时间单元。
以下对度量状态码及得到其的相关概念进行说明。
差值模式:由自然数组成的一个向量,例如[7 14 13 19 22],找出向量中数值最小的数,向量的各元素减去该最小数值,并保持各元素顺序关系不变,形成的新的向量被称为原向量的差值模式,例子中最小的是7,各元素减去7,得到该向量的差值模式为[0 7 6 12 15]。不同的向量可以具有相同的差值模式,例如[17 24 23 29 32]的差值模式同样为[0 7 6 12 15]。
度量状态:在维特比译码中,1)将2n条路径的分支量度按顺序排列,组成一个向量,排列顺序一旦确定,就不再变更;2)将该向量差值模式化,该差值模式称作原量度向量所对应的度量状态。度量状态在译码过程中和2n个幸存路径的量度是等效的。这一点通过分析原维特比算法可以得到。
由于引入了差值模式表示的度量状态这一概念,译码器不再是基于各状态的分支量度值即量度向量,而是基于各状态量度的差值模式即度量状态。
通过对网格图的观察可知,对于任意卷积码,不同的度量状态的数量是有限的。因此,可以建立一个完整度量状态集,将有限的度量状态包括在内,任何时间单元译码器都处于这个完整度量状态集的某一度量状态。
完整度量状态集:对于一种卷积码和一个确定的u值,度量状态的数量是确定的,称该卷积码在确定的u值下所有的度量状态组成的集合为完整度量状态集。根据度量状态的有限性,在某一具体实现中,将完整度量状态集中所有的度量状态进行编号,生成度量状态码x。度量状态码x与具有有限个度量状态的度量状态集中的度量状态一一对应且无重复。
以下是一种完整度量状态集S的实现方法:
令S=空集。
步骤C1:从t=m到t=m+t0的时间段内,从状态0开始,向译码器输入0~2nu-1共2nu种不同的待译码序列,获得所有可能的度量状态,将获得的度量状态加入所述度量状态集;
步骤C2:对于所述度量状态集中的每一个度量状态,从处于该度量状态的时刻开始的u个时间单元内,向译码器输入0~2nu-1共2nu种不同的待译码序列,获得所有可能的度量状态;对S中的每个元素s做如下运算:
s属于S。假设t=i,度量状态为s。从t=i到i+u这段时间内只有有限种不同的待译码序列,穷举所有的待译码序列,得到i+u时刻所有可能的度量状态,并在本步的最后阶段,将新出现的度量状态添加到S中。
步骤C3:判断是否有新的度量状态,若有,则将获得的新的度量状态加入所述度量状态集,执行步骤C2;否则结束。
如果知道译码器u个时间单元以前的度量状态和这u个时间单元到来的待译码序列,那么当前时刻的度量状态和2n条幸存路径均可确定。把这些信息提前计算出来并存在一个状态迁移数组TM中。这样一来,在译码过程中就可以直接调用这些计算好的结果,而不用实时的通过ACS(加比选运算)去计算,达到减少运算、节省时间的目的。
步骤D:t增加u个时间单元,根据度量状态码x和输入的待译码序列y查询预先计算得到并存储的状态迁移数组TM[X][Y],获取数组中的数据项TM[x][y],并从数据项TM[x][y]中得到如下信息:新的度量状态码;更新所有2n条幸存路径所需的信息;并以此更新并保存新的幸存路径。
用X表示完整度量状态集的基数(度量状态的个数),用Y表示u个时间单元不同的待译码序列的种数。TM是一个X×Y大小的数组。TM[x][y]的x表示度量状态码,y表示该u个时间单元到来的待译码序列。对于(2,1,3)型卷积码,u=2,则y是2个时间单元内到来的,即4位的待译码序列。
u是根据具体的应用环境而定。
u越大表示一次可译码更多数据,整个译码器译码速度相比与传统的译码器速度更快。以(2,1,3)卷积码译码器为例,传统的译码器一次译码n=2bit的待译码信息序列。而u取2时,表示新的译码器一次译码u×n=2×2=4bit的待译码信息序列,在这个层面上译码器速度至少提高了一倍。而再考虑到节省了大量加比选运算,效率将进一步提高。实际中,在TI的ARM处理器平台上,分别实现新型译码器和一般的ACS译码器,并进行比较。测试结果是新型译码器速度提高了241%,也就是说速度是一般ACS译码器的3.4倍。
但u越大,系统内存消耗越高。系统内存的消耗主要是由于状态迁移数组存储于内存中。考虑TM[X][Y]中X是度量状态的数量,当选定了某种(n,k,v)卷积码,X一般就确定下来了,而Y=2nu,由n和u决定,n由卷积码的参数决定,但u可由实际应用决定。为了加快译码速度,u越大越好,但Y是随着u呈指数增长,而整个TM数组所占的内存是X×Y=X×2nu,随着u增大,内存消耗将急剧增加。
通常在实现中,应该在速度和内存之间找到一个平衡。这个平衡就是选取合适的u值,提高译码器的速度(u越大越好);同时又要考虑系统内存的限制(u不能过大),以确保内存足够用于存储TM以及系统的其它数据。
TM[x][y]记录了以下信息:1)新的度量状态码;2)更新所有幸存路径所需的信息。
新的度量状态码:根据u个时间单元前的度量状态和这u个时间单元的待译码序列,便可确定当前时刻的度量状态,以及相应的新的度量状态码。
更新所有幸存路径所需的信息:1)当前时刻各条幸存路径对u个时间单元以前的旧幸存路径的继承关系;2)这u个时间单元内各条幸存路径在所继承的旧幸存路径后所经过的新路径。
获取上述状态迁移数组可采用如下方法:
对于所有的0≤x≤X-1、0≤y≤2nu-1,模拟度量状态码为x且输入待译码序列为y时的维特比译码器中的解码过程,从而获得所述2n条幸存路径在经过u个时间单元后,各条新的幸存路径对u个时间单元以前的旧的幸存路径的继承关系、以及继承所经过的路径,从而得到状态迁移数组中的数据项TM[x][y]。当获得所有的TM[x][y]后,即可得到状态迁移数组。
在本实施例中,事先使用matlab仿真来计算TM中的每一个元素,并将结果记录下来,整理成表。如何使用matlab仿真一个卷积码编码译码系统,是一项简单的普遍的公开的技术,因此,在此不再展开。至此,可按上述具体方法得到TM的每个元素,以致得到整个TM。在译码过程中,一旦译码器启动,TM将被写入内存,以便译码时直接调用。
步骤E:输出译码序列,如果t<h+m,重复步骤D;否则停止;其中h为待译码序列传输时间。例如,对(2,1,3)卷积码,一个时间单元发送2位待译码序列,假设待译码序列总长度为100位,待译码序列的传输时间h=100/2=50个时间单元,也就是说译码器需要50个时间单元才能接收完所有待译码序列。
采用查状态迁移数组获取译码信息,译码器一旦获取了正确的译码信息,作为后续操作的信息序列的输出可以采用现有的公开技术,例如维特比译码的截尾译码输出,在此略去。
从上述描述中可以看出,步骤A和步骤B,译码算法和采用ACS(加比选)方式实现的维特比算法一致。但当t达到m+t0后(此实例t0=2),进入到步骤C和步骤D时,译码算法发生了如下变化:
1)以度量状态码取代原来的2n条路径的量度;
2)由一次处理一个时间单元待译码序列变为一次处理u个时间单元的待译码序列。
在传统的维特比算法具有步骤:“将进入某一状态的分支量度与前一时间单元有关的幸存路径的量度相加,计算进入该状态的所有2k路径的部分量度。对每一状态,比较进入该状态的所有2k路径的量度,选择具有最大量度的路径(幸存路径),存储该路径及其量度,并删除其他所有路径”,因此可以采用差值模式替代各个分支量度,也就是,用度量状态替代量度向量,证明如下:
该步骤对每一状态,选择具有最大量度的路径(幸存路径),存储该路径及其量度,并删除其他所有路径。当译码器处于某一状态,在给定待译码序列的情况下,相应的分支量度随之确定。于是,决定该状态的幸存路径及其量度的唯一因素是前一时间单元各幸存路径的量度或者说各状态的量度,共有2k个。用一向量表示这组量度,记为C=[c1 c2…c2 k],设其按维特比算法经过加比选运算后得到的译码信息为:新的一组幸存路径L=[l1 l2…l2 k](注,此处li指代一条幸存路径,由于译码器共有2k条幸存路径,这些幸存路径共同组成了一个幸存路径向量L),量度为D=[d1 d2…d2 k](注,此后的论述中,凡提及量度这一概念,均指代由所有状态的分支量度共同组成的量度向量)。把量度C换成量度C+v=[c1+v c2+v…c2 k+v],v可为任意整数,且其它条件不变。按维特比算法经过加比选运算后得到的译码信息为:新的幸存路径仍为L,量度变为D+v=[d1+v d2+v…d2 k+v]。C改变为C+v未对随后的幸存路径造成影响,而只是使得量度从D变为了D+v。简单的观察可知,同样可以将作为下一次译码的条件的量度D+v改变为D+v+u而不影响后续译码所得到的幸存路径。由维特比译码原理可知,若幸存路径不受影响,这也就不会影响维特比译码器的译码结果。特别是,当使u=-v时,D+v+u=D+v-v=D,这将抵消掉前一次译码过程中译码器量度从C改变为C+v所造成的影响。简而言之,像将量度C改变为C+v这种操作不会对译码器的正确性及其结果造成影响。而由差值模式的定义可知,一个量度C,其差值模式C*=C-min{c1 c2…c2 k},(min{}表示取{}中的最小值)。这也就是说,C*=C+v,v=-min{c1 c2…c2 k}。上式表明,在译码过程中用量度的差值模式代替量度本身用于译码不会对译码器造成影响。
正是由于差值模式的引入,使得可以用查表方式代替实时的ACS运算单元,这将极大的提高译码速度。
图1为与上述译码流程相应的一实施例的维特比译码器结构框图。
该维特比译码器包括输入单元110、加比选单元120、状态迁移模块130以及更新单元140。
输入单元110从外界接收待译码序列,根据卷积码的不同和译码方式(加比选/查询状态迁移数组)的不同,将待译码序列按规定大小发送给下一个单元。例如在案例中,(2,1,3)卷积码译码器的输入单元每个时间单元从外界接收2位的待译码序列;在m+t0以前,输入单元选择加比选译码方式并每次向加比选单元发送2位的待译码序列,而当时间达到m+t0后,输入单元选择查询状态迁移数组译码方式并每次向状态迁移模块发送4位的待译码序列。
加比选单元120是传统的维特比译码器的译码核心单元。在本实施例中,其输入是2位的待译码序列和旧的分支度量和幸存路径,经过相加、比较和选择,计算出新的分支度量和幸存路径,输出新分支度量和幸存路径。具体为在时间单元t=m开始,计算进入每一状态的单个路径的部分量度,存储每一状态下的幸存路径及量度,此后t每增加一个时间单元,将进入某一状态的分支量度与前一时间单元有关的幸存路径的量度相加,计算进入该状态的所有路径的部分量度,从该状态的所有路径的量度中选取具有最大量度的路径。
更新单元130从加比选单元120获得各个状态下的幸存路径及分支量度并更新存储。
状态迁移模块140在t≥m+t0后,将当前2n个路径的量度转化为相应的度量状态码x,且使输入单元每隔u个时间单元获取一段待译码序列y,其中,t0是令所有2n个状态都能拥有幸存路径及其量度所需要的时间,所述度量状态码x与具有有限个度量状态的度量状态集中的度量状态一一对应且无重复,所述度量状态为某一时间单元内所有2n个分支量度按照顺序形成的向量的差值模式。
状态迁移模块140还根据度量状态码x和输入的待译码序列y查询预先计算得到并存储的状态迁移数组TM[X][Y],获取数组中的数据项TM[x][y],并从数据项TM[x][y]中得到如下信息:新的度量状态码;更新所有2n条幸存路径所需的信息;其中,X是度量状态集中的度量状态的数量,Y=2nu,0≤x≤X-1,0≤y≤2nu-1,u≥2。
更新单元130从状态迁移模块140获得译码信息并保存新的幸存路径和度量状态,输出译码序列。
该译码器采用上述的译码方法,可以极大地提高译码效率。
以下将以(2,1,3)卷积码为例进行具体方案的描述。
图2为(2,1,3)卷积码的网格图。由该网格图可以确定该卷积码的所有编码参数。图中带箭头横线旁的数据表示原始数据即信息序列,括号内的数据表示编码器输出的待译码序列,例如当编码器处在状态0,收到原始数据1,将输出待译码序列11,并进入状态1。
构建(2,1,3)卷积码的完整度量状态集S的方法如下。
第一步:令S=空集。
第二步:从m到m+t0这段时间内只有有限种不同的待译码序列,穷举所有的待译码序列,得到t=m+t0时刻所有可能的度量状态,并添加到S中;
具体描述如下:
令卷积码编码器和译码器都是从状态0出发的,图2中显示经过2个时间单元后,所有四个状态都将可达,都将获得各自的幸存路径及量度,所以t0=2。
从m到m+t0(即m+2)这段时间内只有24种不同的待译码序列,0000、0001、0010、0011、0100、0101、0110、0111、1000、1001、1010、1011、1100、1101、1110和1111。根据维特比算法进行计算,便能得到在上述16种待译码序列分别作为输入,译码器处在状态0的情况下,到m+2时译码器的各个状态的幸存路径及其量度。有了这些信息,并进行差值模式运算,我们便能得到m+2时刻可达到的所有的度量状态。
经计算得第一批度量状态:(注:度量状态用向量[x1 x2 x3 x4]表示,xi对应状态i的分支量度在差值模式下的数值)
[0 2 3 3],[2 0 3 3],[3 3 0 2],[3 3 2 0],[0 2 1 1],[2 0 1 1],[1 1 0 2],[1 1 2 0],[0 0 1 3],[0 0 3 1],[1 3 0 0],[3 1 0 0]共12个。
将这些度量状态添加到S当中。结果是,
S={[0 2 3 3],[2 0 3 3],[3 3 0 2],[3 3 2 0],[0 2 1 1],[2 0 1 1],[1 1 0 2],[1 1 2 0],[0 0 1 3],[0 0 3 1],[1 3 0 0],[3 1 0 0]}。
第三步:对S中的每个元素s做如下运算:
s属于S。假设i时刻,度量状态为s。从i到i+u这段时间内只有有限种不同的待译码序列,穷举所有的待译码序列,得到i+u时刻所有可能的度量状态,并在本步的最后阶段,将新出现的度量状态添加到S中。
具体描述如下:
本案例中,取u=2(u的取值受系统的内存限制,u取值越大,实现时需要的内存越多)。
由第二步知当前集合S={[0 2 3 3],[2 0 3 3],[3 3 0 2],[3 3 2 0],[0 2 1 1],[2 0 1 1],[1 1 0 2],[1 1 2 0],[0 0 1 3],[0 0 3 1],[1 3 0 0],[3 1 0 0]}。
假定在i=m+t0=m+2时刻,译码器的度量状态为[0 2 3 3]。在u=2个时间单元内只有24,即16种不同的待译码序列,0000、0001、0010、0011、0100、0101、0110、0111、1000、1001、1010、1011、1100、1101、1110和1111(当然,若取u=3,在3个时间单元内将有26=64种不同的待译码序列,000000、000001、……、111110和111111)。以上述16种待译码序列分别作为输入,在译码器处在度量状态[0 2 3 3]的情况下,计算得到t=i+u=m+2+2=m+4时译码器的各个状态的幸存路径和译码器的新的度量状态。
例如,在度量状态为[0 2 3 3]时分别输入前述的16种不同的待译码序列,经计算,将得到的度量状态有:
[0 2 3 3],[2 0 3 3],[3 3 2 0],[3 3 0 2],[0 0 2 1],[0 0 1 2],[1 2 0 0],[2 1 0 0],[0 2 1 1],[2 0 1 1],[1 1 1 0],[1 1 0 1],[0 1 1 1],[1 0 1 1],[1 1 2 0]和[1 1 0 2]共16个度量状态。
又例如,在度量状态为[0 2 1 1]时分别输入前述的16种不同的待译码序列,经计算,得到度量状态:
[0 2 2 2],[2 0 2 2],[2 2 2 0],[2 2 0 2],[0 0 1 0],[0 0 0 1],[0 1 0 0],[1 0 0 0],[0 0 1 1],[1 1 1 0],[1 1 0 1],[0 1 1 1],[1 0 1 1]和[1 1 0 0]共14个度量状态(存在重复,所以少于16)。
类似,将当前集合S中所有的度量状态都计算一次,并在本步的最后,把新得到的不属于S的度量状态添加到S中。
例如,在对度量状态[0 2 3 3]的计算中,得到了度量状态[0 2 3 3],[2 0 3 3],[3 3 2 0],[3 3 0 2],[0 0 2 1],[0 0 1 2],[1 2 0 0],[2 1 0 0],[0 2 1 1],[2 0 1 1],[1 1 1 0],[1 1 0 1],[0 1 1 1],[1 0 1 1],[1 1 2 0]和[1 1 0 2]。
经过与当前S中的度量状态比较,发现[0 2 3 3],[2 0 3 3],[3 3 2 0],[3 3 0 2],[0 2 1 1],[2 0 1 1],[1 1 2 0]和[1 1 0 2]均已在S中,而新的度量状态[0 0 2 1],[0 0 1 2],[1 2 0 0],[2 1 0 0],[1 1 1 0],[1 1 0 1],[0 1 1 1]和[1 0 1 1]不在S中。
这新出现的8个度量状态,在本步的最后,也就是对S中现有的12个度量状态[0 2 3 3],[2 0 3 3],[3 3 0 2],[3 3 2 0],[0 2 1 1],[2 0 1 1],[1 1 0 2],[1 12 0],[0 0 1 3],[0 0 3 1],[1 3 0 0],[3 1 0 0]都按上述方式计算完毕后,将被添加到S中。
当然被添加的不仅仅是在计算[0 2 3 3]过程中得到的这8个新度量状态,在计算其他度量状态的过程中得到的新度量状态也同样被添加进去,例如在计算[0 2 1 1]时得到的14个度量状态[0 2 2 2],[2 0 2 2],[2 2 2 0],[2 2 0 2],[0 0 1 0],[0 0 0 1],[0 1 0 0],[1 0 0 0],[0 0 1 1],[1 1 1 0],[1 1 0 1],[0 1 1 1],[1 0 1 1]和[1 1 0 0],经比较发现均不属于当前集合S中,因此,它们也将在本步的最后阶段一并被添加进集合S。
第四步:是否有新的元素被添加到S中。若有,返回第三步;否则,当前的S即为完整度量状态集,结束。
由于度量状态是有限的,因此,必然在经过若干次第三步第四步的循环后将不会有新的度量状态出现,否则,将违背度量状态的有限性。一旦没有新的度量状态被添加到S中,这就说明当前的度量状态集合S是完备的,也就是说译码器处在S中的任意状态,当收到任一u个时间单元的待译码序列,进行译码后,都只会进入到一个同样属于S度量状态。
表1给出(2,1,3)型卷积码经计算所得到的完整度量状态集及各个度量状态所对应的度量状态码(即表中的“编码”,度量状态码是人为约定,也就是说不同的实现可以采用不同的度量状态码,但对于一次具体的译码器实例,度量状态码一经确定,就不允许变更)。
表1 度量状态码和度量状态的对应关系表
例如,度量状态码14表示度量状态[1 0 1 1]。
图3是对上述构建过程中的集合S的扩展过程的简要表示。方框代表计算过程中的不完整的度量状态集S。
构建状态迁移数组TM的方法如下。
在本实施例中,完整度量状态集中度量状态的数量M=35,又因u=2,知待译码序列的种数N=16,知TM是一个35×16大小的数组。在此,我们通过描述TM中任一数据项TM[x][y]的构建过程,来进一步阐明TM的构建。
以本实施例中TM[0][4]的构建过程为例。
已知度量状态码x=0,参考表1,即知译码器处在度量状态[0 0 0 0];待译码序列y=4(十进制),表示长度为两个时间单元的待译码序列0100(二进制)。当译码器处在度量状态[0 0 0 0],收到待译码序列0100,按维特比卷积码译码原理,计算可得译码器将进入度量状态[1 0 1 1],其对应的度量状态码为14。
通过计算得到各条新幸存路径对两个时间单元以前的旧幸存路径的继承关系,分别是:
新幸存路径0继承旧幸存路径2;
新幸存路径1继承旧幸存路径3;
新幸存路径2继承旧幸存路径1;
新幸存路径3继承旧幸存路径1。
其中“幸存路径0”表示状态0所对应的幸存路径,其它幸存路径也用同样的表示方法。
再计算各条新幸存路径在所继承的旧幸存路径后所经过的新路径,例如新幸存路径0在继承旧幸存路径2后将经过的新路径,经计算知,该新路径用信息序列表示为00,00的具体含义如图4所示(加粗路径)。表示路径从状态2出发,经过一个时间单元,沿着信息序列为0的路径到达状态0,再经过一个时间单元,沿着信息序列为0的路径到达状态0,走过的新路径用信息序列表示为00。只有通过这条路径,处于图中最右侧的幸存路径0才能与图中最左侧的幸存路径2联系到一起,形成继承关系。
类似的也可得到其它新幸存路径有关新路径的信息。例如,新幸存路径1继承旧幸存路径3后,新路径用信息序列表示为01,新幸存路径2继承旧幸存路径1后,新路径用信息序列表示为10,新幸存路径3继承旧幸存路径1后,新路径用信息序列表示为11。
将上述4条新路径信息整合到一张图中便得到图5。图中加粗部分表示新路径。
对这些计算得到的信息进行整合并存储到TM[0][4]当中,便完成了状态迁移数组元素TM[0][4]的构建。按照上述过程计算获得TM中的每个元素TM[x][y]。
基于上述的状态迁移数组TM[X][Y],下面给出对(2,1,3)型卷积码的具体译码流程。
步骤a:在时间单元t=0开始(设首个待译码数据在时刻0到达),计算进入每一状态的单个路径的部分量度。存储每一状态下的幸存路径及其量度。
步骤b:t增加1个时间单元。将进入某一状态的分支量度与前一时间单元有关的幸存路径的量度相加,计算进入该状态的所有2k路径的部分量度。对每一状态,比较进入该状态的所有2k路径的量度,选择具有最大量度的路径(幸存路径),存储该路径及其量度,并删除其他所有路径。上述k=1。
上述两步和一般的ACS维特比译码器相同,在此不再详述。
步骤c:如果t<2,重复步骤b;否则,参考表1根据当前4个路径的量度,获得相应的度量状态码x。
至此译码器将进入第四步,开始采用新的译码方式。
步骤d:t增加u=2个时间单元。在过去的2个时间单元接收到的数据的值用y表示。查询状态迁移数组TM,从TM[x][y]中读取以下信息:
1)新的度量状态码:TM[x][y].新的度量状态码。此处采用嵌入式C语言形式的伪代码。a.b表示一个数据结构a中的元素b。
2)用于更新所有4条幸存路径所需的信息,包括:
TM[x][y].新幸存路径0继承关系,TM[x][y].新幸存路径0的新路径;
TM[x][y].新幸存路径1继承关系,TM[x][y].新幸存路径1的新路径;
TM[x][y].新幸存路径2继承关系,TM[x][y].新幸存路径2的新路径;
TM[x][y].新幸存路径3继承关系,TM[x][y].新幸存路径3的新路径。
译码器的度量状态从“TM[x][y].新的度量状态码”中读取;并根据上述相关信息按维特比译码原理完成对幸存路径0,1,2,3的更新。
本实施案例采用截尾译码输出,当幸存路径达到预定长度16后,每执行一次步骤d,便从幸存路径0输出2比特的信息序列。截尾译码输出在卷积码译码领域是一项公开技术,在此不再详述。
步骤e:如果t<h(h为待译码序列传输时间),重复步骤d;否则停止。在本实施例中,一旦译码停止(全部待译码序列到达),和一般的维特比译码器一样,还要将剩余在幸存路径中的信息序列输出。本译码器采用把幸存路径0中剩下的信息序列作为输出。
参考图1,输入单元完成译码方式的选择和待译码序列长度的匹配工作:当t<2,译码器通过ACS加比选单元完成译码工作,一次译码一个时间单元即2比特的待译码序列;当t≥2,译码器采用效率更高,获取信息更快速的TM状态迁移数组来完成译码工作,一次译码两个时间单元即4比特的待译码序列。更新单元在开始的2个时间单元从ACS获取所需的译码信息,之后将从TM获取译码信息,完成对幸存路径,度量状态码等的更新,并采用截尾译码输出,根据幸存路径的长度是否达到设定值16判断是否需要输出信息序列。当幸存路径长度达到16,开始输出译码序列。
以下对“u个时间单元译码流程”进行具体的描述。
本部分将对新译码方式“待译码序列-输入单元-TM-信息序列”该流程的单独一轮计算过程进行描述。
设t=100,m=0,系统处在度量状态码x=0的度量状态下,接收到待译码序列y=0100时,
1)由于t=100>m+t0=2,所以输入单元将接收到待译码序列y=0100发送至TM模块。
2)TM模块接收到x=0,y=0100,并查询内存中的TM,得TM[0][4]中的信息,如下:
TM[0][4].新的度量状态码=14;表示经过2个时间单元,进入度量状态为[1 0 1 1],参考表1。
TM[0][4].新幸存路径0继承关系=2,TM[0][4].新幸存路径0的新路径=00;表示新的幸存路径0继承自旧的幸存路径2,且继承经过的路径是00。
TM[0][4].新幸存路径1继承关系=3,TM[0][4].新幸存路径1的新路径=01;表示新的幸存路径1继承自旧的幸存路径3,且继承经过的路径是01。
TM[0][4].新幸存路径2继承关系=1,TM[0][4].新幸存路径2的新路径=10;表示新的幸存路径2继承自旧的幸存路径1,且继承经过的路径是10。
TM[0][4].新幸存路径3继承关系=1,TM[0][4].新幸存路径3的新路径=11;表示新的幸存路径3继承自旧的幸存路径1,且继承经过的路径是11。
3)更新单元按TM模块提供的更新信息更新译码信息。
为了便于描述,用System表示当前系统,则更新单元将做如下操作:
System.度量状态码=TM[0][4].新的度量状态码=14;
System.幸存路径0←System.幸存路径2;
System.幸存路径0:在尾部添加00;
System.幸存路径1←System.幸存路径3;
System.幸存路径1:在尾部添加01;
System.幸存路径2←System.幸存路径1;
System.幸存路径2:在尾部添加10;
System.幸存路径3←System.幸存路径1;
System.幸存路径3:在尾部添加11。
“←”运算表示将某项2个时间单元前的值赋给当前项。例如,System.幸存路径0←System.幸存路径2,表示用2个时间单元前的System.幸存路径2覆盖System.幸存路径0;本案例编程使用嵌入式C语言,“System.幸存路径0:在尾部添加00(二进制)”,表示System.幸存路径0左移2位并在低位添加00。这便得到了更新后的System.幸存路径0。类似的我们也可完成其它3条路径的更新。
4)更新单元输出译码信息
将System.幸存路径0的最高2位作为译码信息输出。如当System.幸存路径0=1100 0000 0000 0000时,系统将输出11。
以上所述实施例仅表达了本发明的几种实施方式,其描述较为具体和详细,但并不能因此而理解为对本发明专利范围的限制。应当指出的是,对于本领域的普通技术人员来说,在不脱离本发明构思的前提下,还可以做出若干变形和改进,这些都属于本发明的保护范围。因此,本发明专利的保护范围应以所附权利要求为准。