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

传真(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. %*****************************************************************
  13. % 对输入 x 进行 turbo 编码
  14. %******************************************************************
  15. % 待编码序列 x
  16. % 生成多项式 g
  17. % 交织映射表alpha
  18. %         j=alpha(i) 将原来 i 位置的比特映射到 j 位置 
  19. % 删余系数puncture
  20. %         puncture=0   使用删余
  21. %         puncture=1 不使用删余
  22. %**************************************************************************
  23. % 使用删余时, 校验位采用第一分量编码器的奇数位
  24. %                          二            偶数位            
  25. %***************************************************************************
  26. % 编码的输出已经调制成+1 -1序列。
  27. %**************************************************************************
  28. [n,K] = size(g); 
  29. m = K - 1;
  30. L_info = length(x); 
  31. L_total = L_info + m;  
  32. % 根据生成矩阵决定   附加的尾比特数
  33. %                    编码器的寄存器数目=尾比特数
  34. % generate the codeword corresponding to the 1st RSC coder
  35. % end = 1, perfectly terminated;
  36. input = x;
  37. output1 = rsc_encode(g,input,1);
  38. % 将输入 x 进行 rsc 编码
  39. % make a matrix with first row corresponing to info sequence
  40. % second row corresponsing to RSC #1's check bits.
  41. % third row corresponsing to RSC #2's check bits.
  42. y(1,:) = output1(1:2:2*L_total);
  43. y(2,:) = output1(2:2:2*L_total);
  44. % 将编码的输出处理 ( 信息位 校验位 信息位 检验位。。)
  45. %  y(1,:)  信息位
  46. %  y(2,:)  校验位           
  47. % interleave input to second encoder
  48. for i = 1:L_total
  49.    input1(1,i) = y(1,alpha(i)); 
  50. end
  51. % 将 信息位 进行交织
  52. output2 = rsc_encode(g, input1(1,1:L_total), -1 );
  53. y(3,:) = output2(2:2:2*L_total);
  54. % 得到 交织后 进行编码 的 校验位 作为 turbo 码的 第 三 位
  55. % paralell to serial multiplex to get output vector
  56. % puncture = 0: rate increase from 1/3 to 1/2;
  57. % puncture = 1; unpunctured, rate = 1/3;
  58. if puncture > 0 % unpunctured
  59.    for i = 1:L_total
  60.        for j = 1:3
  61.            en_output(1,3*(i-1)+j) = y(j,i);
  62.        end
  63.    end
  64. else % punctured into rate 1/2
  65.    for i=1:L_total
  66.        en_output(1,n*(i-1)+1) = y(1,i);
  67.        if rem(i,2)
  68.       % odd check bits from RSC1
  69.           en_output(1,n*i) = y(2,i);
  70.        else
  71.       % even check bits from RSC2
  72.           en_output(1,n*i) = y(3,i);
  73.        end 
  74.     end  
  75. end
  76. % antipodal modulation: +1/-1
  77. %串行输出如下:
  78. %en_output = 2 * en_output - ones(size(en_output));
  79. %并行输出如下:
  80. en_output = 2 * y - ones(size(y));
  81. % 调制 将 1 调制成  +1
  82. %         0         -1