📄 3gpp交织器.m
字号:
%3GPP 25.212信道复用与编码规范中的交织器(以长度为1024为例)
%****************************************************************
% K 交织器的交织长度
% R 交织矩阵行数
% C 交织矩阵列数
% p 一个质数
% v 由查表得到一个基本数
% T 行间交织模式序列
% U 行内交织模式序列
% j 交织矩阵的行数
% i 交织矩阵的列数
%****************************************************************
%输入比特流x长度1024
x=[0 1 1 0 1 0 0 0 0 0 0 0 0 1 1 0 1 1 1 0 1 0 1 1 0 1 0 0 0 0 0 0 0 0 1 1 0 1 1 1 0 1 0 ...
1 1 0 1 0 0 0 0 0 0 0 0 1 1 0 1 1 1 0 1 0 1 1 0 1 0 0 0 0 0 0 0 0 1 1 0 1 1 1 0 1 0 1 ...
1 0 1 0 0 0 0 0 0 0 0 1 1 0 1 1 1 0 1 0 1 1 0 1 0 0 0 0 0 0 0 0 1 1 0 1 1 1 0 1 0 1 1 ...
0 1 0 0 0 0 0 0 0 0 1 1 0 1 1 1 0 1 0 1 1 0 1 0 0 0 0 0 0 0 0 1 1 0 1 1 1 0 1 0 1 1 0 ...
1 0 0 0 0 0 0 0 0 1 1 0 1 1 1 0 1 0 1 1 0 1 0 0 0 0 0 0 0 0 1 1 0 1 1 1 0 1 0 1 1 0 1 ...
0 0 0 0 0 0 0 0 1 1 0 1 1 1 0 1 0 1 1 0 1 0 0 0 0 0 0 0 0 1 1 0 1 1 1 0 1 0 1 1 0 1 0 ...
0 0 0 0 0 0 0 1 1 0 1 1 1 0 1 0 1 1 0 1 0 0 0 0 0 0 0 0 1 1 0 1 1 1 0 1 0 1 1 0 1 0 0 ...
0 0 0 0 0 0 1 1 0 1 1 1 0 1 0 1 1 0 1 0 0 0 0 0 0 0 0 1 1 0 1 1 1 0 1 0 1 1 0 1 0 0 0 ...
0 0 0 0 0 1 1 0 1 1 1 0 1 0 1 1 0 1 0 0 0 0 0 0 0 0 1 1 0 1 1 1 0 1 0 1 1 0 1 0 0 0 0 ...
0 0 0 0 1 1 0 1 1 1 0 1 0 1 1 0 1 0 0 0 0 0 0 0 0 1 1 0 1 1 1 0 1 0 1 1 0 1 0 0 0 0 0 ...
0 0 0 1 1 0 1 1 1 0 1 0 1 1 0 1 0 0 0 0 0 0 0 0 1 1 0 1 1 1 0 1 0 1 1 0 1 0 0 0 0 0 0 ...
0 0 1 1 0 1 1 1 0 1 0 1 1 0 1 0 0 0 0 0 0 0 0 1 1 0 1 1 1 0 1 0 1 1 0 1 0 0 0 0 0 0 0 ...
0 1 1 0 1 1 1 0 1 0 1 1 0 1 0 0 0 0 0 0 0 0 1 1 0 1 1 1 0 1 0 1 1 0 1 0 0 0 0 0 0 0 0 ...
1 1 0 1 1 1 0 1 0 1 1 0 1 0 0 0 0 0 0 0 0 1 1 0 1 1 1 0 1 0 1 1 0 1 0 0 0 0 0 0 0 0 1 ...
1 0 1 1 1 0 1 0 1 1 0 1 0 0 0 0 0 0 0 0 1 1 0 1 1 1 0 1 0 1 1 0 1 0 0 0 0 0 0 0 0 1 1 ...
0 1 1 1 0 1 0 1 1 0 1 0 0 0 0 0 0 0 0 1 1 0 1 1 1 0 1 0 1 1 0 1 0 0 0 0 0 0 0 0 1 1 0 ...
1 1 1 0 1 0 1 1 0 1 0 0 0 0 0 0 0 0 1 1 0 1 1 1 0 1 0 1 1 0 1 0 0 0 0 0 0 0 0 1 1 0 1 ...
1 1 0 1 0 1 1 0 1 0 0 0 0 0 0 0 0 1 1 0 1 1 1 0 1 0 1 1 0 1 0 0 0 0 0 0 0 0 1 1 0 1 1 ...
1 0 1 0 1 1 0 1 0 0 0 0 0 0 0 0 1 1 0 1 1 1 0 1 0 1 1 0 1 0 0 0 0 0 0 0 0 1 1 0 1 1 1 ...
0 1 0 1 1 0 1 0 0 0 0 0 0 0 0 1 1 0 1 1 1 0 1 0 1 1 0 1 0 0 0 0 0 0 0 0 1 1 0 1 1 1 0 ...
1 0 1 1 0 1 0 0 0 0 0 0 0 0 1 1 0 1 1 1 0 1 0 1 1 0 1 0 0 0 0 0 0 0 0 1 1 0 1 1 1 0 1 ...
0 1 1 0 1 0 0 0 0 0 0 0 0 1 1 0 1 1 1 0 1 0 1 1 0 1 0 0 0 0 0 0 0 0 1 1 0 1 1 1 0 1 0 ...
1 1 0 1 0 0 0 0 0 0 0 0 1 1 0 1 1 1 0 1 0 1 1 0 1 0 0 0 0 0 0 0 0 1 1 0 1 1 1 0 1 0 1 ...
1 0 1 0 0 0 0 0 0 0 0 1 1 0 1 1 1 0 1 0 1 1 0 1 0 0 0 0 0 0 0 0 1 1 0];
K=2048;%length(x);
%(1)确定交织矩阵的行数,R(标准中给定)
if K>=40 & K<=159
R=5;
T=[4, 3, 2, 1, 0]+1;%行间置换模式
elseif (K>=160 & K<=200)|(K>=481 & K<=530)
R=10;
T=[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]+1;
elseif (K>=2281 & K<=2480)|(K>=3161 & K<=3210)
R=20;
T=[19, 9, 14, 4, 0, 2, 5, 7, 12, 18, 16, 13, 17, 15, 3, 1, 6, 11, 8, 10]+1;
else
R=20;
T=[19, 9, 14, 4, 0, 2, 5, 7, 12, 18, 10, 8, 13, 17, 3, 1, 16, 6, 15, 11]+1;
end
%(2)确定交织矩阵的列数,C
%找到满足条件的最小质数,p
p_table=[7 11 13 17 19 23 29 31 37 41 43 ...
47 53 59 61 67 71 73 79 83 89 97 ...
101 103 107 109 113 127 131 137 139 149 151 ...
157 163 167 173 179 181 191 193 197 199 211 ...
223 227 229 233 239 241 251 257];
if K>=481 & K<=530
p=53;
C=p;
else
%从标准给定的p_table表中找到最小质数,p
%p满足条件(p+1)*R>=K
ii=1;
while (p_table(ii)+1)*R<K
ii=ii+1;
end
p=p_table(ii);
%确定交织矩阵列数,C
if K<=(p-1)*R
C=p-1;
elseif K>(p-1)*R & K<=R*p
C=p;
elseif K>R*p
C=p+1;
end
end
%(3)输入信息序列x按行写入R*C的交织矩阵
if K~=R*C
x(1,(K+1):(R*C))=0; %若K<R*C,用0比特填充
end
matrix_unpermutation=(reshape(x,C,R))';
%注意:这里的reshape是按照列排序的,还需要转置一下
%(4)将交织矩阵进行行内和行间置换
v_table=[
3 2 2 3 2 5 2 3 2 6 3 ...
5 2 2 2 2 7 5 3 2 3 5 ...
2 5 2 6 3 3 2 3 2 2 6 ...
5 2 5 2 2 2 19 5 2 3 2 ...
3 2 6 3 7 7 6 3 ];
% 1)查表得到本原根,v
if K>=481 & K<=530
v=2;
else
v=v_table(ii);
end
% 2)构造行内交织基本序列s(j)
s(1)=1;
for j=2:p-1
s(j)=mod(v*s(j-1),p);
end
% 3)确定最小质数序列 qi
q(1)=1;
q(1,2:R)=6;
for i=2:R
while ((gcd(q(i),p-1)==1) & (q(i)>6) & (q(i)>q(i-1)))==0
q(i)=q(i)+1;
end
end
%(5)置换序列qi得到序列 ri
r(T)=q;
%(6)对第i行进行行内交织
for i=1:R
if C==p
for j=1:p-1
U(i,j)=s(mod(j*r(i),p-1)+1);
end
U(i,p)=0;
elseif C==p+1
for j=1:p-1
U(i,j)=s(mod(j*r(i),p-1)+1);
end
U(i,p)=0;
U(i,p+1)=p;
if K==R*C & i==R
temp=U(R,p+1);
U(R,p+1)=U(R,1);
U(R,1)=temp;
end
elseif C==p-1
for j=1:p-1
U(i,j)=s(mod(j*r(i),p-1)+1)-1;
end
end
end
%(7) 按U进行行内交织
for i=1:R
matrix_intra_row_permutated(i,:)=matrix_unpermutation(i,U(i,:)+1);
end
%(8) 按T进行行间交织
for i=1:C
matrix_interleaved(:,i)=matrix_intra_row_permutated(T,i);
end
%(9)按列从交织矩阵matrix_interleavered中读出经交织后的信息序列
k=1;
for i=1:C
for j=1:R
pattern(k)=matrix_interleaved(j,i);
k=k+1;
end
end
%(10)剪切掉交织前被填充的虚拟位即k>K的位,得到最后输出y
y=pattern(1:K);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -