?? siso.asv
字號:
function [OutLa ,OutLe]=SISO(InLi,Ar,Br,Wr,Yr,InVar,N,Sc)
%---[OutLa ,OutLe]=SISO(InLi,Ar,Br,Wr,Yr,in_var,N,Sc)----
%Turbo碼解碼器的核心模塊:軟入軟出解碼器
%采用Max-Log-MAP算法
%-----------輸出--------------
%InLi:輸入的先驗對數似然比信息,3*N維
%Ar,Br:接收到的加入噪聲的信息比特部分,1*N維
%Wr,Yr:接收到的加入噪聲的校驗比特部分,1*N維
%InVar:整個系統噪聲方差
%N:編碼幀長
%Sc:循環狀態,由發端傳過來,因此該程序現在沒有預譯碼部分
%----------輸入-------------
%OutLa:解碼得到的全部似然對數比,3*N維
%OutLe:解碼得到的似然對數比外信息部分,3*N維
%
%對NextStates,行號表示前一狀態,分別對應為0~7,列號表示輸入數據為0 1 2 3
%對PreStates,行號表示當前狀態,分別對應為0~7,列號表示輸入數據為0 1 2 3
trellis=struct('NextStates',[0 7 4 3;4 3 0 7;1 6 5 2;5 2 1 6;...
6 1 2 5;2 5 6 1;7 0 3 4;3 4 7 0],...
'Outputs',[ [-1 -1] [1 1] [1 1] [-1 -1];...
[-1 -1] [1 1] [1 1] [-1 -1];...
[-1 1] [1 -1] [1 -1] [-1 1];...
[-1 1] [1 -1] [1 -1] [-1 1];...
[1 1] [-1 -1] [-1 -1] [1 1];...
[1 1] [-1 -1] [-1 -1] [1 1];...
[1 -1] [-1 1] [-1 1] [1 -1];...
[1 -1] [-1 1] [-1 1] [1 -1] ],...
'PreStates',[0 6 1 7;2 4 3 5;5 3 4 2;7 1 6 0;...
1 7 0 6;3 5 2 4;4 2 5 3;6 0 7 1]);
Lc=2/InVar;
%初始化,初始狀態是Sc
alpha(1,1:8)=-Inf*ones(1,8);
alpha(1,Sc+1)=0;
beta(N,1:8)=-Inf*ones(1,8);
beta(N,Sc+1)=1;
%
AB_0123=[0 1 2 3]; %分別對應于ab='00''01''10''11'四種情況
AB=[[-1 -1] [-1 +1] [+1 -1] [+1 +1]];
for k=1:N %幀長
%輸入AB=0的先驗概率
% P0=1/(1+exp(InLi(1,k))+exp(InLi(2,k))+exp(InLi(3,k)));
%輸入AB=[0 1 2 3]的先驗概率
% P0123=[P0 P0*exp(InLi(1,k)) P0*exp(InLi(2,k)) P0*exp(InLi(3,k))];
%求gama
P0123=[0 InLi(1,k) InLi(2,k) InLi(3,k)];
for i=1:8 %狀態數,對應于m'(S')
out=trellis.Outputs(i,:); %實際要的就是每個狀態S'對應的輸出和下狀態
NextS=trellis.NextStates(i,:); %也就是上面矩陣中的1~8行
gama(k,i,NextS+1)=1/2*Lc*(Ar(k)*AB(1:2:7)+Br(k)*AB(2:2:8)+Wr(k)*out(1:2:7)+Yr(k)*out(2:2:8)).*P0123;
end
%normalize gama
% if max(gama(k,:))~=0
% gama(k,:,:)=gama(k,:,:)/max(gama(k,:));
% end
%alpha(k)
for S=1:8
PreS=trellis.PreStates(S,:);
temp=alpha(k,PreS+1)+gama(k,PreS+1,S);
alpha(k+1,S)=max(temp);
end
end
for k=N:-1:2
% beta(k)
for Sp=1:8 %S'
NextS=trellis.NextStates(Sp,:);
for cnt=1:4
temp(cnt)=gama(k,Sp,NextS(cnt)+1)+beta(k,NextS(cnt)+1);
end
beta(k-1,Sp)=max(temp);
end
end
for k=1:N
for Sp=1:8
NextS=trellis.NextStates(Sp,:);
temp0(Sp)=alpha(k,Sp)+gama(k,Sp,NextS(1)+1)+beta(k,NextS(1)+1); %對應于輸入0
temp1(Sp)=alpha(k,Sp)+gama(k,Sp,NextS(2)+1)+beta(k,NextS(2)+1); %對應于輸入1
temp2(Sp)=alpha(k,Sp)+gama(k,Sp,NextS(3)+1)+beta(k,NextS(3)+1); %對應于輸入2
temp3(Sp)=alpha(k,Sp)+gama(k,Sp,NextS(4)+1)+beta(k,NextS(4)+1); %對應于輸入3
end
%對雙二元Turbo碼,總共有3個后驗對數似然比
OutLa(1,k)=max(temp1)-max(temp0);
OutLa(2,k)=max(temp2)-max(temp0);
OutLa(3,k)=max(temp3)-max(temp0);
end
OutLe(1,:)=OutLa(1,:)-Lc*Br-InLi(1,:);
OutLe(2,:)=OutLa(2,:)-Lc*Ar-InLi(2,:);
OutLe(3,:)=OutLa(3,:)-Lc*Ar-Lc*Br-InLi(3,:);
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -