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

传真(Fax)编程

开发平台:

Matlab

  1. function pattern=interleaver_3GPP(x)
  2. %****************************************************************
  3. % 内容概述:3GPP标准交织器
  4. % 创 建 人:朱殿荣/QQ:235347/MSN:njzdr@msn.com
  5. % 单    位:南京邮电大学,通信工程系
  6. % 创建时间:2005年9月11日
  7. % 修改时间:
  8. % 参考文献:3GPP TS 25.212 V6.6.0 (2005-09)
  9. %          3GPP TS 25.222 V6.2.0 (2004-12)
  10. % 版权声明:任何人均可复制、传播、修改此文件,同时需保留原始版权信息。
  11. %****************************************************************
  12. %   K Number of bits input to Turbo code internal interleaver
  13. %   R Number of rows of rectangular matrix
  14. %   C Number of columns of rectangular matrix
  15. %   p Prime number
  16. %   v Primitive root
  17. %   T   Inter-row permutation patterns
  18. K=length(x);
  19. %(1) Determine the number of rows of the rectangular matrix, R
  20. if K>=40 & K<=159
  21.     R=5;
  22.     T=[4, 3, 2, 1, 0]+1;
  23. elseif (K>=160 & K<=200)|(K>=481 & K<=530)
  24.     R=10;
  25.     T=[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]+1;
  26. elseif (K>=2281 & K<=2480)|(K>=3161 & K<=3210)
  27.     R=20;
  28.     T=[19, 9, 14, 4, 0, 2, 5, 7, 12, 18, 16, 13, 17, 15, 3, 1, 6, 11, 8, 10]+1;
  29. else
  30.     R=20;
  31.     T=[19, 9, 14, 4, 0, 2, 5, 7, 12, 18, 10, 8, 13, 17, 3, 1, 16, 6, 15, 11]+1;
  32. end
  33. %(2) Determine the prime number to be used in the intra-permutation, p,
  34. %and the number of columns of rectangular matrix, C
  35. p_table=[7 11 13 17 19 23 29 31 37 41 43 ...
  36.     47 53 59 61 67 71 73 79 83 89 97 ...
  37.     101 103 107 109 113 127 131 137 139 149 151 ...
  38.     157 163 167 173 179 181 191 193 197 199 211 ...
  39.     223 227 229 233 239 241 251 257];
  40. if K>=481 & K<=530
  41.     p=53;
  42.     C=p;
  43. else
  44.     %Find minimum prime number p from p_table
  45.     ii=1;
  46.     while (p_table(ii)+1)*R<K
  47.         ii=ii+1;
  48.     end
  49.     p=p_table(ii);
  50.     %determine C 
  51.     if K<=(p-1)*R
  52.         C=p-1;
  53.     elseif K>(p-1)*R & K<=R*p
  54.         C=p;
  55.     elseif K>R*p
  56.         C=p+1;
  57.     end
  58. end
  59.         
  60. %(3)Write the input bit sequence into the R*C rectangular matrix row by row
  61. if K~=R*C
  62.     x(1,(K+1):(R*C))=0; %dummy bits are padded 
  63. end
  64. matrix_unpermutation=(reshape(x,C,R))';
  65. %注意:这里的reshape是按照列排序的,还需要转置一下
  66. %----------------------------Intra-row and inter-row permutations
  67. v_table=[
  68.      3     2     2     3     2     5     2     3     2     6     3 ...
  69.      5     2     2     2     2     7     5     3     2     3     5 ...
  70.      2     5     2     6     3     3     2     3     2     2     6 ...
  71.      5     2     5     2     2     2    19     5     2     3     2 ...
  72.      3     2     6     3     7     7     6     3     ];
  73. %(1) Select a primitive root v from the table
  74.  if K>=481 & K<=530
  75.      v=2;
  76.  else
  77.      v=v_table(ii);
  78.  end
  79.  
  80. %(2) Construct the base sequence s(j)   for intra-row permutation
  81. s(1)=1;
  82. for j=2:p-1
  83.     s(j)=mod(v*s(j-1),p);
  84. end
  85. %(3)    determine the prime integer qi
  86. q(1)=1;
  87. q(1,2:R)=6;
  88. for i=2:R
  89.     while ((gcd(q(i),p-1)==1) & (q(i)>6) & (q(i)>q(i-1)))==0
  90.         q(i)=q(i)+1;
  91.     end
  92. end
  93. %(4) Permute the sequence  qi to make the sequence  ri
  94. r(T)=q;
  95. %(5) Perform the i-th (i = 0, 1, …, R - 1) intra-row permutation
  96. for i=1:R
  97.     if C==p
  98.         for j=1:p-1
  99.             U(i,j)=s(mod(j*r(i),p-1)+1);
  100.         end
  101.         U(i,p)=0;
  102.     elseif C==p+1
  103.         for j=1:p-1
  104.             U(i,j)=s(mod(j*r(i),p-1)+1);
  105.         end
  106.         U(i,p)=0;
  107.         U(i,p+1)=p;
  108.         if K==R*C & i==R
  109.             temp=U(R,p+1);
  110.             U(R,p+1)=U(R,1);
  111.             U(R,1)=temp;
  112.         end
  113.     elseif C==p-1
  114.         for j=1:p-1
  115.             U(i,j)=s(mod(j*r(i),p-1)+1)-1;
  116.         end
  117.     end
  118. end
  119. for i=1:R
  120.     matrix_intra_row_permutated(i,:)=matrix_unpermutation(i,U(i,:)+1);
  121. end
  122.     
  123. for i=1:C
  124.     matrix_interleaved(:,i)=matrix_intra_row_permutated(T,i);
  125. end
  126. k=1;
  127. for i=1:C
  128.     for j=1:R
  129.          if matrix_interleaved(j,i)~=0
  130.              pattern(k)=matrix_interleaved(j,i);
  131.              k=k+1;
  132.          end
  133.     end
  134. end
  135.