?? viterbi.m
字號:
function viterbi_out= viterbi(symbols)
%用于BCM-8PSK的Vterbi譯碼,其中BCM的三個分組內(nèi)碼為(8,1,8)(8,7,2)(8,8,1)
%symbols=[5.2 7.3 0.7 7.2 1.6 2.7 1.2 3.2];
for frame=0:(length(symbols)/8-1)
mmm=frame*8+1;
nnn=frame*8+8;
sym= symbols(mmm:nnn);
%以下為一幀8個符號的譯碼
%--------------------------------------------------------------------------
paths=zeros(4,8); %用于記錄4條路徑的輸出
old_paths=zeros(4,8); %%%%%%%%%%%%%%%%%%%%%%%
cum_metrics = zeros(4, 2); %用于保存累計度量值
for state=1:4 %對于step=1情況
switch state
case 1
[min_metrics,sym_out]=compare(sym(1),0,4);
%分別對各狀態(tài)進入兩條平行求分支度量,小的值放在min_metrics中,對應(yīng)分支的輸出值放sym_out中輸出
case 2
[min_metrics,sym_out]=compare(sym(1),2,6);
case 3
[min_metrics,sym_out]=compare(sym(1),1,5);
case 4
[min_metrics,sym_out]=compare(sym(1),3,7);
end
cum_metrics(state,1)=min_metrics; %對于step=1情況,累積度量值為min_metrics
paths(state,1)=sym_out; %對于step=1情況,保存sym_out1
end
old_paths=paths;%%%%%%%%%%%%%%%%%%%%%%%
for step=2:7 %這里從step=2開始到length(sym)-1=7
for state=1:2 %網(wǎng)格圖分上下兩層,對于上層兩狀態(tài)Ae,Ao,每個狀態(tài)兩組平行共4個分支進入
[min_metrics1,sym_out1]=compare(sym(step),0,4); %第一組平行分支,其輸出分別為0和4,分別計算和輸入符號的距離
temp_metrics1=cum_metrics(state,1)+min_metrics1; %和第一組對應(yīng)的前一狀態(tài)(Ae)的累積度量值相加
[min_metrics2,sym_out2]=compare(sym(step),2,6); %第二組平行分支,其輸出分別為2和6,分別計算和輸入符號的距離
temp_metrics2=cum_metrics((3-state),1)+min_metrics2; %和第二組對應(yīng)的前一狀態(tài)(Ao)的累積度量值相加
if (temp_metrics1<=temp_metrics2) %比較
cum_metrics(state,2)=temp_metrics1; %小的值保存
paths(state,step)=sym_out1; %輸出值保存
else
cum_metrics(state,2)=temp_metrics2;
paths(state,:)=old_paths((3-state),:);
paths(state,step)=sym_out2;
end
end
for state=3:4 %對下層情況處理算法相同
[min_metrics3,sym_out3]=compare(sym(step),1,5);
temp_metrics3=cum_metrics(state,1)+min_metrics3;
[min_metrics4,sym_out4]=compare(sym(step),3,7);
temp_metrics4=cum_metrics((7-state),1)+min_metrics4;
if (temp_metrics3<=temp_metrics4)
cum_metrics(state,2)=temp_metrics3;
paths(state,step)=sym_out3;
else
cum_metrics(state,2)=temp_metrics4;
paths(state,:)=old_paths((7-state),:);%%%%%%%%%%%%%%%%%%%%%%%%這里有錯,如果在上面state=3時最優(yōu)路徑從4狀態(tài)過來,那么
paths(state,step)=sym_out4;
end
end
cum_metrics(:,1)=cum_metrics(:,2);
old_paths=paths;%%%%%%%%%%%%%%%%%%%%%%%
end
for state=1:4
switch state
case 1
[min_metrics,sym_out]=compare(sym(8),0,4); %對于step=1情況
%分別對各狀態(tài)進入兩條平行求分支度量,小的值放在min_metrics中,對應(yīng)分支的輸出值放sym_out中輸出
case 2
[min_metrics,sym_out]=compare(sym(8),2,6);
case 3
[min_metrics,sym_out]=compare(sym(8),1,5);
case 4
[min_metrics,sym_out]=compare(sym(8),3,7);
end
cum_metrics(state,2)=cum_metrics(state,1)+min_metrics; %對于step=1情況,累積度量值為min_metrics
paths(state,8)=sym_out; %對于step=1情況,保存sym_out1
end
min_metrics=1e6;
for state=1:4
if min_metrics>cum_metrics(state,2)
min_metrics=cum_metrics(state,2);
temp_viterbi_out=paths(state,:);
a=state;%%%%%%%%%%
end
end
%--------------------------------------------------------------------------
%以上為一幀8個符號的譯碼
if frame==0
viterbi_out= temp_viterbi_out;
else
viterbi_out=[viterbi_out temp_viterbi_out];
end
end
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -