BCJR matlab程序算法梳理

根据博文《卷积译码之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}

  • 0
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
BCJR算法(Bahl, Cocke, Jelinek and Raviv Algorithm)是一种用于译码的算法,主要用于分组码的软输出译码。它可以在存在噪声的信道上恢复原始信息。其主要思想是使用前向和后向处理来计算以每个时间点为终点的路径度量值,从而得到最可能的码字。 BCJR算法基于一种动态规划的思想,通过构建一个状态图,将译码问题转化为在状态图上的路径搜索和度量值计算。算法首先进行前向处理,从初始状态开始,对每个时间点的每个状态,计算到达该状态的所有可能路径的度量值,并更新该点的度量值。然后进行后向处理,反向计算每个时间点的每个状态的所有可能路径的度量值,并更新该点的度量值。最后,从初始状态到终止状态,通过比较各路径的度量值,选择最可能的路径,得到译码结果。 在BCJR算法中,路径度量值可以通过对接收到的信号序列和假设的码字进行概率计算获得。如果信道模型已知,可以通过条件概率计算路径度量值。如果信道模型未知,可以通过近似计算或经验方法估计路径度量值。 与硬输出译码相比,BCJR算法具有更好的性能,特别适用于有噪声的信道。它可以提供每个时间点的每个状态的概率信息,从而更准确地估计原始信息。因此,BCJR算法在语音识别、调制识别和信道均衡等领域得到广泛应用。 总之,BCJR算法是一种分组码软输出译码算法,通过动态规划的方法,计算每个时间点的每个状态的所有可能路径的度量值,并选择最可能的路径,从而实现信号的译码和解调。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值