根据博文《卷积译码之BCJR算法详细介绍》,这篇主要详细解释BCJR matlab仿真算法。

博文链接:卷积译码之BCJR算法详细介绍https://blog.csdn.net/snowman898/article/details/123421074?spm=1001.2014.3001.5502

matlab算法链接:

BCJR matlab算法https://download.csdn.net/download/snowman898/85022570

1、参数获取:

主要指根据系统递归卷积码(本例中为{\color{Blue} [1\: \frac{1+D^{2}}{1+D+D^{2}}]} ),系统网格图或者状态转移图,得到如下参数:

  • log_alpha计算所需:prev_stateprev_inputprev_output
  • log_beta计算所需: next_statenext_inputnext_output
  • log_gammaS1~S4四种状态与输入数据的欧氏距离)

我们以next_state为例,可推导出prev_state:

                    表1  next_state 矩阵表

当前状态

输入u=0

输入u=1

S1(1+1i)

1

3

S2(1-1i)

3

1

S3(-1+1i)

4

2

S4(-1-1i)

2

4

可根据上表,推出当前输入的前一状态:
               

表2  prev_state 矩阵表

当前状态

输入u=0

输入u=1

S1(1+1i)

1

2

S2(1-1i)

4

3

S3(-1+1i)

2

1

S4(-1-1i)

3

4

2、算法执行过程

2.1    计算log_alpha:

  • 根据prev_state(:,1)计算log_alpha(prev_state(:,1))

值得注意的是,prev_state(:,1)代表的是当前状态在输入u=0时的上一状态,行号代表了当前状态,所以log_alpha(prev_state(:,1))实则为计算\alpha _{l}(s')

  • 计算本次迭代时的\frac{u_{l}*L_{a}(u_{l})}{2}

u_{l} 在程序实现为:(1-2*Prev_Input(:,1))*LLR(time)/2

输入u_{l}=0时,Prev_Input=0,结果为:0.5*LLR(time);

 输入u_{l}=1时,Prev_Input=1,结果为:-0.5*LLR(time);

  • 计算log_gamma:

prev_output(:,1)计算log_gamma(prev_output(:,1))

prev_output(:,1)代表的是当前状态下,在输入u=0时倒推出的上一输出,行号代表了当前状态,所以log_gamma(prev_output(:,1))实则为计算\gamma _{l}(s',s)

                 表3  next_output 矩阵表

当前状态

输入u=0

输入u=1

S1(1+1i)

1

4

S2(1-1i)

1

4

S3(-1+1i)

2

3

S4(-1-1i)

2

3

需要根据next_output,prev_state两个表联合推出当前输入的前一输出,从而构成\gamma _{l}(s',s)

 例如当前状态S2,输入u=0,可知prev_state(S2,1)=S4 → next_output(S4,1)=S2;

再例如当前状态S3,输入u=1,可知prev_state(S3,2)=S1,→next_output(S1,2)=S4;

                  表4  prev_output 矩阵表

当前状态

输入u=0

输入u=1

S1(1+1i)

1

4

S2(1-1i)

2

3

S3(-1+1i)

1

4

S4(-1-1i)

2

3

最终可知,\alpha _{l+1}^{*}(s)\equiv ln \alpha _{l+1}(s)= ln \sum_{s'\in \sigma _{l}} \gamma _{l}(s',s)\alpha _{l}(s')= ln \sum_{s'\in \sigma _{l}} e^{[\gamma _{l}^{*}(s',s) +\alpha_{l}^{*}(s')]}

                                = max_{s'\in \sigma _{l}}^{*}[\gamma _{l}^{*}(s',s) + \alpha _{l}^{*}(s')], l=0,1,\cdots K-1

  1. 计算log_beta:
  • 根据next_state(:,1)计算log_beta(next_state(:,1))

值得注意的是,next_state(:,1)代表的是当前状态在输入u=0时的下一状态,行号代表了当前状态,所以log_beta(next_state(:,1))实则为计算\beta _{l+1}(s)

  • 计算本次迭代时的\frac{u_{l}*L_{a}(u_{l})}{2}

u_{l}在程序实现为:(1-2*Next_Input(:,1))*LLR(time)/2

输入Ul=0时,Next_Input=0,结果为:0.5*LLR(time);

输入Ul=0时,Next_Input=1,结果为:-0.5*LLR(time);

  • 计算log_gamma:

Next_state(:,1)计算log_gamma(next_output(:,1))

next_output(:,1)代表的是当前状态下,在输入u=0时推出的下一输出,行号代表了当前状态,所以log_gamma(next_output(:,1))实则为计算\gamma _{l}(s',s)

                 表3  next_output 矩阵表

当前状态

输入u=0

输入u=1

S1(1+1i)

1

4

S2(1-1i)

1

4

S3(-1+1i)

2

3

S4(-1-1i)

2

3

由于行号即代表当前状态,因此不像计算log_alpha时较为复杂,在计算log_beta时更为简单;

最终可知,

\large {\color{Blue} \beta _{l}^{*}(s')\equiv ln \beta _{l}(s')= ln \sum_{s\in \sigma _{l+1}} \gamma _{l}(s',s)\beta _{l+1}(s)}\large {\color{Blue} =ln \sum_{s\in \sigma _{l+1}} e^{[\gamma _{l}^{*}(s',s) +\beta_{l+1}^{*}(s)]}}

             \large {\color{Blue} =max_{s\in \sigma _{l+1}}^{*}[\gamma _{l}^{*}(s',s) + \beta_{l+1}^{*}(s)], l=K-1,K-2,\cdots 0}

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐