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

传真(Fax)编程

开发平台:

Matlab

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