📄 rx_viterbi_decode.m
字号:
function out_bits = rx_viterbi_decode(rx_bits)
global prev_state;
global prev_state_outbits;
cum_metrics = -1e6*ones(64, 1);%路径度量存储器
cum_metrics (1)=0;
tmp_cum_metrics = zeros(64,1);%路径度量存储器的中间变量矩阵
max_paths = zeros(64, length(rx_bits)/2);%路径存储器
out_bits = zeros(1, length(rx_bits)/2);
for data_bit = 1:2:length(rx_bits)
for state = 1:64
%先前状态是0时的接收序列与发送码字的相关值
path_metric1 = prev_state_outbits(state, 1, 1)*rx_bits(data_bit) + ...
prev_state_outbits(state, 1, 2)*rx_bits(data_bit+1);
%先前状态是1时的接收序列与发送码字的相关值
path_metric2 = prev_state_outbits(state, 2, 1)*rx_bits(data_bit) + ...
prev_state_outbits(state, 2, 2)*rx_bits(data_bit+1);
if cum_metrics(prev_state(state, 1)+1) + path_metric1 > ...
cum_metrics(prev_state(state, 2)+1) + path_metric2 %先前状态是0与1的路径度量值的比较
tmp_cum_metrics(state) = cum_metrics(prev_state(state, 1)+1) + path_metric1;
max_paths(state, (data_bit+1)/2) = 0;
else
tmp_cum_metrics(state) = cum_metrics(prev_state(state, 2)+1) + path_metric2;
max_paths(state, (data_bit+1)/2) = 1;
end
end
for state = 1:64
cum_metrics(state) = tmp_cum_metrics(state);%每级比较结束,将路径度量存储器的中间变量矩阵赋值给路径存储器
end
end
% trace back即回溯
state = 0;
for data_bit = length(rx_bits)/2:-1:1
bit_estimate=rem(state,2);
out_bits(data_bit)=bit_estimate; %维特比解码器的输出
state = prev_state(state+1, max_paths(state+1, data_bit)+1); %上一级的状态
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -