Turbo 译码浅析
本文章和系列视频,将讲解 Turbo 码的基本入门。
需要的预备知识主要是知道卷积码的基本编码过程,知道卷积码的 BCJR 译码算法。
Turbo 码是由多个卷积码并联而成的, Turbo 名字的由来,是从译码的角度来看的。因此,严格来说,应该称为并联卷积码的 Turbo 译码算法更合适。
注:也有串联的卷积码构成 Turbo 码,也有由多个不同的卷积码并联/串联成的 Turbo 码,本文主要讲解由多个相同的卷积码并联构成的 Turbo 码。而且,为了叙述方便和公式的简洁,我们以下面的卷积码为例子进行讨论。

如果单独看每一个卷积码,我们可以用 BCJR 译码算法来译码,假如我们先用上面那一个卷积码,做 BCJR 译码,则根据之前的文章和视频讲解,我们知道对每个发送比特的后验概率,可以用如下公式计算:
其中:
以及:
那么,我们可以很自然地想到,是否可以利用上面卷积码得到的后验概率信息,来增强对第二个卷积码做概率计算的可靠性?反过来,等第二个卷积码的后验概率计算出来后,是否又可以用来增强对第一个卷积码做概率计算的可靠性?如此往复迭代,就构成了类似涡轮增压的工作机制,因此,得名 Turbo 译码。
现在,我们来分析,从另外一个卷积码的译码结果中,拿什么样的概率信息给当前这个卷积码的译码使用。
最直观的,最容易理解的,就是把第一个卷积码的后验概率当成对发送比特的概率,代入到第二个卷积码中用到比特概率的地方。
如果令另外一个卷积码中公式 (2) 里的先验概率 等于上一个卷积码中的后验概率,即:
我们来分析一下这样做会有什么问题。从上面的公式,我们在计算 这个概率时,用到了先验概率,我们把
这个概率公式再展开分析一下,从公式 (2) 继续分析。因为我们用到的卷积码是系统码,即编码的 bit 会在编码后的码流中原封不动地保存,那么:
由于用的是系统码,所以 对应的就是
,所以,公式 (5) 可以写成:
把 (6) 代入 (1) 则:
我们把公式 (7) 中最后三项,分别记为:
如果把第一个卷积码计算出来的后验概率,代入到第二个卷积码的先验概率,则有:
可以看到,上面有两个 ,而且代入后,还有
,这样会导致 “重复计算” 的感觉,参考书中好像是说不要这样,而是用公式 (7) 中 求和的部分,作为第一个卷积码因为编码而得到的概率信息,给第二个卷积码使用,即传递:
所以, Turbo 译码的大致流程为:
1) 对第一个卷积码,计算 概率
2) 利用公式 (9),计算
3) 把 当成
,传递给第二个卷积码
4) 对第二个卷积码,计算 概率
5) 利用公式 (9) (稍微变化一点),计算
6) 把 当成
,传递回第一个卷积码,转到步骤 1 继续,直到结束.

详细的算法描述如下:
表示第几个卷积码
表示第几次迭代
,表示第
次迭代中,第
个卷积码计算出来的要传递的外信息。
表示第
次迭代中,第
个卷积码用到的 先验概率
M 最大迭代次数
-----------------------------算法------begin
初始化: 令 (用初始先验概率输入给第一个卷积码,一般是等概率分布的)
迭代: 按照迭代次数循环
1. 用 作为先验概率
输入给第一个卷积码,计算
* 所有的
* 计算
2. 令
3. 用 作为先验概率
,计算
* 所有的
4. 如果不是最后一次迭代
* 计算
* 令
5. 否则,如果是最后一次迭代
* 用 作为先验概率
,计算
* 解交织
-----------------------------算法------end
我们以一个具体的例子来看译码的过程.

首先,做初始化,我们有的先验概率,是 0/1 比特的取值是等概率的,所以:
对于时刻 0 到时刻 9,我们用公式 (6) 计算出来 概率:
计算出所有的
初始化 0 时刻的
1 时刻的
依次类推,最后计算 9 时刻的
再计算 概率,计算时刻 10 到时刻 1 的:
初始化时刻 10 的 :
计算 9 时刻的
以此类推,计算 1 时刻的
至此,我们可以计算 extrinsic probability 外信息:
我们把下一个卷积码要用的先验概率用前面的外信息赋值:用同样的步骤计算
, 然后计算出
外信息,把这个外信息作为下一轮的第一个卷积码的先验概率来使用,继续上面的过程。