?? va.m
字號:
function [decision,metric_state,survivor_state] = VA(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 碼元個數(shù)
%sample_number 采樣個數(shù)
%qt
%delay 判決延遲
%**************************************************************************
% delay = 9;
metric_state = zeros(state_number,delay); %記錄權(quán)值
survivor_state = zeros(state_number,delay); %記錄幸存路徑
for i = 1:state_number
phase_refe = pi*(state_all(i,2)*qt(sample_number+1:2*sample_number)+state_all(i,1)*qt(1:sample_number)+state_all(i,3)*qt(2*sample_number+1:3*sample_number));
hc(i,:)=cos(phase_refe);
hs(i,:)=sin(phase_refe);
end
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));
% hc1(k)=cos(phase_refe(k));
% hs1(k)=sin(phase_refe(k));
% end
% Iconvhc=sum(hc1.*I_out((n-1)*sample_number+1:n*sample_number));
% Qconvhs=sum(hs1.*Q_out((n-1)*sample_number+1:n*sample_number));
% Iconvhs=sum(hs1.*I_out((n-1)*sample_number+1:n*sample_number));
% Qconvhc=sum(hc1.*Q_out((n-1)*sample_number+1:n*sample_number));
% metric=(cos(state_all(i,4)).*(Iconvhc+Qconvhs) + sin(state_all(i,4)).*(Qconvhc-Iconvhs));
% 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
Iconvhc=sum(hc(i,:).*I_out((n-1)*sample_number+1:n*sample_number));
Qconvhs=sum(hs(i,:).*Q_out((n-1)*sample_number+1:n*sample_number));
Iconvhs=sum(hs(i,:).*I_out((n-1)*sample_number+1:n*sample_number));
Qconvhc=sum(hc(i,:).*Q_out((n-1)*sample_number+1:n*sample_number));
metric=(cos(state_all(i,4)).*(Iconvhc+Qconvhs) + sin(state_all(i,4)).*(Qconvhc-Iconvhs));
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);
Iconvhc=sum(hc(i,:).*I_out((n-1)*sample_number+1:n*sample_number));
Qconvhs=sum(hs(i,:).*Q_out((n-1)*sample_number+1:n*sample_number));
Iconvhs=sum(hs(i,:).*I_out((n-1)*sample_number+1:n*sample_number));
Qconvhc=sum(hc(i,:).*Q_out((n-1)*sample_number+1:n*sample_number));
metric=(cos(state_all(i,4)).*(Iconvhc+Qconvhs) + sin(state_all(i,4)).*(Qconvhc-Iconvhs));
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
%隨著數(shù)據(jù)的送入,刷新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));
hc2(k)=cos(phase_refe(k));
hs2(k)=sin(phase_refe(k));
end
Iconvhc=sum(hc2.*I_out((n-1)*sample_number+1:n*sample_number));
Qconvhs=sum(hs2.*Q_out((n-1)*sample_number+1:n*sample_number));
Iconvhs=sum(hs2.*I_out((n-1)*sample_number+1:n*sample_number));
Qconvhc=sum(hc2.*Q_out((n-1)*sample_number+1:n*sample_number));
metric=(cos(state_all(i,4)).*(Iconvhc+Qconvhs) + sin(state_all(i,4)).*(Qconvhc-Iconvhs));
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
%隨著數(shù)據(jù)的送入,刷新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);
Iconvhc=sum(hc(i,:).*I_out((n-1)*sample_number+1:n*sample_number));
Qconvhs=sum(hs(i,:).*Q_out((n-1)*sample_number+1:n*sample_number));
Iconvhs=sum(hs(i,:).*I_out((n-1)*sample_number+1:n*sample_number));
Qconvhc=sum(hc(i,:).*Q_out((n-1)*sample_number+1:n*sample_number));
metric=(cos(state_all(i,4)).*(Iconvhc+Qconvhs) + sin(state_all(i,4)).*(Qconvhc-Iconvhs));
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
%**************************************************************************
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -