Turbo Codes译码是一类具有反馈结构的伪随机译码器,2个码可以交替互不影响的译码,并且还可以通过关于系统码信息位的软判决输出相互传递信息,进行递推式迭代译码。Turbo译码结构如图1所示: 

 1   迭代译码原理介绍

   接收端,接收序列经过串并转化之后,得到3个序列:

  • 系统信息序列Y^S=(y_1^S,y_2^S,\cdots ,y_N^S)
  • 分量编码器1相对应的校验序列Y^{1p}=(y_1^{1p},\, y_2^{1p},\cdots ,y_N^{1p})
  • 分量编码器2相对应的校验序列Y^{2p}=(y_1^{2p},\, y_2^{2p},\cdots ,y_N^{2p})

    若进行编码时对校验比特进行了删余,那么在分离 Y^{1p}和 Y^{2p} 时要对删余的位置以“0”来填充,以此保证 Y^{1p} 和 Y^{2p}以及 Y^S有相同的长度。 Y^{1p} 和 Y^{2p}以及 Y^S在送入译码器之前要经过信道置信度Lc 的加权,加权后生成的对数似然比信息用\Lambda _k(c^{1p};I),\, \Lambda _k(c^{2p};I),\, \Lambda _k(c^{s};I)表示。   

   分量译码器1的输入包括:

  • 系统信息  \Lambda _k(c^{s};I)
  • 校验信息  \Lambda _k(c^{1p};I);
  • 先验信息  \Lambda _{1a}(u_k),由分量译码器2生成的外部信息\Lambda _{2e}(u_k) 经过解交织生成的;
  • \Lambda _{1a}(u_{I(k)})=\Lambda _{2e}(u_{k}),为I(k) 映射交织函数。第一次迭代时,\Lambda _{1a}(u_{k})=\Lambda _{2e}(u_{k})=0

   分量译码1的输出为\Lambda _{1k}(u;O),可得到:

                             \Lambda _{1e}(u_k)=\Lambda _{1k}(u;O)-\Lambda _{k}(c^s;I)-\Lambda _{1a}(u_k)                          (1)

    由于 \Lambda _{1e}(u_k) 与 \Lambda _{k}(c^s;I) 和 \Lambda _{1a}(u_k)无关,故可以在交织后作为分量译码器2的先验信息\Lambda_{2a}(u_k),即  \Lambda_{1e}(u_{I(k)})=\Lambda_{2a}(u_k);

    同样地,分量译码器2的输入包括:

  • 交织后的系统信息\Lambda_{I(k)}(c^s;I)
  • 校验信息 \Lambda _k(c^{2p};I) ;
  • 先验信息 \Lambda _{2a}(u_k)

   分量译码2的输出为 \Lambda _{2I(k)}(u;O),同样也可得到公式(2)如下所示:

                          \Lambda_{2e}(u_k) =\Lambda_{2I(k)}(u;O)\, -\, \Lambda_{I(k)}(c^s;I)\, -\, \Lambda_{2a}(u_k)                 (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)作为判决函数:

                               L (u_k)=log\left ( \frac{p(u_l=1|y)}{p(u_l=0|y)} \right )                                                          ( 3)

    u_k 表示k时刻的编码输入信息比特,y 表示接收机的接收序列。MAP会根据计算出来的L (u_k) 的值对 \hat{u_k}  进行判决,判决规则为:

                                 \hat{u_l=\left\{\begin{matrix}1,\; \; L (u_l)\geqslant 0 \\0,\; \; L (u_l)<0 \end{matrix}\right.                                                                   (4)

       MAP算法主要是在给定接收序列 y 的情况下,用BCJR算法计算 LLR L (u_k) ,我们将(3)式进一步细化,可将L (u_k)写成:

                                  L(u_{l})=log \frac{\sum_{u^+}^{}P(s_{l-1}=s', s_l=s,y)}{\sum_{u^-}^{}P(s_{l-1}=s', s_l=s, y)}                                   (5)

      \large s_l 是 时刻 l 的编码器状态,u+ 是状态对(s',s)的集合,对应事件 u_l=+1 所发生的状态转移,(s_{l}=s')\rightarrow (s_{l+1}=s) ; u- 是状态对(s',s)的集合,对应事件 u_l=-1 所发生的状态转移;

      根据公式(5)可知,算法的关键是计算 p(s',\: s,\: y)=p(s_l=s',\, s_{l+1}=s,y),然后在分子和分母中对所有合适的转移求和。以下我们先给出一些引理,方便我们进行计算推导:

首先定义:                          \alpha _l(s)\doteq p(s_l\, =\, s,y_1^l)

                                            \gamma _l(s',s)\doteq p(s_l=s,y_l \, |\, s_{l-1} \, =\, s' )

                                            \beta _l(s') \doteq p(y_{l+1}^L\, | \, s_l=s)

引理1:前向度量计算

    运用贝叶斯(Bayes)准则和全概率准则:

                     \alpha _{l}(s)= p(s,y_1^{l})= \sum_{s'}^{} p(s',s,y_1^{l})

                               =\sum_{s'}^{} p(s,y_{l}\, |\, s',y_1^{l-1})p(s'\, ,\, y_1^{l-1})

                               =\sum_{s'}^{} p(s,y_{l}\, |\, s')p(s'\, ,\, y_1^{l-1})

                               =\sum_{s'}^{} \gamma _l(s'\, ,\, s)\alpha _{l-1}(s')                                                                  (6)

引理2:后向度量计算

                   \beta _{l-1}(s') \doteq p(y_l^L\, | \, s')=\sum_{s}^{} p(y_l^L,s\, |\, s')

                                 =\sum_{s}^{}p(y_{l+1}^L\, | \, s',s,y_l) p(s,y_l\, |\, s')

                                 =\sum_{s}^{ } p(y_{l+1}^L\, | \, s) \: p(s,y_l\, |\, s')

                                 =\sum_{s}^{ } \beta _l(s)\; \gamma _{l}(s',s)                                                                    (7)

引理3:分支度量计算

                  \gamma _l(s',s)=p(s,y_l\, |\, s')=\frac{p(s',s)}{p(s')}\cdot \frac{p(s',s,y_l)}{p(s',s)}

                               =p(s|s')\,\, p(y_l\, |\, s',s)=p(u_l)\cdot p(y_l\, |\, u_l)

  这里对应事件(s'\rightarrow s),如果 s不是从 s' 出发到达的有效状态,则p(s\, |\, s')=p(s'\rightarrow s)=0

  从而推出:\gamma _l(s',s)=0 ; 若(s'\rightarrow s) 为有效状态,

                 \gamma _l(s',s)= p(u_l)P(y_l\, |\, u_l)=\frac{P(u_l)}{2\pi \sigma ^2}\: exp - {\frac{\left \| y_l - u_l \right \|^2} {2\sigma ^2}                             (8)

 由以上3个引理,可以最终推导出  p(s'\,,s,\, y_{l})

                 p(s',s,y)=p(s',s,y_1^{l-1},\, y_l,\, y_{l+1}^L)

                                  =p(y_{l+1}^L\, |\, s',s,y_1^{l-1},\, y_l)\cdot p(s',s,y_1^{l-1},\, y_l)

                                  =p(y_{l+1}^L\, |\, s',s,y_1^{l-1},\, y_l)\cdot p(s,y_l\, |\, s',y_1^{l-1} )p(s',y_1^{l-1})

                                  =p(y_{l+1}^L\, |\, s)p(s,y_l\, |\, s')p(s',y_1^{l-1})

                                 =\beta _l(s)\gamma _l(s',s)\alpha _{l-1}(s')                                                              (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码生成矩阵为,编码器框图如下图所示:

                                    G(D)=[1\: \: \: \frac{1}{1+D}]

                                                      图3  SRCC码(2,1,1)编码框图

考虑序列输入长度为4,包含一个收尾比特,使用2*2分组(行-列)交织器,产生码率R=1/4的(12,3)PCCC码(注意,收尾比特不算信息比特)。译码网格如图4所示:

图4  SRCC码(2,1,1)译码网格图

假设输入向量 u=[u_0,\, u_1,\,u_2,\,u_3] ,交织后输入分组为u'=[u_0',\, u_1',\,u_2',\,u_3']=[u_0,\, u_2,\,u_1,\,u_3],第一个分量码的校验向量为p^{(1)}=[p_0^{(1)},\, p_1^{(1)},\,p_2^{(1)},\,p_3^{(1)}], 第二个分量码的校验向量为p^{(2)}=[p_0^{(2)},\, p_1^{(2)},\,p_2^{(2)},\,p_3^{(2)}]

我们可以把传输的12个比特排列成一个矩阵,如下表1-1所示。其中,输入向量 u 决定了前两行中的校验向量 p^{(1)}, 交织后的输入向量 u' 决定了前两列中的校验向量  p^{(2)} 。假定信道信噪比为Eb/N0=0.25(-6.02dB),对应于接收向量 r = [r_0^{(0)}\,r_0^{(1)}\,r_0^{(2)} ,\; \; r_1^{(0)}\,r_1^{(1)}\,r_1^{(2)},\; \; r_2^{(0)}\,r_2^{(1)}\,r_2^{(2)}],接收到的信道L值为:

                            L_c\, r_l^{(j)}=4\left ( E_s/N_0 \right )r_l^{(j)}=r_l^{(j)},\; \; \; \; l=0,1,2,3\, \; \: j=0,1,2               (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.:本案例较长,后续系列文章详细介绍。


 

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐