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