📄 soft_viterbi_siso_20.m
字号:
function dec_data = soft_viterbi_siso_20(input_data, Mode)
%----------------------------------------------------------------------
% Viterbi Decoder (Soft Decision)
%
% Mode Data_rate Coding_rate BPSC CBPS DBPS
% 1 13(Mbps) 1/2 2 104 52
% 2 19.5 3/4 2 104 78
% 3 26 1/2 4 208 104
% 4 39 3/4 4 208 156
% 6 58.5 3/4 6 312 234
% 7 65 5/6 6 312 260
%
% ex. coded_data = soft_viterbi_siso_20(input_data, Mode)
%----------------------------------------------------------------------
%enzan=0;
%enzan = enzan+1;
if Mode == 1
DBPS = 52;
temp_data = input_data;
elseif Mode == 2
DBPS = 78;
for l = 1:26
temp_data((l-1)*6+1) = input_data((l-1)*4+1);
temp_data((l-1)*6+2) = input_data((l-1)*4+2);
temp_data((l-1)*6+3) = input_data((l-1)*4+3);
temp_data((l-1)*6+4) = 0;
temp_data((l-1)*6+5) = 0;
temp_data((l-1)*6+6) = input_data((l-1)*4+4);
end
elseif Mode == 3
DBPS = 104;
temp_data = input_data;
elseif Mode == 4
DBPS = 156;
for l = 1:52
temp_data((l-1)*6+1) = input_data((l-1)*4+1);
temp_data((l-1)*6+2) = input_data((l-1)*4+2);
temp_data((l-1)*6+3) = input_data((l-1)*4+3);
temp_data((l-1)*6+4) = 0;
temp_data((l-1)*6+5) = 0;
temp_data((l-1)*6+6) = input_data((l-1)*4+4);
end
elseif Mode == 6
DBPS = 234;
for l = 1:78
temp_data((l-1)*6+1) = input_data((l-1)*4+1);
temp_data((l-1)*6+2) = input_data((l-1)*4+2);
temp_data((l-1)*6+3) = input_data((l-1)*4+3);
temp_data((l-1)*6+4) = 0;
temp_data((l-1)*6+5) = 0;
temp_data((l-1)*6+6) = input_data((l-1)*4+4);
end
elseif Mode == 7
DBPS = 260;
for l = 1:52
temp_data((l-1)*10+1) = input_data((l-1)*6+1);
temp_data((l-1)*10+2) = input_data((l-1)*6+2);
temp_data((l-1)*10+3) = input_data((l-1)*6+3);
temp_data((l-1)*10+4) = 0;
temp_data((l-1)*10+5) = 0;
temp_data((l-1)*10+6) = input_data((l-1)*6+4);
temp_data((l-1)*10+7) = input_data((l-1)*6+5);
temp_data((l-1)*10+8) = 0;
temp_data((l-1)*10+9) = 0;
temp_data((l-1)*10+10) = input_data((l-1)*6+6);
end
end
%----------------------------------------------------------------------
% 婎弨抣偺惗惉
%----------------------------------------------------------------------
%0乣b傑偱偺2恑悢昞尰傪弌椡
for l=1:64
temp0 = dec2bin(l-1, 6); %惍悢10恑悢仺暥帤楍2恑悢
for m=1:6
bin(l, m)=str2num(temp0(m)); %暥帤楍2恑悢仺悢抣攝楍
end
end
%婎弨抣偺弌椡
J=1;
for l=1:64
temp1=[0, bin(l,:)];
for m=1:7
temp(m) = temp1(8-m);
end
bc(J,1)=xor(temp(1), xor(temp(2), xor(temp(4), xor(temp(5), temp(7)))));
bc(J,2)=xor(temp(1), xor(temp(4), xor(temp(5), xor(temp(6), temp(7)))));
J=J+1;
end
for l=1:64
temp1=[1, bin(l,:)];
for m=1:7
temp(m) = temp1(8-m);
end
bc(J,1)=xor(temp(1), xor(temp(2), xor(temp(4), xor(temp(5), temp(7)))));
bc(J,2)=xor(temp(1), xor(temp(4), xor(temp(5), xor(temp(6), temp(7)))));
J=J+1;
end
%--------------------------------------------------------
% Viterbi暅崋
%--------------------------------------------------------
PM_mem = zeros(64,2);
pm_set1 = 1;
pm_set2 = 2;
for I=1:DBPS
J=1;
L=1;
if (Mode == 2 || Mode == 4 || Mode == 6) && rem(I+1, 3) == 0
for H=1:64
if (bc(J,1) == 0 && temp_data((I-1)*2+1) < 0) || (bc(J,1) == 1 && temp_data((I-1)*2+1) >= 0)
bm1 = abs(temp_data((I-1)*2+1));
else
bm1 = -abs(temp_data((I-1)*2+1));
end
if (bc(J+1,1) == 0 && temp_data((I-1)*2+1) < 0) || (bc(J+1,1) == 1 && temp_data((I-1)*2+1) >= 0)
bm2 = abs(temp_data((I-1)*2+1));
else
bm2 = -abs(temp_data((I-1)*2+1));
end
if PM_mem(L, pm_set1) + bm1 >= PM_mem(L+1, pm_set1) + bm2
SV_mem(H, I) = 0;
PM_mem(H, pm_set2) = PM_mem(L, pm_set1) + bm1;
else
SV_mem(H, I) = 1;
PM_mem(H, pm_set2) = PM_mem(L+1, pm_set1) + bm2;
end
J=J+2;
L=L+2;
if L == 65
L=1;
end
end
elseif (Mode == 2 || Mode == 4 || Mode == 6) && rem(I, 3) == 0
for H=1:64
if (bc(J,2) == 0 && temp_data((I-1)*2+2) < 0) || (bc(J,2) == 1 && temp_data((I-1)*2+2) >= 0)
bm1 = abs(temp_data((I-1)*2+2));
else
bm1 = -abs(temp_data((I-1)*2+2));
end
if (bc(J+1,2) == 0 && temp_data((I-1)*2+2) < 0) || (bc(J+1,2) == 1 && temp_data((I-1)*2+2) >= 0)
bm2 = abs(temp_data((I-1)*2+2));
else
bm2 = -abs(temp_data((I-1)*2+2));
end
if PM_mem(L, pm_set1) + bm1 >= PM_mem(L+1, pm_set1) + bm2
SV_mem(H, I) = 0;
PM_mem(H, pm_set2) = PM_mem(L, pm_set1) + bm1;
else
SV_mem(H, I) = 1;
PM_mem(H, pm_set2) = PM_mem(L+1, pm_set1) + bm2;
end
J=J+2;
L=L+2;
if L == 65
L=1;
end
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
elseif Mode == 7 && (rem(I+3, 5) == 0 || rem(I+1, 5) == 0)
for H=1:64
if (bc(J,1) == 0 && temp_data((I-1)*2+1) < 0) || (bc(J,1) == 1 && temp_data((I-1)*2+1) >= 0)
bm1 = abs(temp_data((I-1)*2+1));
else
bm1 = -abs(temp_data((I-1)*2+1));
end
if (bc(J+1,1) == 0 && temp_data((I-1)*2+1) < 0) || (bc(J+1,1) == 1 && temp_data((I-1)*2+1) >= 0)
bm2 = abs(temp_data((I-1)*2+1));
else
bm2 = -abs(temp_data((I-1)*2+1));
end
if PM_mem(L, pm_set1) + bm1 >= PM_mem(L+1, pm_set1) + bm2
SV_mem(H, I) = 0;
PM_mem(H, pm_set2) = PM_mem(L, pm_set1) + bm1;
else
SV_mem(H, I) = 1;
PM_mem(H, pm_set2) = PM_mem(L+1, pm_set1) + bm2;
end
J=J+2;
L=L+2;
if L == 65
L=1;
end
end
elseif Mode == 7 && (rem(I+2, 5) ==0 || rem(I, 5) == 0)
for H=1:64
if (bc(J,2) == 0 && temp_data((I-1)*2+2) < 0) || (bc(J,2) == 1 && temp_data((I-1)*2+2) >= 0)
bm1 = abs(temp_data((I-1)*2+2));
else
bm1 = -abs(temp_data((I-1)*2+2));
end
if (bc(J+1,2) == 0 && temp_data((I-1)*2+2) < 0) || (bc(J+1,2) == 1 && temp_data((I-1)*2+2) >= 0)
bm2 = abs(temp_data((I-1)*2+2));
else
bm2 = -abs(temp_data((I-1)*2+2));
end
if PM_mem(L, pm_set1) + bm1 >= PM_mem(L+1, pm_set1) + bm2
SV_mem(H, I) = 0;
PM_mem(H, pm_set2) = PM_mem(L, pm_set1) + bm1;
else
SV_mem(H, I) = 1;
PM_mem(H, pm_set2) = PM_mem(L+1, pm_set1) + bm2;
end
J=J+2;
L=L+2;
if L == 65
L=1;
end
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
else
for H=1:64
if (bc(J,1) == 0 && temp_data((I-1)*2+1) < 0) || (bc(J,1) == 1 && temp_data((I-1)*2+1) >= 0)
bm1 = abs(temp_data((I-1)*2+1));
else
bm1 = -abs(temp_data((I-1)*2+1));
end
if (bc(J,2) == 0 && temp_data((I-1)*2+2) < 0) || (bc(J,2) == 1 && temp_data((I-1)*2+2) >= 0)
bm1 = bm1 + abs(temp_data((I-1)*2+2));
else
bm1 = bm1 - abs(temp_data((I-1)*2+2));
end
if (bc(J+1,1) == 0 && temp_data((I-1)*2+1) < 0) || (bc(J+1,1) == 1 && temp_data((I-1)*2+1) >= 0)
bm2 = abs(temp_data((I-1)*2+1));
else
bm2 = -abs(temp_data((I-1)*2+1));
end
if (bc(J+1,2) == 0 && temp_data((I-1)*2+2) < 0) || (bc(J+1,2) == 1 && temp_data((I-1)*2+2) >= 0)
bm2 = bm2 + abs(temp_data((I-1)*2+2));
else
bm2 = bm2 - abs(temp_data((I-1)*2+2));
end
if PM_mem(L, pm_set1) + bm1 >= PM_mem(L+1, pm_set1) + bm2
SV_mem(H, I) = 0;
PM_mem(H, pm_set2) = PM_mem(L, pm_set1) + bm1;
else
SV_mem(H, I) = 1;
PM_mem(H, pm_set2) = PM_mem(L+1, pm_set1) + bm2;
end
J=J+2;
L=L+2;
if L == 65
L=1;
end
end
end
if pm_set1 == 1
pm_set1 = 2;
pm_set2 = 1;
else
pm_set1 = 1;
pm_set2 = 2;
end
end
%Trace Back
add=1;
for number=DBPS:-1:1
pdec_data(number)=SV_mem(add, number);
if add<=32
if SV_mem(add, number)==0
add=(add*2)-1;
elseif SV_mem(add, number)==1
add=add*2;
end
elseif add>=33
if SV_mem(add, number)==0
add=((add-32)*2)-1;
elseif SV_mem(add, number)==1
add=(add-32)*2;
end
end
end
pdec_data=[pdec_data,0,0,0,0,0,0];
for I=7:DBPS+6
dec_data(I-6) = pdec_data(I);
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -