gusucode.com > matlab通信工程仿真源码(张德丰等编著)程序书籍 > matlab_code/matlab通信工程仿真源码(张德丰等编著)/第10章/VitDec.m

    function [xx, BestMetric] = VitDec(G, y, ZeroTail); 
% 此函数是实现硬判决输入的Viterbi译码 
% G为生成多项式的矩阵
% y为输入的待译码序列 
% Zer为判断是否包含‘0’尾
% xx为Viterbi译码输出序列 
% BestMetric为最后的最佳度量
L = size(G, 1);     % 输出码片数 
K= size(G, 2);      % 生成多项式长度
N = 2^(K-1);        % 状态数
T = length(y)/L;    % 最大栅格深度 
OutMtrx = zeros(N, 2*L); 
for s = 1:N 
    in0 = ones(L, 1)*[0, (dec2bin((s-1), (K-1))-'0')]; 
    in1 = ones(L, 1)*[1, (dec2bin((s-1), (K-1))-'0')];      
    out0 = mod(sum((G.*in0)'), 2); 
    out1 = mod(sum((G.*in1)'), 2);      
    OutMtrx(s, :) = [out0, out1]; 
end  
PathMet = [0; 100*ones((N-1), 1)];      
PathMetTemp = PathMet(:,1);  
Trellis = zeros(N, T); 
Trellis(:,1) = [0 : (N-1)]';  
y = reshape(y, L, length(y)/L); 
for t = 1:T      
    yy = y(:, t)'; 
    for s = 0:N/2-1 
        [B0 ind0] = min(  PathMet(1+[2*s, 2*s+1]) + [sum(abs(OutMtrx(1+2*s, 0+[1:L])...
 - yy).^2); sum(abs(OutMtrx(1+(2*s+1), 0+[1:L]) - yy).^2)] ); 
        [B1 ind1] = min(  PathMet(1+[2*s, 2*s+1]) + [sum(abs(OutMtrx(1+2*s,...
 L+[1:L]) - yy).^2); sum(abs(OutMtrx(1+(2*s+1), L+[1:L]) - yy).^2)] );          
        PathMetTemp(1+[s, s+N/2]) =  [B0; B1]; 
        Trellis(1+[s, s+N/2], t+1) = [2*s+(ind0-1); 2*s + (ind1-1)];         
    end 
   PathMet = PathMetTemp;      
end  
xx = zeros(T, 1); 
if (ZeroTail) 
    BestInd = 1; 
else 
    [Mycop, BestInd]  = min(PathMet); 
end  
BestMetric = PathMet(BestInd); 
xx(T) = floor((BestInd-1)/(N/2)); 
NextState = Trellis(BestInd, (T+1)); 
for t=T:-1:2 
    xx(t-1) = floor(NextState/(N/2)); 
    NextState = Trellis( (NextState+1), t); 
end  
if (ZeroTail) 
    xx = xx(1:end-K+1); 
end