具体实施方式
下面详细描述本发明的实施例,所述实施例的示例在附图中示出,其中自始至终相同或类似的标号表示相同或类似的元件或具有相同或类似功能的元件。下面通过参考附图描述的实施例是示例性的,仅用于解释本发明,而不能理解为对本发明的限制。
在本发明的描述中,需要理解的是,术语“纵向”、“横向”、“上”、“下”、“前”、“后”、“左”、“右”、“竖直”、“水平”、“顶”、“底”“内”、“外”等指示的方位或位置关系为基于附图所示的方位或位置关系,仅是为了便于描述本发明和简化描述,而不是指示或暗示所指的装置或元件必须具有特定的方位、以特定的方位构造和操作,因此不能理解为对本发明的限制。
此外,术语“第一”、“第二”仅用于描述目的,而不能理解为指示或暗示相对重要性。
在本发明的描述中,除非另有规定和限定,需要说明的是,术语“安装”、“相连”、“连接”应做广义理解,例如,可以是机械连接或电连接,也可以是两个元件内部的连通,可以是直接相连,也可以通过中间媒介间接相连,对于本领域的普通技术人员而言,可以根据具体情况理解上述术语的具体含义。
以下结合附图描述根据本发明实施例的软件无线电系统中的高速并行Turbo译码方法。
参考图1,本发明实施例的软件无线电系统中的高速并行Turbo译码方法,包括如下步骤:
步骤S101,接收已经过解速率匹配处理的待译码数据。待译码数据包含系统比特信息序列x1、第一分量码校验比特信息序列z1和第二分量码校验比特信息序列z2三个序列。这三个序列分别存储在内存中的指定位置。
步骤S102,将待译码数据分为M段,并进行重排,使M个分段中对应相同位置的数据位于连续的存储单元,便于读入SIMD寄存器。
步骤S103,使用SIMD指令对重排后的待译码数据进行迭代并行译码。其中SIMD指令并行操作的多个操作数分别对应多个分段。
步骤S104,计算系统比特的对数似然值并进行符号判决,将判决后的译码比特序列进行重排恢复自然顺序后输出。
为了对本发明上述实施例有更深入的理解,以下结合具体例子对本发明的原理进行详细描述。
本发明实施例采用UMTS标准中的Turbo码作为具体例子进行说明。图2示出了该Turbo码的分量码的网格图。Turbo译码过程中对两个分量码的译码将基于该网格图进行。对于系统信息比特长度为N的Turbo码,网格图包含N+1个时刻,每个时刻包含8个状态,分别记为状态0至状态7。网格图说明了不同状态间的转移关系。每两个状态间的转移关系都对应一种特定的输入比特和输出比特的组合,这些组合共有四种,即:输入0输出0、输入0输出1、输入1输出0、输入1输出1。以下说明中均假设N=2557。
下面对步骤S102进行详细说明。
首先,根据Turbo码块长度N以及SIMD指令所能支持的并行操作数个数(以下简称SIMD并行度)P,按照预先设定的规则分别将序列x1、z1和z2分为M段,其中M为大于等于1且小于等于P的整数;前M-1段数据长度相同,记为L1,最后一段数据长度小于等于前M-1段数据的长度,记为L2,即L2≤L1。由N和P导出M、L1和L2的具体方法可以 由本领域技术人员依据实际测试或研究确定,本发明并不对此加以限定。本实施例中,P=M=8,L1=320,L2=317。数据分段的示意图如图3a所示,图中方格内的数字表示序列x1(或z1或z2)中各元素的序号。
然后,使用相同的重排方法将系统比特信息序列x1、第一分量码校验比特信息序列z1、第二分量码校验比特信息序列z2分别进行重排。该重排方法可用矩阵交织的形式进行描述,如图3b所示。具体为:将序列x1(或z1或z2)中的第1段数据从左至右顺序写入一个P行L1列的矩阵的第1行;将序列x1(或z1或z2)中的第2段数据从左至右顺序写入该矩阵的第2行;以此类推直至第M段数据。若第M段数据长度小于前几段数据,则第M行不能填满,剩下未填满的部分可用0或其他值填充;若M小于P,则矩阵中剩下的P-M行也可用0或其他值填充。然后将矩阵中第1列的P个数据从上至下顺序读出并连续存储在内存空间中;将矩阵中第2列的P个数据从上至下顺序读出并连续存储在内存空间中第1列数据的存储位置之后;以此类推直至第L1列。通过重排后,序列x1(或z1或z2)中对应于M个分段中相同位置的数据,比如 现在处于内存中连续的位置,从而便于SIMD处理器从内存中一次性读取M个分段的数据并加载到SIMD寄存器中,使用SIMD指令进行并行译码。具体来说,SIMD处理器根据数据的起始地址从内存中一次性读入连续的P个数据并加载到SIMD寄存器中,若M=P,则P个数据均为有效数据,对应于M个分段;若M<P,则前M个数据为有效数据,对应于M个分段,剩下的P-M个数据为无效数据。
下面对步骤S103进行详细说明。使用SIMD指令对重排后的待译码数据进行迭代译码的过程如图4所示,进一步包括:
步骤S401,迭代前的初始化操作,包括:对步骤S102中重排后的序列x1进行交织操作,交织方法与以下步骤S403中的交织操作方法相同,将交织后的序列记为x2并作为第二个分量码译码的输入;利用待译码数据中两个分量码的尾比特(tail bits)信息分别计算出两个分量码在第N时刻8个状态的后向递推状态度量值,通常也称为beta度量值,用于步骤S402和步骤S404分别对两个分量码并行译码过程中第M个分段后向递推的起始状态进行初始化;以及其他必要的初始化操作。
然后迭代开始。每一次迭代包括:
步骤S402,使用SIMD指令对第一个分量码的M个分段的数据进行并行译码并输出外信息序列Le1。
步骤S403,对序列Le1进行交织,并将交织结果作为第二个分量码译码的输入先验信息序列Lp2。
步骤S404,使用SIMD指令对第二个分量码的M个分段的数据进行并行译码并输出外信息序列Le2。
步骤S405,对序列Le2进行解交织,并将解交织结果作为第一个分量码译码的输入先验信息序列Lp1。
步骤S406,判断是否达到预设迭代次数,若没有达到,则继续进行下一次迭代,重复执行步骤S402至S405,否则停止迭代。
需要说明的是,以上迭代过程的预设迭代次数可以由本领域技术人员根据具体通信系统对Turbo译码误码性能以及对译码吞吐量的要求进行实际测试或研究后确定,本发明对此并没有限制。
迭代译码停止除了采用以上迭代固定次数后停止的方式,还可以采用迭代提前截止的方式,具体为:每一次迭代中,分别在步骤S402和步骤S405之后根据预设的提前截止准则进行判定,如满足提前截止要求则终止迭代过程,否则继续执行当前步骤之后的步骤。提前截止的准则和方法可以由本领域技术人员研究确定,本发明的实施例对此并没有限制。
步骤S402和S404采用的是相同的方法和流程,下面对此进行详细说明。分量码Max-Log-MAP译码过程的基本流程如图5所示。输入包括先验信息序列Lp(对步骤S402来说为上一次迭代过程中步骤S405的输出Lp1,对步骤S404来说为本次迭代过程中步骤S403的输出Lp2)、系统比特信息序列x(对步骤S402来说为上述序列x1,对步骤S404来说为上述序列x2)以及校验比特信息序列z(对步骤S402来说为上述序列z1,对步骤S404来说为上述序列z2)。译码过程包括以下步骤:
步骤S501,后向状态递推(也称beta递推)的训练阶段。为beta递推的正式计算阶段提供初始值。
步骤S502,后向状态递推(也称beta递推)的正式计算阶段。
步骤S511,前向状态递推(也称alpha递推)的训练阶段。为alpha递推的正式计算阶段提供初始值。
步骤S512,前向状态递推(也称alpha递推)的正式计算阶段。
步骤S521,计算并输出系统比特外信息Le。
以上步骤S501和步骤S502的基本原理相同,每一步递推可用下式表示:
βk(sk)=max{βk+1(sk+1)+γk(sk,sk+1),βk+1(s′k+1)+γk(sk,s′k+1)}。(1)
上式中假设时刻k的状态sk与时刻k+1的状态sk+1和s’k+1在图2所示网格图上存在状态转移关系,βk(sk)表示网格图上时刻k、状态sk的后向递推状态度量值(beta度量值), γk(sk,sk+1)表示在网格图上从时刻k的状态sk转移到时刻k+1的状态sk+1所对应的路径度量值,该路径度量值有四种取值,对应系统比特和校验比特的四种组合{00,01,10,11},分别表示为 计算方法如下式所示:
i=0,1;j=0,1。(2)
步骤S501进行的是M个分段并行的beta递推训练阶段,如图6a所示。共包括Tb次递推,对第i(i=1,2,...,M)个分段而言,以时刻(i-1)*L1+Tb作为起始时刻,以时刻(i-1)*L1作为结束时刻。其中Tb为大于等于0且小于等于L2的整数,Tb的具体取值可以由本领域技术人员依据实际测试或研究确定,本发明并不对此加以限定。起始时刻(i-1)*L1+Tb的8个状态的beta度量值初始化为上一次迭代过程中同一个分量码进行步骤S502所述beta递推正式计算阶段时,时刻(i-1)*L1+Tb的8个状态相应的beta度量值。因此在进行步骤S502时,需将M个分段分别在时刻(i-1)*L1+Tb(i=1,2,...,M)的8个beta度量值 s=0,1,...,7存储下来,以便下一次迭代时使用。
每一步beta递推的具体结构如图7a所示。具体包括4组SIMD指令执行的蝶形运算以及beta度量值的防溢出控制。
每一组SIMD指令执行的蝶形运算并行完成对应M个分段的相邻时刻间的递推运算,其中对应第i个分段为(i-1)*L1+k+1时刻的2个状态到(i-1)*L1+k时刻的2个状态的递推蝶形运算。图中Beta[k][s]表示内存空间中连续的P个存储单元,其中前M个连续的存储单元存储着对应M个分段的beta度量值βk(s),..., Gamma_ij[k](i=0,1;j=0,1)表示内存空间中连续的P个存储单元,其中前M个连续的存储单元存储着对应M个分段的路径度量值 Beta[k][s]和Gamma_ij[k]的存储方式便于SIMD处理器从内存中一次性读出对应M个分段的数据并载入SIMD寄存器进行运算。
单独一组SIMD指令执行蝶形运算的具体结构如图8所示。图中Gamma_0[k]和Gamma_1[k]表示存储M个分段的路径度量值的存储单元。SIMD处理器从内存中读取路径度量值以及Beta[k+1][s1]和Beta[k+1][s2]并加载到SIMD寄存器,然后执行四条SIMD加法指令和两条SIMD求最大值指令,并将结果存储到内存空间的Beta[k][s3]和Beta[k][s4]。SIMD指令执行蝶形运算的一种伪代码实施例如下:
(1)LOAD xmm0,Beta[k+1][s1] ;将Beta[k+1][s1]载入SIMD寄存器xmm0
(2)LOAD xmm1,Beta[k+1][s2] ;将Beta[k+1][s2]载入SIMD寄存器xmm1
(3)LOAD xmm2,Gamma_1[k] ;将Gamma_1[k]载入SIMD寄存器xmm2
(4)LOAD xmm3,Gamma_0[k] ;将Gamma_0[k]载入SIMD寄存器xmm3
(5)VECADD xmm0,xmm2 ;SIMD加法,并行执行P组加法
(6)VECADD xmm1,xmm3 ;SIMD加法,并行执行P组加法
(7)VECMAX xmm0,xmm1 ;SIMD求最大值,并行执行P组两个数求最大值
(8)STORE Beta[k][s3],xmm0 ;将最大值存储到内存中的Beta[k][s3]
(9)LOAD xmm0,Beta[k+1][s1] ;将Beta[k+1][s1]载入SIMD寄存器xmm0
(10)LOAD xmm1,Beta[k+1][s2] ;将Beta[k+1][s2]载入SIMD寄存器xmm1
(11)VECADD xmm0,xmm3 ;SIMD加法,并行执行P组加法
(12)VECADD xmm1,xmm2 ;SIMD加法,并行执行P组加法
(13)VECMAX xmm0,xmm1 ;SIMD求最大值,并行执行P组两个数求最大值
(14)STORE Beta[k][s4] ,xmm0;将最大值存储到内存中的Beta[k][s4]
以上伪代码中LOAD指令执行将内存空间中P个连续的存储单元中的内容加载到SIMD寄存器的操作;STORE指令执行将SIMD寄存器中的内容存储到内存空间中P个连续的存储单元中的操作;VECADD指令并行执行P组加法操作;VECMAX指令并行执行P组求两个数中最大值的操作。
图7a中的防溢出控制目的在于保证随着递推过程的进行,每个时刻对应8个状态的beta度量值不会超出存储这些度量值使用的数据类型所支持的数值范围,比如采用8比特有符号整数的数据类型存储度量值,则数值范围为-128~127。一种防止溢出的方式是对每次递推计算出时刻k的8个beta度量值后,求出这8个值的最大值,并将8个度量值分别减去这个最大值。具体实现时,使用SIMD指令对M个分段并行执行该防溢出控制操作,一种伪代码实施例如下:
(1)LOAD xmm0,Beta[k][0] ;将Beta[k][0]载入SIMD寄存器xmm0
(2)LOAD xmm1,Beta[k][1] ;将Beta[k][1]载入SIMD寄存器xmm1
(3)VECMAX xmm0,xmm1 ;求Beta[k][0]和Beta[k][1]的最大值
(4)LOAD xmm1,Beta[k][2] ;将Beta[k][2]载入SIMD寄存器xmm1
(5)LOAD xmm2,Beta[k][3] ;将Beta[k][3]载入SIMD寄存器xmm2
(6)VECMAX xmm1,xmm2 ;求Beta[k][2]和Beta[k][3]的最大值
(7)LOAD xmm2,Beta[k][4] ;将Beta[k][4]载入SIMD寄存器xmm2
(8)LOAD xmm3,Beta[k][5] ;将Beta[k][5]载入SIMD寄存器xmm3
(9)VECMAX xmm2,xmm3 ;求Beta[k][4]和Beta[k][5]的最大值
(10)LOAD xmm3,Beta[k][6] ;将Beta[k][6]载入SIMD寄存器xmm3
(11)LOAD xmm4,Beta[k][7];将Beta[k][7]载入SIMD寄存器xmm4
(12)VECMAX xmm3,xmm4 ;求Beta[k][6]和Beta[k][7]的最大值
(13)VECMAX xmm0,xmm1
(14)VECMAX xmm2,xmm3
(15)VECMAX xmm0,xmm2 ;M个分段、每分段8个beta度量值的最大值存储在SIMD寄存器xmm0中
(16)LOAD xmm1,Beta[k][0];Beta[k][0]减去最大值
(17)VECSUB xmm1,xmm0
(18)STORE Beta[k][0],xmm1
(19)LOAD xmm1,Beta[k][1];Beta[k][1]减去最大值
(20)VECSUB xmm1,xmm0
(21)STORE Beta[k][1],xmm1
(22)......
(23)LOAD xmm1,Beta[k][7];Beta[k][7]减去最大值
(24)VECSUB xmm1,xmm0
(25)STORE Beta[k][7],xmm1
以上伪代码中,VECSUB指令并行执行P组减法操作,其他指令含义与上文所述相同。
由于步骤501的目的是计算Beta[0][s](s=0,1,...,7),因此执行过程中间的Beta[k][s](k>0)的值不必要都存储下来,以节省内存空间的占用。
步骤501执行完成后,得到了Beta[0][s](s=0,1,...,7),其中前M个值为M个分段在第(i-1)*L1(i=1,2,...,M)时刻的beta度量值β0(s),..., s=0,1,...,7。其中第i个分段的beta度量值 作为第i-1个分段进行步骤502beta递推的正式计算阶段时的初始值。因此需要对β0(s),..., 的存储位置进行重排,将 移动到对应于第i-1个分段的位置,第M个分段的beta度量值的初始值则使用步骤S401中利用尾比特递推得到的值βN(s),具体如图9a所示。该操作可使用SIMD重排或移位指令实现。
步骤S502进行的是M个分段并行的beta递推正式计算阶段,如图6a所示。共包括L1-1次递推,对第i个分段而言,以时刻i*L1作为起始时刻,以时刻(i-1)*L1+1作为结束时刻。起始时刻i*L1的8个状态的beta度量值初始化为步骤501执行结果经过图9a所示重排后的值。每一次递推的具体操作与以上步骤S501所述相同,此处不再赘述。每一次递推 的计算结果Beta[k][s]均需存储在内存空间中,用于后续的步骤S521。
在进行步骤S502时,若第M个分段的数据长度L2小于前M-1段的数据长度L1,则当递推计算得到Beta[L2][s]后,第M段的后向递推才真正开始,因此需要将Beta[L2][s]中对应第M段的beta度量值用βN(s)替代,以使第M个分段的后向递推获得正确的状态初始值。
在进行步骤S502时,需将M个分段分别在时刻(i-1)*L1+Tb(i=1,2,...,M)的8个beta度量值即Beta[Tb][s](s=0,1,...,7)存储下来,以便下一次迭代时作为同一分量码执行步骤501时的初始值。
图5中步骤S511和步骤S512的基本原理相同,每一步递推可用下式表示:
αk+1(sk+1)=max{αk(sk)+γk(sk,sk+1),αk(s′k)+γk(s′k,sk+1)}。(3)
上式中假设时刻k的状态sk和s’k与时刻k+1的状态sk+1在图2所示网格图上存在状态转移关系,αk(sk)表示网格图上时刻k、状态sk的前向递推状态度量值(alpha度量值),γk(sk,sk+1)表示在网格图上从时刻k的状态sk转移到时刻k+1的状态sk+1所对应的路径度量值,该路径度量值有四种取值,分别表示为 计算方法与上述beta递推中路径度量计算方法相同。
步骤S511进行的是M个分段并行的alpha递推训练阶段,如图6b所示。共包括Ta次递推,对第i(i=1,2,...,M)个分段而言,以时刻i*L1-Ta作为起始时刻,以时刻i*L1作为结束时刻。其中Ta为大于等于0且小于等于L1的整数,Ta的具体取值可以由本领域技术人员依据实际测试或研究确定,本发明并不对此加以限定。此处Ta的取值也可与上述步骤S501中Tb的取值不同,本发明并不对此加以限定。起始时刻i*L1-Ta的8个状态的alpha度量值初始化为上一次迭代过程中同一个分量码进行步骤S512所述alpha递推正式计算阶段时,时刻i*L1-Ta的8个状态相应的alpha度量值。因此在进行步骤S512时,需将M个分段分别在时刻i*L1-Ta(i=1,2,...,M)的8个alpha度量值 s=0,1,...,7存储下来,以便下一次迭代时使用。
每一步alpha递推的具体结构与beta递推类似,如图7b所示。包括4组SIMD指令执行的蝶形运算以及alpha度量值的防溢出控制。
每一组SIMD指令执行的蝶形运算并行完成对应M个分段的相邻时刻间的递推运算,其中对应第i个分段为(i-1)*L1+k时刻的2个状态到(i-1)*L1+k+1时刻的2个状态的递推蝶形运算。图中Alpha[k][s]表示内存空间中连续的P个存储单元,其中前M个连续的存储单元存储着对应M个分段的alpha度量值αk(s),..., Gamma_ij[k](i=0,1; j=0,1)表示内存空间中连续的P个存储单元,其中前M个连续的存储单元存储着对应M个分段的路径度量值 Alpha[k][s]和Gamma_ij[k]的存储方式便于SIMD处理器从内存中一次性读出对应M个分段的数据并载入SIMD寄存器进行运算。
单独一组SIMD指令执行蝶形运算的具体结构如图8所示,与beta递推的蝶形运算基本相同。SIMD处理器从内存中读取路径度量值以及Alpha[k][s1]和Alpha[k][s2]并加载到SIMD寄存器,然后执行四条SIMD加法指令和两条SIMD求最大值指令,并将结果存储到内存空间的Alpha[k+1][s3]和Alpha[k+1][s4]。SIMD指令执行蝶形运算的一种伪代码实施例可参考上述beta递推时的伪代码实施例,此处不再赘述。
图7b中的防溢出控制目的与beta递推中的相同,即保证随着递推过程的进行,每个时刻对应8个状态的alpha度量值不会超出存储这些度量值使用的数据类型所支持的数值范围。一种防止溢出的方式是对每次递推计算出时刻k+1的8个alpha度量值后,求出这8个值的最大值,并将8个度量值分别减去这个最大值。具体实现时,使用SIMD指令对M个分段并行执行该防溢出控制操作,一种伪代码实施例可参考上述beta递推时的伪代码实施例,此处不再赘述。
由于步骤511的目的是计算Alpha[L1][s](s=0,1,...,7),因此执行过程中间的Alpha[k][s](k<L1)的值不必要都存储下来,以节省内存空间的占用。
步骤511执行完成后,得到了Alpha[L1][s](s=0,1,...,7),其中前M个值为M个分段在第i*L1(i=1,2,...,M)时刻的alpha度量值 s=0,1,...,7。其中第i个分段的alpha度量值 作为第i+1个分段进行步骤512alpha递推的正式计算阶段时的初始值。因此需要对 的存储位置进行重排,将 移动到对应于第i+1个分段的位置,第1个分段的alpha度量值的初始值直接赋为:α0(0)=0,α0(s)=-∞,s≠0(实际实现时,负无穷值可用一个较大的负数代替),具体如图9b所示。该操作可使用SIMD重排或移位指令实现。
步骤S512进行的是M个分段并行的alpha递推正式计算阶段,如图6b所示。共包括L1-1次递推,对第i个分段而言,以时刻(i-1)*L1作为起始时刻,以时刻i*L1-1作为结束时刻。起始时刻(i-1)*L1的8个状态的alpha度量值初始化为步骤511执行结果经过图9b所示重排后的值。每一次递推的具体操作与以上步骤S511所述相同,此处不再赘述。每一次递推的计算结果Alpha[k][s]均需存储在内存空间中,用于后续的步骤S521。
在进行步骤S512时,需将M个分段分别在时刻i*L1-Ta(i=1,2,...,M)的8个alpha度量值,即Alpha[L1-Ta][s](s=0,1,...,7)存储下来,以便下一次迭代时作为同一分量码执行步 骤511时的初始值。
下面对图5中步骤S521计算并输出系统比特外信息Le进行详细说明。计算系统比特外信息的基本原理如下式所示:
其中(sk,sk+1)∈S0表示在网格图上时刻k的状态sk转移到时刻k+1的状态sk+1的路径所对应的系统比特为0,这样的路径共8条;(sk,sk+1)∈S1表示在网格图上时刻k的状态sk转移到时刻k+1的状态sk+1的路径所对应的系统比特为1,这样的路径也共8条; 表示另一种定义下的从时刻k的状态sk转移到时刻k+1的状态sk+1所对应的路径度量值,该路径度量值有两种取值,对应校验比特的两种取值0和1,分别表示为 计算方法为 j=0,1;上式中的SF是一个预先设定的取值小于1的比例因子,用于对计算出的系统比特外信息进行调整,该比例因子的取值会影响Max-Log-MAP译码算法相对于Log-MAP算法的性能损失,其取值可以由本领域技术人员依据实际测试或研究确定,本发明并不对此加以限定。
步骤S521进行的是M个分段并行的系统比特外信息计算,共需循环计算L1次,每次分别计算出M个分段各自1个系统比特的外信息,其具体运算结构如图10所示。图中Z[k]表示内存空间中连续的P个存储单元,其中前M个连续的存储单元存储着对应M个分段的zk,..., Le[k]表示内存空间中连续的P个存储单元,其中前M个连续的存储单元存储着对应M个分段的 对第k(k=0,1,...,L1-1)次循环,系统将对应的Z[k]、Alpha[k][sk]、Beta[k+1][sk+1]三元组共16组加载到SIMD寄存器并使用SIMD加减法指令按照图10所示的规则进行计算,共24次SIMD加法(VECADD)和8次SIMD减法(VECSUB),得到16个值;然后按照路径对应系统信息比特是0还是1分为两组,分别使用VECMAX指令求出组内8个值的最大值;再使用VECSUB指令将0组的最大值减去1组的最大值;最后使用SIMD乘法指令将以上计算结果乘以SF因子,并将结果存储到Le[k]。在SF值给定的情况下,最后一步SIMD乘法也可使用SIMD移位指令和SIMD加减法指令的组合进行代替或近似。
图5所示的分量码Max-Log-MAP译码过程的基本流程也可有另一种实现方式,其中步骤S512和S521合并,每进行一次alpha递推得到一组Alpha[k][s](s=0,1,...,7)后,则紧接着进行一次Le[k]的计算,这样则只需存储当前时刻的Alpha[k][s],而不必存储所有时 刻的Alpha[k][s],从而节省了存储空间。
下面对图4中的步骤S403和S405进行详细说明。步骤S403的交织过程与步骤S405的解交织过程互为逆过程,因此以下仅对步骤S403进行详细说明。
步骤S403的具体流程如图11所示。具体包括:
步骤S111,矩阵解交织。该步骤是图1中步骤S102重排过程的逆过程,具体为:将长度为P*L1的序列Le1按列顺序写入一个P行L1列的矩阵,即从上至下顺序写满第一列,然后从上至下顺序写满第二列,以此类推直至写满第L1列;然后将矩阵中的数据按行顺序读出,即将第一行数据从左至右顺序读出,然后将第二行数据从左至右顺序读出,以此类推直至第P行。执行该步骤前,序列Le1中对应M个分段中相同位置的数据 存储于相邻的存储单元,执行该步骤后的序列Le1恢复自然顺序,即 其中前N个数据 为有效数据。
步骤S112,使用Turbo码交织表对步骤S111的输出序列中的前N个数据进行交织,得到按自然顺序存储的序列Lp2。
步骤S113,矩阵交织。该步骤是步骤S111的逆过程,也就是与图1中步骤S102重排过程相同。具体为:将长度为P*L1的序列按行顺序写入一个P行L1列的矩阵,即从左至右顺序写满第一行,然后从左至右顺序写满第二行,以此类推直至写满第P行;然后将矩阵中的数据按列顺序读出,即将第一列数据从上至下顺序读出,然后将第二列数据从上至下顺序读出,以此类推直至第L1列。经过执行该步骤,序列Lp2中对应M个分段中相同位置的数据 存储于相邻的存储单元,从而便于SIMD处理器从内存中一次性读取M个分段的数据并加载到SIMD寄存器中。
一种高效地实现步骤S403的方法是,将步骤S111、S112和S113三次交织过程的串行级联等效成一次单独的交织过程,事先计算好交织前与交织后同一元素在内存中存储位置的对应关系,作为一个新的交织表存储在内存中。每次迭代过程中进行步骤S403时调用该交织表完成相应的交织过程。新的等效交织表计算方法具体描述如下:
为了描述方便,假设步骤S111的输入序列记为a0[k],k=0,1,...,P·L1-1,输出序列记为a1[k],k=0,1,...,P·L1-1,步骤S112的输出序列记为a2[k],k=0,1,...,P·L1-1,步骤S113的输出序列记为a3[k],k=0,1,...,P·L1-1。记步骤S112中使用的Turbo码交织表为П0[k],k=0,1,...,N-1,并令П0[k]=k,k=N,N+1,...,P·L1-1,则有如下对应关系: a2[k]=a1[П0[k]]。步骤S113矩阵交织的交织表地址计算公式为П1[j·L1+i]=P·i+j,i=0,...,L1,j=0,...,P-1,则有a1[k]=a0[П1[k]]和a3[П1[k]]=a2[k]。则a3[П1[k]]=a0[П1[П0[k]]]。将新的等效交织表记为П[k],k=0,1,...,P·L1-1,并令a3[k]=a0[П[k]],则有:
П[П1[k]]=П1[П0[k]],k=0,1,...,P·L1-1。
该公式即为新的等效交织表的计算公式。
以上等效方法减少了数据在内存中的搬移次数,从而提高了程序运行效率。
以上所述步骤S112中使用的Turbo码交织表П0[k],k=0,1,...,N-1往往需要复杂的运算来获得,为了减少译码过程耗费的时间,一种高效的方法是事先将对应所有编码长度的交织表计算好存储在内存空间中,并建立编码长度与相应交织表的查找关系,在正式译码时通过编码长度快速查找出相应的交织表以便调出使用。在一些通信标准中,系统支持的编码长度只有有限的若干种(比如LTE支持固定的188种码长),在这种情况下直接将每种编码长度对应的交织表事先计算并存储起来不会占用很多内存空间;在另一些通信标准中,多个编码长度对应的交织表是同一个基本交织表的变形(比如UMTS中多个码长会共用相同的基本矩阵交织表),而这些基本交织表的数目也是很有限的,因此只需存储这些基本交织表即可,也不会占用很多内存空间。
下面对图1中的步骤S104进行详细说明。首先计算系统比特的对数似然值,计算公式为 同样,该计算也是利用SIMD指令对M个分段并行执行的,其中乘2的计算可用SIMD左移操作指令代替;然后对计算出的LLRk进行符号判决,LLRk≥0则判决为比特0,LLRk<0则判决为比特1,同样,该判决过程也是利用SIMD的比较指令并行实现;最后将判决得到的译码比特序列使用与图11中步骤S111相同的方法进行重排,恢复自然顺序后输出其中的前N个比特作为最终的译码结果。
参考图12,根据本发明实施例的软件无线电系统中的高速并行Turbo译码系统包括第一部件210、第二部件220和第三部件230,其中:
第一部件210,用于将待译码数据分为M段并进行重排,使M个分段中对应相同位置的数据连续存储,其中,所述M为正整数;
第二部件220,用于对重排后的待译码数据进行迭代并行译码;
第三部件230,用于迭代译码停止后,将译码结果进行重排,使其恢复自然顺序。
以上第一部件210实现将待译码数据分为M段并进行重排的具体过程与图1中步骤S102执行的操作相同,此处不再赘述。
以上第二部件220对重排后的待译码数据进行迭代并行译码的具体过程与图1中步骤S103执行的操作相同,此处不再赘述。
以上第三部件230实现将译码结果进行重排使其恢复自然顺序的具体过程与图1中步骤S104执行的操作相同,此处不再赘述。
根据本发明实施例的软件无线电系统中的高速并行Turbo译码方法及系统,将待译码数据进行分段并重排,同时采用了一种有效的数据组织方式对译码过程的内部数据在内存中进行存储,从而便于SIMD处理器一次从内存中读取多个分段的数据并加载到SIMD寄存器中,使用SIMD指令实现了对多段数据的并行译码,大大减少了译码时间,提高了译码吞吐率;并通过事先计算好交织表并存储在内存空间中以便正式译码时直接调用的方式,省去了在线计算交织表的时间;并将串行的多次交织过程等效为一个单独的交织过程,减少了数据在内存中的搬移次数。该译码方法具有高的灵活性,实用性强。
在本说明书的描述中,参考术语“一个实施例”、“一些实施例”、“示例”、“具体示例”、或“一些示例”等的描述意指结合该实施例或示例描述的具体特征、结构、材料或者特点包含于本发明的至少一个实施例或示例中。在本说明书中,对上述术语的示意性表述不一定指的是相同的实施例或示例。而且,描述的具体特征、结构、材料或者特点可以在任何的一个或多个实施例或示例中以合适的方式结合。
尽管已经示出和描述了本发明的实施例,本领域的普通技术人员可以理解:在不脱离本发明的原理和宗旨的情况下可以对这些实施例进行多种变化、修改、替换和变型,本发明的范围由权利要求及其等同物限定。