根据博文《卷积译码之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、参数获取:
主要指根据系统递归卷积码(本例中为 ),系统网格图或者状态转移图,得到如下参数:
- log_alpha计算所需:prev_state,prev_input,prev_output;
- log_beta计算所需: next_state,next_input,next_output;
- log_gamma(S1~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))实则为计算 ;
- 计算本次迭代时的
:
在程序实现为:(1-2*Prev_Input(:,1))*LLR(time)/2
输入=0时,Prev_Input=0,结果为:0.5*LLR(time);
输入=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))实则为计算 ;
表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两个表联合推出当前输入的前一输出,从而构成 :
例如当前状态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 |
最终可知,
- 计算log_beta:
- 根据next_state(:,1)计算log_beta(next_state(:,1)):
值得注意的是,next_state(:,1)代表的是当前状态在输入u=0时的下一状态,行号代表了当前状态,所以log_beta(next_state(:,1))实则为计算 ;
- 计算本次迭代时的
:
在程序实现为:(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))实则为计算 ;
表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时更为简单;
最终可知,