sova0.m
上传用户:hnyfjx
上传日期:2013-06-30
资源大小:2149k
文件大小:3k
源码类别:

传真(Fax)编程

开发平台:

Matlab

  1. function L_all = sova(rec_s, g, L_a, ind_dec) 
  2. % This function implememts Soft Output Viterbi Algorithm in trace back mode 
  3. % Input: 
  4. %       rec_s: scaled received bits. rec_s(k) = 0.5 * L_c(k) * y(k) 
  5. %              L_c = 4 * a * Es/No, reliability value of the channel
  6. %              y: received bits
  7. %       g:  encoder generator matrix in binary form, g(1,:) for feedback, g(2,:) for feedforward
  8. %       L_a: a priori information about the info. bits. Extrinsic info. from the previous
  9. %             component decoder
  10. %       ind_dec: index of the component decoder. 
  11. %           =1: component decoder 1; The trellis is terminated to all zero state
  12. %               =2: component decoder 2; The trellis is not perfectly terminated.
  13. % Output:
  14. %       L_all: log ( P(x=1|y) ) / ( P(x=-1|y) )
  15. %
  16. % Copyright: Yufei Wu, Nov. 1998
  17. % MPRG lab, Virginia Tech
  18. % for academic use only
  19. % Frame size, info. + tail bits
  20. L_total = length(L_a);
  21. [n,K] = size(g); 
  22. m = K - 1;
  23. nstates = 2^m;
  24. Infty = 1e10;
  25. % SOVA window size. Make decision after 'delta' delay. Decide bit k when received bits
  26. % for bit (k+delta) are processed. Trace back from (k+delta) to k. 
  27. delta = 30;    
  28. % Set up the trellis defined by g.
  29. [next_out, next_state, last_out, last_state] = trellis(g);
  30. % Initialize path metrics to -Infty
  31. for t=1:L_total+1
  32.    for state=1:nstates
  33.       path_metric(state,t) = -Infty;
  34.    end
  35. end
  36. % Trace forward to compute all the path metrics
  37. path_metric(1,1) = 0;
  38. for t=1:L_total
  39.    y = rec_s(2*t-1:2*t);
  40.    for state=1:nstates
  41.       sym0 = last_out(state,1:2);
  42.       sym1 = last_out(state,3:4);
  43.       state0 = last_state(state,1);
  44.       state1 = last_state(state,2);
  45.       Mk0 = y*sym0' - L_a(t)/2 + path_metric(state0,t);
  46.       Mk1 = y*sym1' + L_a(t)/2 + path_metric(state1,t);
  47.       
  48.       if Mk0>Mk1
  49.          path_metric(state,t+1)=Mk0;
  50.          Mdiff(state,t+1) = Mk0 - Mk1;
  51.          prev_bit(state, t+1) = 0;
  52.       else
  53.          path_metric(state,t+1)=Mk1;
  54.          Mdiff(state,t+1) = Mk1 - Mk0;
  55.          prev_bit(state,t+1) = 1;
  56.       end
  57.    end
  58. end
  59.       
  60. % For decoder 1, trace back from all zero state, 
  61. % for decoder two, trace back from the most likely state
  62. if ind_dec == 1
  63.    mlstate(L_total+1) = 1;
  64. else
  65.    mlstate(L_total+1) = find( path_metric(:,L_total+1)==max(path_metric(:,L_total+1)) );
  66. end
  67. % Trace back to get the estimated bits, and the most likely path
  68. for t=L_total:-1:1
  69.    est(t) = prev_bit(mlstate(t+1),t+1);
  70.    mlstate(t) = last_state(mlstate(t+1), est(t)+1);
  71. end
  72. % Find the minimum delta that corresponds to a compitition path with different info. bit estimation.       
  73. % Give the soft output
  74. for t=1:L_total
  75.    llr = Infty;
  76.    for i=0:delta
  77.       if t+i<L_total+1
  78.          bit = 1-est(t+i);
  79.          temp_state = last_state(mlstate(t+i+1), bit+1);
  80.          for j=i-1:-1:0
  81.             bit = prev_bit(temp_state,t+j+1);
  82.             temp_state = last_state(temp_state, bit+1);
  83.          end
  84.          if bit~=est(t) 
  85.             llr = min( llr,Mdiff(mlstate(t+i+1), t+i+1) );
  86.          end
  87.       end
  88.    end
  89.    L_all(t) = (2*est(t) - 1) * llr;
  90. end    
  91.                   
  92.                
  93.       
  94.         
  95.