Turbo译码原理说明(一)
Turbo Codes译码是一类具有反馈结构的伪随机译码器,2个码可以交替互不影响的译码,并且还可以通过关于系统码信息位的软判决输出相互传递信息,进行递推式迭代译码。
Turbo Codes译码是一类具有反馈结构的伪随机译码器,2个码可以交替互不影响的译码,并且还可以通过关于系统码信息位的软判决输出相互传递信息,进行递推式迭代译码。Turbo译码结构如图1所示:
1 迭代译码原理介绍
接收端,接收序列经过串并转化之后,得到3个序列:
- 系统信息序列
- 分量编码器1相对应的校验序列
- 分量编码器2相对应的校验序列
若进行编码时对校验比特进行了删余,那么在分离 和 时要对删余的位置以“0”来填充,以此保证 和 以及 有相同的长度。 和 以及 在送入译码器之前要经过信道置信度Lc 的加权,加权后生成的对数似然比信息用表示。
分量译码器1的输入包括:
- 系统信息 ;
- 校验信息 ;
- 先验信息 ,由分量译码器2生成的外部信息 经过解交织生成的;
- ,为 映射交织函数。第一次迭代时,;
分量译码1的输出为,可得到:
(1)
由于 与 和 无关,故可以在交织后作为分量译码器2的先验信息,即 ;
同样地,分量译码器2的输入包括:
- 交织后的系统信息;
- 校验信息 ;
- 先验信息 ;
分量译码2的输出为 ,同样也可得到公式(2)如下所示:
(2)
同样地,将译码器2得到的外部信息经过解交织后,可以再作为分量译码器1的先验信息。通过多次的迭代,使得每个码元都可以得到来自序列中几乎所有码元信息,具体是通过迭代中反复交织反馈、去交织来实现的。这实际上就实现了译码的伪随机化。图2所示是流水线式的迭代结构。
2 Turbo译码算法介绍
Turbo码的译码算法主要分为两大类:一类是基于最大后验概率(Maximum A Posteriori,MAP)软输出算法,这类算法由标准MAP算法演化得来。对标准MAP算法取对数得到Log-MAP算法,对Log-MAP算法中的分支度量进行简化,得到MAX-Log-MAP算法。
另一类是基于Viterbi算法的软输出算法,是对卷积码的译码算法Viterbi的改进,使其满足SISO特性,软信息可以在两个分量译码器之间交换。这种改进的Viterbi算法为软输出Viterbi算法(SOVA)。
2.1 MAP算法介绍
MAP算法是SISO算法的代表,对于二元输入,可以用对数似然比(LLR)作为判决函数:
( 3)
表示k时刻的编码输入信息比特,y 表示接收机的接收序列。MAP会根据计算出来的 的值对 进行判决,判决规则为:
(4)
MAP算法主要是在给定接收序列 y 的情况下,用BCJR算法计算 LLR ,我们将(3)式进一步细化,可将写成:
(5)
是 时刻 l 的编码器状态,u+ 是状态对(s',s)的集合,对应事件 所发生的状态转移, ; u- 是状态对(s',s)的集合,对应事件 所发生的状态转移;
根据公式(5)可知,算法的关键是计算 ,然后在分子和分母中对所有合适的转移求和。以下我们先给出一些引理,方便我们进行计算推导:
首先定义:
引理1:前向度量计算
运用贝叶斯(Bayes)准则和全概率准则:
(6)
引理2:后向度量计算
(7)
引理3:分支度量计算
这里对应事件,如果 s不是从 s' 出发到达的有效状态,则
从而推出: ; 若 为有效状态,
(8)
由以上3个引理,可以最终推导出
(9)
至此,MAP算法推导过程完成。算法具体实现步骤可参见:
卷积译码之BCJR算法详细介绍https://blog.csdn.net/snowman898/article/details/123421074?spm=1001.2014.3001.5502
3 举例说明
以下所示的(2,1,1)SRCC码(Systematic Recursive Convolutional Code)作为分量码的PCCC码,SRCC码生成矩阵为,编码器框图如下图所示:
图3 SRCC码(2,1,1)编码框图
考虑序列输入长度为4,包含一个收尾比特,使用2*2分组(行-列)交织器,产生码率R=1/4的(12,3)PCCC码(注意,收尾比特不算信息比特)。译码网格如图4所示:
图4 SRCC码(2,1,1)译码网格图
假设输入向量 ,交织后输入分组为,第一个分量码的校验向量为, 第二个分量码的校验向量为;
我们可以把传输的12个比特排列成一个矩阵,如下表1-1所示。其中,输入向量 u 决定了前两行中的校验向量 , 交织后的输入向量 u' 决定了前两列中的校验向量 。假定信道信噪比为Eb/N0=0.25(-6.02dB),对应于接收向量 ,接收到的信道L值为:
(10)
第一次行译码 后的外部L值 | 第一次列译码 后的外部L值 | 第一次行和列译码 后的软输出L值 | |||
-0.32 | -0.38 | -0.88 | -0.69 | -0.40 | -0.07 |
+0.77 | +0.47 | +0.23 | -0.04 | -0.80 | +2.03 |
第二次行译码 后的外部L值 | 第二次列译码 后的外部L值 | 第二次行和列译码 后的软输出L值 | |||
-0.01 | -0.01 | -0.98 | -0.81 | -0.19 | +0.18 |
+0.43 | +0.77 | +0.07 | -0.21 | -1.30 | +2.16 |
第一次行译码 后的近似外部L值 | 第一次列译码 后的近似外部L值 | 第一次行和列译码 后的近似软输出L值 | |||
-0.9 | -0.9 | -0.8 | -0.8 | -0.9 | -0.7 |
+1.4 | -0.3 | +1.1 | +0.1 | +0.7 | +1.4 |
第二次行译码 后的近似外部L值 | 第二次列译码 后的近似外部L值 | 第二次行和列译码 后的近似软输出L值 | |||
-0.1 | -0.1 | -0.9 | -0.7 | -0.2 | +0.2 |
+0.6 | +0.5 | +0.3 | -0.5 | -0.9 | +1.6 |
p.s.:本案例较长,后续系列文章详细介绍。
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)