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