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

📄 turbopuncture.m

📁 cdma2000的编码器关于 turbo码编码器2个子程序
💻 M
字号:
function[sys,x0,str,ts]=MS_SFUN_TurboPuncture(t,x,u,flag,interleaver_size,code_rate)


switch flag  
  
case  0
[sys,x0,str,ts]=mdlInitializeSizes(interleaver_size,code_rate);

case  3
sys=mdlOutputs(t,x,u,interleaver_size,code_rate);

case {1,2,4,9}
sys=[]
otherwise
error(['Unhandled flag=',num2str(falg)]);
end


function[sys,x0,str,ts]=mdlInitializeSizes(interleaver_size,code_rate)

sizes=simsizes;

sizes.NumContStates=0;
%设置连续状态的个数

sizes.NumDiscStates=0;
%设置离散状态的个数

%表示输出的信号长度
len=(interleaver_size+6)*6;

switch code_rate

case 1    
    %  1/2码率输出信号长度等于输入信号长度的1/3
  out_len=len/3;


case 2     
    %1/3码率输出信号长度等于输入信号长度的1/2
  out_len=len/2;

case 3   
    % 1/4码率输出信号长度等于输入信号长度的2/3
  out_len=len*2/3

otherwise
 error('Error:Invalid Code Rate in MS_SFUN_TurboPuncture');

end

%设置输出信号长度
sizes.NumOutputs=out_len;

%设置输入信号长度
size.NumInputs=len;

%直接反馈
sizes.DirFeedthough=1;

%抽样时间个数
sizes.NumSampleTimes=1;

sys=simsizes(sizes);

x0=[];

str=[];

ts=[-1 0]


function sys=mdlOutputs(t,x,u,interleaver_size,code_rate)
%计算输入信号长度
len=(interleaver_size+6)*6;

%输入信号向量的前半部分表示第一个卷积编码器的编码信号,下表由index1表示
index=1;

%输入信号向量的后半部分表示第二个卷积编码器的编码信号,下表由index2表示
index=len/2+1;

%a用语保存调换顺序后的输入信号
A=zeros(1,len);

%a元素以6个为一组
for i=1:len
if mod(i-1,6)<3
%前3个元素表示第一个卷积编码器信号,它在输入信号U中的下表有index1确定
A(i)=u(index1);

index1=index1+1;

else
%后3个元素表示第一个卷积编码器信号,它在输入信号U中的下表有index1确定
A(i)=u(index2);

index2=index2+1;

end
end

%根据编码速率确定信号抽取和重复的方式以及输出信号的长度
%抽取方式向量中0表示删除该信号,1表示输出该信号,2表示重复输出该信号
switch code_rate
case 1
% 表示a中前len-36个元素进行抽取的方式
 pattern=[1 1 0 0 0 0 1 0 0 0 1 0];
% 表示a中从len-35个元素开始的18个信号的抽取方式
 pattern1=[1 1 0 0 0 0 ];
% 表示对a中最后18个元素的抽取方式
 pattern2=[0 0 0 1 1 0];

out_len=len/3;


case 2 
  pattern=[1 1 0 0 1 0 1 1 0 0 1 0];
  pattern1=[2 1 0 0 0 0];
  pattern2=[0 0 0 2 1 0];
  out_len=len/2;


case 3
  pattern=[1 1 1 0 0 1 1 1 0 0 1 1];
  pattern1=[2 1 1 0 0 0 ];
  pattern2=[0 0 0 2 1 1 ];
  out_len=len*2/3;

otherwise
 error('Error:Invalid Code Rate in MS_SFUN_TurboPuncture');
end

%b表示输出信号
B=zeros(1,out_len);

index=1
%根据抽取方式pattern对a中前len-36个元素进行抽取
for i=1:(len-36) 
%如果pattern等于1则输出a中的元素A(i)否则忽略
if pattern(mod(i-1,12)+1)==1
 B(index)=A(i);
index=index+1;

end
end


%根据抽取方式pattern1对从len-35个元素开始的18个信号进行抽取和重复
for i=(len-36)+1:len-18
%如果pattern等于1则输出a中的元素a(i)一次
%如果pattern等于2则输出a中的元素a(i)两次
%否则忽略
for k=1:pattern1(mod(i-1,6)+1)
B(index)=A(i);
index=index+1;
end
end

%根据抽取方式pattern2对最后18个信号进行抽取和重复
for i=(len-18)+1:len
%如果pattern等于1则输出a中的元素a(i)一次
%如果pattern等于2则输出a中的元素a(i)两次
for k=1:pattern2(mod(i-1,6)+1)
B(index)=A(i);
index=index+1;
end
end

sys=B;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -