?? turbopuncture.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個為一組
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 + -