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

📄 ms_sfun_turbopuncture.m

📁 根据TD-SCDMA系统的特点
💻 M
字号:
function [sys,x0,str,ts] = MS_SFUN_TurboPuncue(t,x,u,flag,interleaver_size,code_rate)

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

% M文件S-函数的主体部分
% 函数名称:MS_SFUN_TurboPuncture
% 主要功能:根据输入的参数flag的数值调用相应的函数

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
switch flag,

   case 0,
     
     % 当flag等于0时调用mdlInitializeSizes函数执行初始化   
     [sys,x0,str,ts]=mdlInitializeSizes(interleaver_size,code_rate);
     
   case 3,
      
      %当flag等于3时调用mdlOutputs函数计算输出信号的数值
      sys=mdlOutputs(t,x,u,interleaver_size,code_rate);

   case {1,2,4,9},
      
      %当flag等于1、2、4、9时没有相应的操作
      sys=[];

   otherwise
      %当flag等于其他数值时表示仿真出错
       error(['Unhandled flag = ',num2str(flag)]);

end

% end MS_SFUN_TurboPuncture

%
%=============================================================================
% mdlInitializeSizes
% S函数的初始化
% 向Simulink返回S-函数各种信号的长度,初始设置和抽样时间设置
%=============================================================================
%
function [sys,x0,str,ts]=mdlInitializeSizes(interleaver_size,code_rate)

%
% 调用simsizes获得一个用于存放长度信息的结构
sizes = simsizes;

%设置连续状态的个数
sizes.NumContStates  = 0;
%设置离散状态个数
% x(1)表示交织器参数n
sizes.NumDiscStates  =0;
% len表示输入信号的长度
len=(interleaver_size+6)*6;
% 根据Tubo码的码率code_rate确定输出信号的强度

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;
%设置输入信号的长度
sizes.NumInputs      = len;
%设置直接反馈的状态
%   0 表示没有直接反馈
%   1 表示有直接反馈
sizes.DirFeedthrough = 1;
%设置抽样时间的个数
sizes.NumSampleTimes = 1;  
%通过simsizes把sizes结构返回给sys

sys = simsizes(sizes);

%
% 设置S-函数的初始状态X0(没有离散状态)
%
x0=[];

%
% 设置S-函数的保留参数str(应该设置为空间向量[])
%
str = [];

%
% 初始化抽样时间 
ts  = [-1 0];
% end mdlInitializeSize

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

% mdlOuputs
% 计算S-函数的输出信号并且返回给Simulink作为模块的输出

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

function sys=mdlOuputs(t,x,u,interleaver_size,code_rate)

% 技算输入信号的长度
len=(interleaver_size+6)*6;
% 输入信号向量的前半部分表示第一个卷积码编码器的编码信号,其下标由index1表示
index1=1;
% 输入信号向量的后半部分表示第二个卷积码编码器的编码信号,其下标由index2表示
index2=len/2+1;
% A用于保存调换顺序后的输入信号
A=zeros(1,len);
% 把输入信号调换顺序,使得同一时刻俩个编码器产生的编码信号A中连续存放
 
 for i=1:l
     % A中元素以6个为一组
     
 if mod(i-1,6)<3
     % 前三个元素表示第一个卷积码的编码信号,它在输入信号U中的下标由index1确定
      A(i)=u(index1);
     % 增加计数器index1的数值
      index1=index1+1;
  else
    % 后三个元素表示第一个卷积编码器的编码信号,它在输入信号u中的下标由index2确定
     A(i)=u(index2);
    % 增加计数器index2的数值 
     index2=index2+1;
   end
  end
  
  % 根据编码速率确定信号抽取和重复的方式以及输出信号的长度
  % 1表示1/2码率,2表示1/3码率,3表示1/4码率
  % 抽取方式向量中0表示去除该信号,1表示输出该信号,2表示重复输出该信号
  
  switch code_rate
      case 1
          % 1/2码率
          % pattern表示对A中前len-36个元素进行抽取的方式
         
          pattern=[1 1 0 0 0 0 1 0 0 0 1 0];
          
          % pattern1 表示对A中从len-35个元素开始的18个信号的抽取方式
         
          pattern1=[1 1 0 0 0 0];
          
          % pattern2 表示 对A中最后18元素的抽取方式
          
          pattern2=[0 0 0 1 1 0];
          
          % out_len 表示输出信号的长度
          
          out_len=len/3;
          
      case 2
          % 1/3码率
          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
          % 1/4码率
          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:Invaild Code Rate in MS_SFUN_TurboPuncture');
    end
    
    % B 表示输出信号
    
    B=zeros(1,out_len);
    
    % index表示输出信号的下标
    index1=1;
    % 根据抽取方式pattern对A中前len-36个元素进行抽取
   
    for i=1:(len-36)
        % 如果pattern等于1側输出A中的元素A(i)
        % 否则涂越A(I)
        if pattern(mod(i-1,12)+1)==1
            B(index)=A(i);
            index=index+1;
        end
    end
    
    % 根据抽取方式pattern1对从len-35个元素开始的18个信号进行抽取和重复
    
    for (len-36)+1:len-18
        % 如果pattern等于1则输出A中的元素A(i)一次
        % 如果pattern等于2则输出A中的元素A(i)二次
        % 否则涂越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)二次
        % 否则涂越A(I)  
         
          for k=1:pattern2(mod(i-1,6)+1)
             
              B(index)=A(i);
              index=index+1;
          end
      end
      % 输出信号等于B
      
      sys=B;
      
      % end mdlOuputs  
  
     


⌨️ 快捷键说明

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