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

📄 va2.m

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