⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 va_gmsk_phase.m

📁 本程序为通信系统中的GMSK调制程序
💻 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 + -