📄 turbointerleaver.m
字号:
function[sys,x0,str,ts]=MS_SFUN_TurboInterleaver(t,x,u,flag,interleaver_size)
%M文件S-函数的主题部分
%函数名称:MS_SFUN_TurboInterleaver
%主要工能:根据输入的flag的数值调用相应的函数
switch flag
case 0
[sys,x0,str,ts]=mdlInitializeSizes(interleaver_size);
% 当flag等于0时调用mdlInitializeSizes函数执行初始化
case 2
sys=mdlUpdate(t,x,u,interleaver_size);
%当flag等于2时调用mdlUpdate函数计算离散状态的数值
case 3
sys=mdlOutputs(t,x,u,interleaver_size);
%当flag等于3时调用mdlOutputs函数计算输出信号的数值
case {1,4,9}
sys=[];
%等于1,4 ,9事没有相应的操作(没有连续状态)
otherwise
%等于其他数值表示仿真过程出错
error(['Unhandled flag=',num2str(flag)]);
end
%S函数的初始化
%向simulink返回S函数各种信号的长度,初始设置和抽样时间设置
function[sys,x0,str,ts]=mdlInitializeSizes(interleaver_size);
sizes=simsizes;
%调用simsizes获得一个用于存放长度的信息结构
sizes.NumContStates=0;
%设置连续状态的个数
sizes.NumDiscStates=1;
%设置离散状态的个数
sizes.NumOutputs=-1;
%设置输出信号的个数为动态确定
sizes.NumInputs=-1;
%设置输入信号的个数为动态确定
sizes.DirFeedthrough=1;
%设置直接反馈的状态
%0表示 没有直接反馈
%1表示 存在直接反馈
sizes.NumSampleTimes=1;
sys=simsizes(sizes);
%通过simsizes把sizes结构返回给sys
n=mdlInterleaverInit(interleaver_size);
x0=n;
%设置S函数初始状态x0
str=[];
%设置S函数的保留参数str
%初始化抽样时间
ts=[-1 0];
%更新S函数的离散状态并且向simulink返回这些状态的数值
function sys=mdlUpdate(t,x,u,interleaver_size)
%确定turbo编码的参数n
n=mdlInterleaverInit(interleaver_size);
%更新离散状态
sys=n;
%计算S函数的输出信号并且返回给simulink作为模块的输出
function sys=mdlOutputs(t,x,u,interleaver_size)
%离散状态X(1)是turbo编码器的参数n
n=x(1);
%A表示turbo交织器的输入信号
A=zeros(1,interleaver_size);
%counter 是计数器,初始值等于0
counter=0;
for index=0:interleaver_size-1
%label是一个信号量,用语表示是否应该重新计算turbo交织的下标
label=1;
while label==1
%从counter中获取N个最高有效位msb
msb=bitshift(bitand(counter,(2^n-1)*32),-5);
%从counter中获取5个最低有效位lsb
lsb=bitand(counter,31);
%a是最高有效位摸2^n加1的结果
a=mod(msb+1,2^n);
%b表示最低有效位的位反转
b=0;
for k=1:5
if bitget(lsb,k)==1
b=bitset(b,6-k);
end
end
%根据最低有效位lsb和turbo编码参数n查表得到c
c=mdlLookupTable(lsb,n);
%d是a和c的乘积摸2^n之后得到的结果
d=mod(a*c,2^n);
%b和d分别是e的最高有效位和最低有效位
e=b*2^n+d;
%计数器counter的数值加1
counter=mod(counter+1,2^(n+5));
%检查e的数值是否合法
if e<interleaver_size
%如果e小于交织器输入信号的最大下标则设置信号量label为0
%否则,信号量label仍然等于1,重新在这个循环过程中计算e
label=0
end
end
%A的第index+1个元素等于输入信号的第e+1个元素
A(index+1)=u(e+1);
end
%输出信号等于A
sys=A;
%初始化交织的长度
function n=mdlInterleaverInit(interleaver_size)
%根据交织长度确定turbo编码的参数N
switch interleaver_size
case{378,570,762,1146,1530,2298,3066,4602,6138,9210,12282,20730}
%计算turbo编码的参数N,使之满足条件2^(n+5)>=interleaver_size
n=ceil(log2(interleaver_size/32));
%其他的数值都不合法
otherwise
error('Error:invalid InterleaverSize in MS_SFUN_TurboInterleaver');
end
%根据turbo交织器的下标查找对应的数值
function index=mdlLookupTable(lab,n)
%查找表是一个32行7列的矩阵
LoopupTable=[5 27 3 15 3 13 1 ;
15 3 27 127 1 335 349;
5 1 15 89 5 87 303;
15 15 13 1 83 15 721;
1 13 29 31 19 15 973;
9 17 5 15 179 1 703;
9 23 1 61 19 333 761;
15 13 31 47 99 11 327;
13 9 3 127 23 13 453;
15 3 9 17 1 1 95 ;
7 15 15 119 3 121 241;
11 3 31 15 13 155 187;
15 13 17 57 13 1 497;
3 1 5 123 3 175 909;
15 13 39 95 17 421 769;
5 29 1 5 1 5 349;
13 21 19 85 63 509 71;
15 19 27 17 131 215 557;
9 1 15 55 17 47 197 ;
3 3 13 57 131 425 499;
1 29 45 15 211 295 409;
3 17 5 41 173 229 259;
15 25 33 93 231 427 335;
1 29 15 89 171 83 253;
13 9 13 63 23 409 667;
1 13 9 15 147 387 717;
9 23 15 13 243 193 313;
15 13 31 15 213 57 757;
11 13 17 81 189 501 189;
3 1 5 57 51 313 15;
15 13 15 31 15 489 75;
5 13 33 69 67 391 163];
%根据lab和n的数值得到LookupTable的数值
index=LookupTable(lab+1,n-3);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -