📄 va_gmsk_phase.m
字号:
function decision = VA_gmsk_phase(fai,data_len,sample_number,qt,delay)
%--------------------------------------------------------------------------
%构造所有状态
L = 3;
phase_state = [0 pi/2 pi 3*pi/2]; %所有相位状态
state_number = 2^L*4; %计算状态数
for i = 1:L
for j = 1:state_number/2^(i-1)
state_all(((j-1)*2^(i-1)+1):j*2^(i-1),i) = 2*mod(j,2)-1;
end
end
for j = 1:state_number/2^L
state_all(((j-1)*2^L+1):j*2^L,L+1) = phase_state(j);
end
%**************************************************************************
%--------------------------------------------------------------------------
%构造状态转移矩阵
state_trans_matrix = zeros(state_number,state_number);
for i = 1:state_number
index = mod(i-1,4);
index2 = mod((state_all(i,L+1) + state_all(i,L)*pi/2)/(pi/2),4);
state_trans_matrix(i,index2*2^L+index*2+1:index2*2^L+index*2+2) = 1;
end
%**************************************************************************
%--------------------------------------------------------------------------
%统计转入到每个状态中的状态序号
state_in = zeros(state_number,2);
for i = 1:state_number
k = 1;
for j = 1:state_number
if state_trans_matrix(j,i) == 1
state_in(i,k) = j;
k = k+1;
end
end
end
%**************************************************************************
%--------------------------------------------------------------------------
max_value = 99999;
metric_state = max_value*ones(state_number,delay);
survivor_state = zeros(state_number,delay);
%VA
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);
end
phase_refe = mod(phase_refe,2*pi);
metric=abs(sum(fai(1:sample_number))-sum(phase_refe));
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
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,3)*qt(2*sample_number+k))+state_all(i,4);
end
phase_refe = mod(phase_refe,2*pi);
metric=abs(sum(fai((n-1)*sample_number+1:n*sample_number))-sum(phase_refe));
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);
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,3)*qt(2*sample_number+k))+state_all(i,4);
end
phase_refe = mod(phase_refe,2*pi);
metric=abs(sum(fai((n-1)*sample_number+1:n*sample_number))-sum(phase_refe));
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)=max_value*ones(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);
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,3)*qt(2*sample_number+k))+state_all(i,4);
end
phase_refe = mod(phase_refe,2*pi);
metric=abs(sum(fai((n-1)*sample_number+1:n*sample_number))-sum(phase_refe));
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)=max_value*ones(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);
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,3)*qt(2*sample_number+k))+state_all(i,4);
end
phase_refe = mod(phase_refe,2*pi);
metric=abs(sum(fai((n-1)*sample_number+1:n*sample_number))-sum(phase_refe));
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] = min(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] = min(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 + -