?? va2.m
字號:
function decision = VA2(I_out,Q_out,data_len,sample_number,state_number,state_all,state_in,L,qt,delay)
%維特比算法
%**************************************************************************
%I_out I路
%Q_out Q路
%data_len 碼元個數
%sample_number 采樣個數
%qt
%delay 判決延遲
%**************************************************************************
% delay = 9;
metric_state = zeros(state_number,delay); %記錄權值
survivor_state = zeros(state_number,delay); %記錄幸存路徑
for n = 1:data_len
%**************************************************************************
if n==1
for i = 1:state_number
phase_refe = zeros(1,sample_number);
for k = 1:sample_number
phase_refe(k)=pi*(state_all(i,2)*qt(sample_number+k)+state_all(i,1)*qt(k))+state_all(i,4);
hc1(k)=cos(phase_refe(k));
hs1(k)=sin(phase_refe(k));
end
metric=sum(hc1.*I_out((n-1)*sample_number+1:n*sample_number)+hs1.*Q_out((n-1)*sample_number+1:n*sample_number));
if metric>metric_state(i,n)
metric_state(i,n)=metric;
survivor_state(i,n)=state_in(i,1);
end
end
%**************************************************************************
elseif n==2
for i = 1:state_number
for j=1:2
last_state = state_in(i,j);
last_state = mod(last_state,2^L);
if last_state==0
last_state = 2^L;
end
for k = 1:sample_number
phase_refe(k) = pi*(state_all(i,2)*qt(sample_number+k)+state_all(i,1)*qt(k)+state_all(i,3)*qt(2*sample_number+k))+state_all(i,4);
hc1(k)=cos(phase_refe(k));
hs1(k)=sin(phase_refe(k));
end
metric=sum(hc1.*I_out((n-1)*sample_number+1:n*sample_number)+hs1.*Q_out((n-1)*sample_number+1:n*sample_number));
metric=metric + metric_state(last_state,n-1);
if metric>metric_state(i,n)
metric_state(i,n)=metric;
survivor_state(i,n)=i;
end
end
end
%**************************************************************************
elseif n<delay
for i = 1:state_number
for j=1:2
last_state = state_in(i,j);
for k = 1:sample_number
phase_refe(k) = pi*(state_all(i,2)*qt(sample_number+k)+state_all(i,1)*qt(k)+state_all(i,3)*qt(2*sample_number+k))+state_all(i,4);
hc1(k)=cos(phase_refe(k));
hs1(k)=sin(phase_refe(k));
end
metric=sum(hc1.*I_out((n-1)*sample_number+1:n*sample_number)+hs1.*Q_out((n-1)*sample_number+1:n*sample_number));
metric=metric+metric_state(last_state,n-1);
if metric>metric_state(i,n)
metric_state(i,n)=metric;
survivor_state(i,n)=state_in(i,j);
end
end
end
%**************************************************************************
elseif n==data_len
if data_len~=delay
%隨著數據的送入,刷新metric_state和survivor_state
for i=1:state_number
for t=1:delay-1
metric_state(i,t)=metric_state(i,t+1);
survivor_state(i,t)=survivor_state(i,t+1);
end
end
end
metric_state(:,delay)=zeros(state_number,1);
survivor_state(:,delay)=zeros(state_number,1);
for i = 1:state_number
for j=1:2
last_state = state_in(i,j);
for k = 1:sample_number
phase_refe(k)=pi*(state_all(i,2)*qt(sample_number+k)+state_all(i,3)*qt(2*sample_number+k))+state_all(i,4);;
hc1(k)=cos(phase_refe(k));
hs1(k)=sin(phase_refe(k));
end
metric=sum(hc1.*I_out((n-1)*sample_number+1:n*sample_number)+hs1.*Q_out((n-1)*sample_number+1:n*sample_number));
metric=metric+metric_state(last_state,delay-1);
if metric>metric_state(i,delay)
metric_state(i,delay)=metric;
survivor_state(i,delay)=state_in(i,j);
end
end
end
%**************************************************************************
else
if n>delay
%隨著數據的送入,刷新metric_state和survivor_state
for i=1:state_number
for t=1:delay-1
metric_state(i,t)=metric_state(i,t+1);
survivor_state(i,t)=survivor_state(i,t+1);
end
end
end
metric_state(:,delay)=zeros(state_number,1);
survivor_state(:,delay)=zeros(state_number,1);
for i = 1:state_number
for j=1:2
last_state = state_in(i,j);
for k = 1:sample_number
phase_refe(k) = pi*(state_all(i,2)*qt(sample_number+k)+state_all(i,1)*qt(k)+state_all(i,3)*qt(2*sample_number+k))+state_all(i,4);
hc1(k)=cos(phase_refe(k));
hs1(k)=sin(phase_refe(k));
end
metric=sum(hc1.*I_out((n-1)*sample_number+1:n*sample_number)+hs1.*Q_out((n-1)*sample_number+1:n*sample_number));
metric=metric+metric_state(last_state,delay-1);
if metric>metric_state(i,delay)
metric_state(i,delay)=metric;
survivor_state(i,delay)=state_in(i,j);
end
end
end
end
%**************************************************************************
%--------------------------------------------------------------------------
%回溯
if (n>=delay)&(n<data_len)
[min_value,survivor] = max(metric_state(:,delay));
for t=delay:-1:2
survivor=survivor_state(survivor,t);
end
if n==delay
decision(1) = state_all(survivor,3);
decision(2) = state_all(survivor,2);
else
decision(n-delay+1) = state_all(survivor,2);
end
%**************************************************************************
elseif n==data_len
[min_value,survivor] = max(metric_state(:,delay));
for t=delay:-1:2
decision(n-delay+t) = state_all(survivor,2);
survivor=survivor_state(survivor,t);
end
if data_len==delay
decision(n-delay+1) = state_all(survivor,3);
else
decision(n-delay+1) = state_all(survivor,2);
end
end
%**************************************************************************
end
%**************************************************************************
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -