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

传真(Fax)编程

开发平台:

Matlab

  1. function en_output = encoderm( x, g, alpha, puncture )
  2. % Copyright Nov. 1998 Yufei Wu
  3. % MPRG lab, Virginia Tech.
  4. % for academic use only
  5. % uses interleaver map 'alpha'
  6. % if puncture = 1, unpunctured, produces a rate 1/3 output of fixed length
  7. % if puncture = 0, punctured, produces a rate 1/2 output 
  8. % multiplexer chooses odd check bits from RSC1 
  9. % and even check bits from RSC2
  10. % determine the constraint length (K), memory (m) 
  11. % and number of information bits plus tail bits.
  12. [n,K] = size(g); 
  13. m = K - 1;
  14. L_info = length(x); 
  15. L_total = L_info + m;  
  16. % generate the codeword corresponding to the 1st RSC coder
  17. % end = 1, perfectly terminated;
  18. input = x;
  19. output1 = rsc_encode(g,input,1);
  20. % make a matrix with first row corresponing to info sequence
  21. % second row corresponsing to RSC #1's check bits.
  22. % third row corresponsing to RSC #2's check bits.
  23. y(1,:) = output1(1:2:2*L_total);
  24. y(2,:) = output1(2:2:2*L_total);
  25. % interleave input to second encoder
  26. for i = 1:L_total
  27.    input1(1,i) = y(1,alpha(i)); 
  28. end
  29. output2 = rsc_encode(g, input1(1,1:L_total), -1 );
  30. y(3,:) = output2(2:2:2*L_total);
  31. % paralell to serial multiplex to get output vector
  32. % puncture = 0: rate increase from 1/3 to 1/2;
  33. % puncture = 1; unpunctured, rate = 1/3;
  34. if puncture > 0 % unpunctured
  35.    for i = 1:L_total
  36.        for j = 1:3
  37.            en_output(1,3*(i-1)+j) = y(j,i);
  38.        end
  39.    end
  40. else % punctured into rate 1/2
  41.    for i=1:L_total
  42.        en_output(1,n*(i-1)+1) = y(1,i);
  43.        if rem(i,2)
  44.       % odd check bits from RSC1
  45.           en_output(1,n*i) = y(2,i);
  46.        else
  47.       % even check bits from RSC2
  48.           en_output(1,n*i) = y(3,i);
  49.        end 
  50.     end  
  51. end
  52. % antipodal modulation: +1/-1
  53. en_output = 2 * en_output - ones(size(en_output));