宋春吉 韓壯志
(解放軍軍械工程學院 石家莊 050003)
?
基于Simulink自定義模塊偽碼調(diào)相信號的產(chǎn)生*
宋春吉韓壯志
(解放軍軍械工程學院石家莊050003)
Simulink具有豐富的標準模塊庫,但并非所有仿真系統(tǒng)都可以通過標準模塊搭建,其自定義模塊實現(xiàn)了Simulink的功能擴展。通過研究S-函數(shù)的工作原理,介紹了S-函數(shù)創(chuàng)建和封裝用戶自定義模塊的基本算法,利用S-函數(shù)M文件基本的框架資源,編寫了偽隨機碼信號的M源文件。通過分析偽碼調(diào)相信號的信號特性,實現(xiàn)了偽碼調(diào)相連續(xù)波信號的快速生成。仿真結(jié)果表明,自定義模塊擴充了Simulink的仿真功能,提供了一種新的雷達信號源產(chǎn)生方法,為工程人員的使用與研究提供極大方便。
Simulink;自定義模塊; S-函數(shù); 偽碼調(diào)相
Class NumberTP391.9
Simulink作為對Matlab運算環(huán)境的擴展,結(jié)合工具箱的使用,可以完成對連續(xù)系統(tǒng)、離散系統(tǒng)、連續(xù)與離散混合系統(tǒng)的動態(tài)性能的仿真與分析[1]。系統(tǒng)仿真的同時,可以將運行數(shù)據(jù)實時存儲在Matlab的工作空間中,并且可以觀察仿真的執(zhí)行過程。正是由于這些卓越的功能,使得它成為自動控制、航空航天、汽車設(shè)計等諸多領(lǐng)域仿真的首選語言。雖然Simulink模塊庫提供了豐富的通用模塊,但并不是所有數(shù)學模型或仿真系統(tǒng)都可以用Simulink通用模塊進行搭建[2]。S-函數(shù)正好彌補了這一不足,它提供了擴展 Simulink 功能的有力工具,并且支持參數(shù)傳遞。用戶可以建立一個能和 Simulink 模塊庫中的標準模塊一起使用的新模塊,利用封裝產(chǎn)生一個與 S-函數(shù)文件相對應(yīng)的對話框和模塊圖標,不斷擴充 Simulink的仿真功能[3]。
偽碼調(diào)相連續(xù)波信號由于具有較高的時寬帶寬積,較好的自相關(guān)特性和較低的功率譜密度,被認為是雷達的理想信號波形[4~5]。但是,基于Simulink仿真系統(tǒng)的偽碼調(diào)相連續(xù)波信號的產(chǎn)生方法卻鮮有提及,并且Simulink此前多被用于控制領(lǐng)域[6~7],對雷達信號方面的仿真研究較少,所以本文在一定程度上拓寬了Simulink的應(yīng)用領(lǐng)域,為偽碼調(diào)相連續(xù)波信號源的產(chǎn)生方法提供新思路。
S-函數(shù),即系統(tǒng)函數(shù),它是擴展Simulink功能的強有力工具。它使用戶可以利用Matlab、C語言、C++語言以及FORTRAN等語言創(chuàng)建自定義的Simulink模塊[8]。S-函數(shù)使用一種特殊的調(diào)用規(guī)則來使用戶可以與Simulink的內(nèi)部解法器進行交互,這種交互同Simulink內(nèi)部解法器與內(nèi)置的模塊之間的交互非常相似[9]。
2.1S-函數(shù)工作原理
每一個Simulink模塊都具有三個基本元素:輸入變量、狀態(tài)變量和輸出向量,如圖1所示。
圖1Simulink模塊的基本元素
其中輸出變量又是輸入變量、采樣時間以及狀態(tài)變量的函數(shù)[10]。它們之間的數(shù)學關(guān)系式如式(1)所示:
y=f0(t,x,u)
xk+1=fu(t,x,u)
(1)
其中
x=xc+xk
該式說明狀態(tài)向量由連續(xù)狀態(tài)和離散狀態(tài)組成。
仿真過程中,Simulink自始至終在向量更新階段產(chǎn)生重復調(diào)用。S-函數(shù)具有一套不同的調(diào)用方法,在模型仿真的不同階段,Simulink會對模型中S-函數(shù)模塊選擇恰當?shù)姆椒▽崿F(xiàn)調(diào)用[11]。S-函數(shù)可以完成的任務(wù)大體分為以下幾種:
1) 初始化
在進入仿真循環(huán)前,Simulink首先初始化S-函數(shù),主要完成以下任務(wù):
(1) 初始化包含S-函數(shù)信息的仿真結(jié)構(gòu)SimSizes;
(2) 設(shè)置輸入輸出端口的維數(shù);
(3) 設(shè)置模塊的采樣時間,即采樣率的倒數(shù);
(4) 分派內(nèi)存區(qū)和sizes組數(shù)。
2) 計算下一個采樣點
若用戶使用了可變采樣時間的模塊,在這一階段需要計算下一個采樣時間點時間,也就是需要計算下一個時間步長。
3) 計算主時間步的輸出量
此調(diào)用結(jié)束后,所有模塊的輸出端口對當前的時間步都是有效的了。
4) 更新主時間步的離散狀態(tài)
5) 積分計算
這一步只有當模型帶有連續(xù)狀態(tài)或帶有非采樣過零點時才有效。
2.2M文件S-函數(shù)
M文件S-函數(shù)是具有固定變量規(guī)則的M文件,大部分S-函數(shù)都是利用模板文件 sfuntmpl. m (位于Matlab根目錄的toolbox/simulink/blocks目錄下)來編寫的。S-函數(shù)的輸入變量如表1所示,輸出變量如表2所示。
表1 輸入變量表
表2 輸出變量表
S-函數(shù)M文件在運行過程中要檢驗輸入變量flag的值,然后按照表的規(guī)則進行操作。
表3 S-函數(shù)Flag值的定義
偽碼調(diào)相連續(xù)波信號的表達式如式(2)所示。其中c(t)為偽隨機碼編碼信號,fc為載波頻率。
st(t)=c(t)ej2πfct
(2)
圖2 二相編碼波形
典型的偽隨機二相編碼是由m序列、巴克碼、Gold序列族、互補序列、L序列等序列對載波進行(0,π)調(diào)相來實現(xiàn)[12]。圖2顯示了偽碼調(diào)相信號波形。其中tcode為碼元寬度,T為載波信號周期,其中T=1/fc。
由于Simulink提供了正弦信號發(fā)生器,所以偽碼調(diào)相連續(xù)波信號產(chǎn)生的關(guān)鍵在于生成偽碼信號。本文以生成63位偽隨機碼信號為例,說明Simulink中自定義模塊的創(chuàng)建及其封裝方法,其S-函數(shù)M源文件的編寫過程如下:
function [sys,x0,str,ts] = pncode(t,x,u,flag,fs,fcode)
switch flag,
case 0, %初始化
[sys,x0,str,ts]=mdlInitializeSizes(fs);
case 1, %計算連續(xù)狀態(tài)導數(shù)
sys=mdlDerivatives(t,x,u);
case 2, %離散狀態(tài)更新
sys=mdlUpdate(t,x,u);
case 3,%輸出量計算
sys=mdlOutputs(t,x,u,flag,fs,fcode);
case 4, %計算下一個采樣點時間
sys=mdlGetTimeOfNextVarHit(t,x,u,fs);
case 9,%執(zhí)行仿真結(jié)束程序
sys=mdlTerminate(t,x,u);
otherwise %處置錯誤
error(['Unhandled flag = ',num2str(flag)]);
end
%%%%%%%%%%%%%%%%%%%%%%%
%mdlInitializeSizes當flag為0時,進行整個系統(tǒng)初始化
function [sys,x0,str,ts]=mdlInitializeSizes(fs)
%首先調(diào)用simsizes函數(shù)得到系統(tǒng)規(guī)模參數(shù)sizes,并根據(jù)離散系統(tǒng)實際情況設(shè)置sizes變量
sizes = simsizes;%讀入初始化參數(shù)模板
sizes.NumContStates = 0; %無連續(xù)狀態(tài)
sizes.NumDiscStates = 0; %無離散狀態(tài)
sizes.NumOutputs= 1;%一個輸出量
sizes.NumInputs= 0; %無輸入量
sizes.DirFeedthrough = 1; %是否存在直接饋通,為1表示輸出受到輸入控制
sizes.NumSampleTimes = 1; %采樣時間的個數(shù)(至少一個)
sys = simsizes(sizes); %將sizes中的信息返回
x0 = []; %初始化狀態(tài)向量
str = []; %str通常為空向量
ts = [1/fs 0]; %設(shè)定采樣周期
% end mdlInitializeSizes初始化結(jié)束
%%%%%%%%%%%%%%%%%%%%%%%
%mdlDerivatives當flag為1時,計算連續(xù)狀態(tài)導數(shù)
function sys=mdlDerivatives(t,x,u)
sys = [];
%%%%%%%%%%%%%%%%%%%%%%%
%mdlUpdate當flag為2時,離散狀態(tài)更新
function sys=mdlUpdate(t,x,u)
sys = [];
%%%%%%%%%%%%%%%%%%%%%%%
%mdlOutputs當flag為3時,計算輸出變量
function sys=mdlOutputs(t,x,u,flag,fs,fcode)
tcode = 1/fcode; %設(shè)置碼鐘變量,決定碼元寬度
load( 'SIGNAL1', 'pn' ); %置入預先設(shè)置的63位偽隨機序列
Lcode=63; %序列長度
index = mod( fix( t/( tcode ) ) , Lcode) + 1; %通過取整、求余運算計算當前時刻碼元位置
sys_tmp = real( pn(index )); %距離門信號輸出
sys = sys_tmp;
%%%%%%%%%%%%%%%%%%%%%%%
%mdlGetTimeOfNextVarHit當flag為4時,計算下一個采樣時間點
function sys=mdlGetTimeOfNextVarHit(t,x,u,fs)
sampleTime = 1/fs; % 時間步進,下一時刻為1/fs
sys = t + sampleTime;
%%%%%%%%%%%%%%%%%%%%%%%
% mdlTerminate當flag為9時,執(zhí)行仿真結(jié)束程序
function sys=mdlTerminate(t,x,u)
sys = [];
將該程序以文件名 pncode.m 保存,該程序及其注釋說明了S函數(shù) M源文件編寫的一般框架,可以根據(jù)需要在主程序中調(diào)用相關(guān)的子程序。在這里,通過正確編寫 flag=0、2、3 標識的初始化、離散狀態(tài)更新、輸出計算等各階段,就能夠?qū)崿F(xiàn)偽隨機序列的生成。該自定義算法生動的展示了S函數(shù)的使用方法,為m序列偽隨機信號的生成提供了較好地解決方案。
4.1模塊的封裝
通過將自定義模塊封裝成標準模塊,用戶可以直接對定義參數(shù)進行修改,可以與原有標準模塊進行互聯(lián),擴展了Simulink功能的同時,為用戶的使用提供方便。根據(jù)需要按照上述框架編好S-函數(shù)后,就可以對這些能實現(xiàn)特殊算法的模塊進行封裝和測試,其步驟是:
1) 向模型窗口中加入S-function模塊,雙擊該模塊,打開參數(shù)設(shè)置對話框(BlockParameters),輸入源文件名“pncode”和用戶定義的參數(shù)“fs、fcode”;
2) 選擇該模塊,右鍵打開封裝編輯器(Mask Edition)。在 Initialization頁中添加用戶定義的變量參數(shù)“fs、fcode”;
3) 給模塊命名;
4) 建立仿真模型框圖,測試模塊功能。
由式(2)可以看出偽碼調(diào)相連續(xù)波信號中編碼信號和載波信號之間的關(guān)系為相乘。本文搭建的仿真框圖如圖3所示。將各個模塊拖到Simulink工作空間后,雙擊其中的 S-function模塊,將給出如圖4所示的S-函數(shù)參數(shù)設(shè)置對話框,在S-function name 欄目填寫pncode,就可以建立起該模塊和我們編寫的 pncode.m文件之間的聯(lián)系,在 S-function parameters 欄目還可以給出 S-函數(shù)的附加參數(shù),fs和fcode,fs為系統(tǒng)采樣時間,ts=1/fs為系統(tǒng)步進時間,tcode=1/fcode。在封裝編輯器(Mask Edition)中輸入fs和fcode 。
圖3 系統(tǒng)仿真框圖
圖4 參數(shù)設(shè)置對話框
4.2模塊的調(diào)試
本文設(shè)置參數(shù)fs=300MHz和fcode=0.25MHz,fc=0.25MHz獲得偽隨機碼信號波形如圖5所示,偽碼調(diào)相仿真結(jié)果如圖6所示。
本文對仿真軟件Simulink中S-函數(shù)的工作原理、函數(shù)格式及其封裝過程作了詳細的說明,通過對偽隨機信號自定義模塊的 M源文件的編寫,充分展示了S-函數(shù) M源文件的基本框架。擴展了Simulink使用功能的同時,提供了一種較為便利的偽碼調(diào)相信號產(chǎn)生方法,為自定義模塊的使用與研究提供可靠參考。
圖5 偽隨機碼調(diào)制信號
圖6 二相編碼調(diào)制波形
[1] 李立兵,馮志彪.Simulink仿真模型穩(wěn)定性研究[J].計算機仿真,2005,22(5):66-70.
[2] 王玉萍.基于Matlab/Simulink環(huán)境下的異步電機建模與仿真[J].防爆電機,2012,3(47):24-27.
[3] 胡琳靜,孫正順.Simulink中自定義模塊的創(chuàng)建與封裝[J].系統(tǒng)仿真學報,2004,16(3):488-491.
[4] 倪慧俊.探測高速目標的二相編碼雷達技術(shù)研究[D].南京:南京理工大學,2011.
[5] 鐘雄林.偽碼調(diào)相連續(xù)波雷達干擾技術(shù)研究[D].西安:西安電子科技大學,2012.
[6] 侯浩亮,姚新宇,馮曉梅,等.C-MEX S-函數(shù)在Simulink中的應(yīng)用[J].微計算機信息,2010,7(26):140-142.
[7] 趙富寧,王紅艷.Matlab/Simulink在電路分析中的應(yīng)用[J].計算機時代,2014,7(4):21-23.
[8] 馬永光,冉寧,趙朋.基于S函數(shù)在自抗擾控制器Simulink仿真中的應(yīng)用[J].儀器儀表用戶,2012,4(19):78-80.
[9] 李曉靜,黃紅飛.S-函數(shù)建模和仿真過程研究[J].電子工程設(shè)計,2011,19(18):27-32.
[10] 趙瑋,譚德榮,于劍峰.Simulink中自定義模塊的創(chuàng)建[J].微計算機應(yīng)用,2006,27(3):379-381.
[11] 姚俊,馬松輝.Simulink建模與仿真[M].西安:西安電子科技大學出版社,2002.
[12] 張永勝.偽碼調(diào)相連續(xù)波雷達的性能與應(yīng)用研究[D].南京:南京理工大學,2004.
Generation of Pseudo-random Code Based on Simulink Custom Block
SONG ChunjiHAN Zhuangzhi
(Ordnance Engineering College of PLA, Shijiazhuang050003)
Simulink has a rich library of standard blocks, but not all of the simulation system can be built through the standard block, its custom block implements the function extension of Simulink. By studying the working principle of S-function,this paper introduces the basic algorithm of the S-function to create and encapsulate the user-defined block, and uses the basic framework of the S-function to write the M resource file of the pseudo-random code signal. Through the analysis of signal characteristics of pseudorandom code phase modulation signal, realize the rapid generation of pseudorandom code. The simulation results show that the custom module extends the simulation function of Simulink, a new method for generating radar signal source is provided, which can provide great convenience for the use and research of engineering personnel.
Simulink, custom block, S-function, pseudo-random code phase modulation
2016年4月17日,
2016年5月21日
宋春吉,男,碩士研究生,研究方向:雷達信號處理和彈丸初速測量。韓壯志,男,副教授,碩士生導師,研究方向:雷達高分辨彈道測量,電磁環(huán)境模擬與雷達網(wǎng)絡(luò)化對抗。
TP391.9
10.3969/j.issn.1672-9730.2016.10.014