⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 turbointerleaver.m

📁 cdma2000的编码器关于 turbo码编码器2个子程序
💻 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 + -