📄 mlsd.m
字号:
function [demod_sym] = mlsd(rcv_sig, info_sym_num, tail_sym_num, output, state_trans, stat_trans_input, stat_trans_output)
% sqwang's source code, used for academic research, not commerce.
stat_trans_output = stat_trans_output + 1; % Add 1 for matlab index convenience
state_trans = state_trans + 1;
output = output + 1;
sym_num = info_sym_num + tail_sym_num;
demod_sym = zeros(sym_num, 1);
[state_num, input_num] = size(output);
% For simplicity and debuging, program saves total survivor metric at every symbol.
acc_metric = zeros(state_num, sym_num + 1);
acc_metric(1, 1) = 100; % Init acc_metric according to initial state
% Survivor path saving
survivor_path = zeros(state_num, sym_num);
t = 0 : 7;
branch_metric = zeros(state_num, input_num); % Branch metric state_num * input_num
for k = 1 : sym_num
corr_metric = rcv_sig(k) * exp(-j * pi/4 * t);
% branch metric calculation.
for i = 1 : state_num
for l = 1 : input_num
branch_metric(i, l) = real(corr_metric(output(i, l)));
end
end
% Path metric accumulation, compartion and maximum metric selection&saving
[acc_metric(:, k + 1), sur_path_index] = metric_acc_cmp_sel(acc_metric(:, k), branch_metric, state_trans, stat_trans_input);
% Survivor state path saving
for n = 1 : state_num
survivor_path(n, k) = state_trans(n, sur_path_index(n));
end
end
index = 1;
% Traceback for decoding
for i = sym_num : -1 : 1
demod_sym(i) = stat_trans_input(index, find(state_trans(index, :) == survivor_path(index, i)));
index = survivor_path(index, i);
end
demod_sym(end - tail_sym_num + 1 : end) = [];
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -