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

📄 va.m

📁 本程序为通信系统中的GMSK调制程序
💻 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           码元个数
%sample_number      采样个数
%qt
%delay              判决延迟
%**************************************************************************

% delay = 9;
metric_state = zeros(state_number,delay);               %记录权值
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
            %随着数据的送入,刷新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
            %随着数据的送入,刷新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
%**************************************************************************

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -