在Matlab 53中使用.docx
- 文档编号:296870
- 上传时间:2023-04-28
- 格式:DOCX
- 页数:13
- 大小:438.44KB
在Matlab 53中使用.docx
《在Matlab 53中使用.docx》由会员分享,可在线阅读,更多相关《在Matlab 53中使用.docx(13页珍藏版)》请在冰点文库上搜索。
在Matlab53中使用
在Matlab5.3中使用
simulink與s-function
2003/1/2091323513李晃昌
目錄:
簡介
1.使用simulink建立模型
1simulink使用以及基本參數設定
2利用subsystem簡化模型
3在mask外設定subsystem的參數
2.使用s-function建立新的元件
1s-function執行流程
2以FIR濾波器範例說明s-function中變數與函式功能
3.在Matlab中以C語言撰寫s-function
簡介
在matlab中,提供了一個simulink的程式模擬工具箱。
可以將模型直接以塊圖的方式表現,能讓建立模型以外的人也能很快了解系統所包含的內容。
Simulink提供了大量的元件,加速了模型的建立。
但我們還是可能會找不到現成的元件,這時可以使用一些基本功能的元件組合起來,建立一個次系統(subsystem),再加上mesk成為一個自訂功能的元件。
這種多層的架構可以讓我們使用少數的基本元件建立複雜的模型。
但是在simulink中,每一個元件都是由一個個別的程式寫成的,而在模擬中的每次取樣時間,模型中的每個元件都會被執行一次,於是各個元件對應的程式都被執行了一次。
所以模型中使用的元件越多,每次取樣時間所須執行的程式數目就越大,模擬就跑得越慢。
所以我們必須學會使用程式建立自訂功能的元件,也就是s-function。
直接使用s-function來建立元件,可以節省模擬的時間,並且自訂參數,增加模型的彈性。
S-function可以使用matlab自訂的程式語言撰寫,存成m-file,或是使用c語言編寫,可以增快執行的速度。
本文的主要目的在使讀者能了解如何使用s-function建立自己的元件。
將會先簡略的說明次系統(subsystem)的建立方法以及mesk的使用,接著介紹m-file的s-function格式,最後再說明c語言的s-function格式。
1.使用simulink建立模型
1.1simulink使用以及基本參數設定
這節將介紹simulink的基本使用方法,以及模擬參數設定。
我們將以一個FIR濾波器作為說明的範例。
首先要開啟simulink工具箱,可以在matlab的command視窗下鍵入”simulink”,或是直接點選工具列上的
圖示。
接著在工具箱上選取
開啟新的檔案,將檔名存為FIR_1。
這時應該可以在螢幕上看到圖一的畫面:
圖一
接著我們可以開始建立自己的FIR濾波器模型。
FIR濾波器可以用delay,gain,sum這些元件構成。
要搜尋這些元件,可以在工具箱上的望遠鏡後面打上想找的元件名稱,然後按”Enter”。
工具箱中可能會有許多名稱類似的元件,不停的按”Enter”可以找下一個,直到找到合用的,然後將它拖曳到FIR_1檔案視窗中。
如圖二。
圖二
以滑鼠右鍵雙擊元件可以改變內部的參數。
將sum的Listofsignals改為”++++”,Iconshap改為”rectangular”;用Ctrl+滑鼠拖曳複製三個unitdelay,四個Gain。
接著用Ctrl+R旋轉元件,在元件間以滑鼠直接拉線連接。
然後我們以兩個step加上一個sum組成一個脈衝信號,再分別用scope觀察輸入和輸出的波形。
這時建立的模型應該如圖三,是一個四接的FIR濾波器,weightcoefficient(Gain中的值)分別是1,2,3,4。
圖三
模型中各個元件的參數設定如下:
第一個Step的steptime=1,initialvalue=0,finalvalue=1,sampletime=0;
第二個Step的steptime=2,initialvalue=0,finalvalue=-1,sampletime=0;
所有的UnitDelay的sampletime都是1,initialvalue都是0。
要設定模擬的時間,點選檔案工具列上的Simulation->Parameters,可以設定Starttime和Stoptime。
分別設為0和10。
接著按下
,模擬就開始執行了。
執行完成後,點選scope,可以看到如圖四的波形。
圖四
1.2利用subsystem簡化模型
我們現在已經可以使用元件建立簡單的模型了。
當模型很大時,例如包含了許多個FIR濾波器,這時模型的方塊圖會變得很凌亂不易觀察。
我們可以將幾個相連的元件簡化成一個方塊,就是建立subsystem。
像是在FIR_1中,我們可以選取組成濾波器的元件(unitdelay,gain,4-inputsum),然後在工具列中點選Edit->CreateSubsystem,可以把模型轉換成圖五的樣子。
點選其中的subsystem,將可以看到,如同圖六顯示的,原本的FIR濾波器已經被包含在這個subsystem中了。
圖五
圖六
1.3在mask外設定subsystem的參數
雖然我們可以用subsystem簡化模型的方塊圖,但是當要改變參數時,還是得進入各個subsystem分別設定。
像我們建立的FIR濾波器,若想要改變取樣時間(sampletime),weightcoefficient等參數,還是得進入subsystem中,逐個元件設定。
所以現在要介紹將subsystem加上mask的方法,讓subsystem內部元件的參數可以透過mask在subsystem外設定。
首先將要在外部改變的參數設為變數。
進入Subsystem中,將Unitdelay的SampleTime,設為變數‘T’,四個gain分別設為W
(1),W
(2),W(3)和W(4)(對應matlab中向量的使用法,將weightcoefficient設為向量W,則W(k)表示W中的第k個元素)。
回到原本的方塊圖,選取subsystem後,再點選Edit->MaskSubsystem,可以看到如圖七的編輯視窗。
(選擇initialization這個分頁)。
其中Prompt是mask上會顯示的變數名稱,Variable是對應的變數。
輸入的格式(Controltype)選取Edit。
將兩個變數分別輸入:
sampletimp,T;weightcoefficient,W,按Add加入。
完成後按Apply->OK(貨直些按OK)。
這時再點選原本的subsystem,會發現看到的不是內部元件,而是一個變數編輯視窗,如圖八。
圖七
若想得到與之前相同的結果,可以在weightcoefficient中輸入[1234],sampletime中輸入1。
我們現在有一個四階的FIR濾波器,可以任意改變取樣時間以及weightcoefficient。
但是若想增加濾波器的階數,還是得進入subsystem內部修改。
要進入一個已經加上mask的subsystem,首先選取它,按滑鼠右鍵,選擇LookUnderMask。
下一章要介紹的s-function,可以讓我們建立更有彈性的方塊,像是階數也是任意設定的FIR濾波器。
圖八
2.使用s-function建立新的元件
在前一章我們學會了如何使用simulink工具箱中的元件建立模型。
當再工具箱中找不到合用的元件時可以用建立subsystem再加上mask的方式建立自訂的元件。
但是這樣拼湊出來的元件,參數的設定不夠有彈性。
接下來要介紹的s-function,可以讓我們建立全新的元件,參數的設定完全決定於使用者的設計。
2.1s-function執行流程
在介紹s-function的語法之前,必須先了解它在simulink模型下是如何運作的。
Simulink模型中的元件,在每次取樣時間都會執行對應的s-function一次。
在一個s-function中,包含了幾個函式分別管理輸入的擷取,狀態更新以及輸出的產生等動作。
這些函式隨著旗標(flag)的切換依序執行。
圖九表示了一個s-function在一次取樣時間中的執行流程。
圖九
2.2以FIR濾波器範例說明s-function中變數與函式功能
接下來將逐一介紹s-function中的各個變數與函式的功能。
在matlab5.3版的MATLABR11\toolbox\simulink\blocks目錄底下有一個sfuntmpl.m檔,有詳細的介紹可以參考。
同時這個檔案也提供了s-function的標準格式。
接下來,我們模仿第一章的流程,以s-function建立一個FIR濾波器,並和第一章的執行結果比較。
我們可以藉由修改sfuntmpl.m來建立FIR濾波器。
首先將檔案另存到work資料夾底下,檔名存為FIR_2.m。
我們希望這個FIR濾波器能由使用者設定取樣時間,weightcoefficient,而且階數會隨著weightcoefficient的數目改變。
所以我們要外加的變數有sample_time和weight。
這些變數必須加在原本內定的變數後面,所以程式的第一行會變成:
function[sys,x0,str,ts]=FIR_2(t,x,u,flag,sample_time,weight)。
其中t,x,u是s-function保留的變數,分別表示模擬執行的時間,儲存的狀態值和輸入。
參數的設定在mdlInitializeSizes表示。
這個濾波器的輸入和輸出都是一個,所以sizes.NumOutputs=1,sizes.NumInputs=1。
而儲存的離散時間狀態比weightcoeffitient的數目少一個,sizes.NumDiscStates=lenght(weight)-1。
FIR濾波器不會使用到連續時間的狀態,所以sizes.NumContStates=0。
而儲存的狀態初始值都為零,x0=zeros(length(weight)-1,1)。
在s-function中,輸入,輸出和儲存的狀態若有一個以上,都要宣告成列矩陣(columvector)的形式。
取樣時間只有一個,sizes.NumSampleTimes=1。
取樣時間沒有偏移,而取樣的間隔由sample_time設定,ts=[sample_time0],最後一個元素表示取樣時間的偏移,其它的依序表示第1,2,3…個取樣時間(當與樣時間不只一個時)。
由於我們在mdlInitializeSize中使用了sample_time和weight這輛個變數,所以函式的宣告必須將這些變數加入,mdlInitializeSizes(sample_time,weight)。
必須注意變數的宣告順序必須和最初的一樣,因為s-function傳遞變數的值是根據位置來分辨的。
s-function中呼叫的每個函式,都以變數sys當作輸出。
若有沒用到的函式,可以直接將它去掉,同時去掉switchflag中這個函式對應的旗標值。
或是將它的輸出設為空矩陣。
在FIR濾波器中,不會用到微分(用在連續時間狀態的更新),所以functionsys=mdlDerivatives(t,x,u)sys=[]。
mdlGetTimeOfNextVarHit是由目前程式的執行狀態交由元件自行決定下一個取樣時間,在這個FIR濾波器中不會使用到。
而mdlTerminate是元件執行結束的動作,通常都不需要修改,保留sfuntmpl.m中的原樣。
所以這個FIR濾波器剩下需要修改的部分就只有mdlUpdate和mdlOutputs,分別處理離散時間狀態的更新和輸出的計算。
FIR濾波器在每次取樣時間的動作,是將暫存器(相當於這裡離散時間狀態)的值平移(shift),並加入新的輸入到第一個暫存器。
所以mdlUpdate中的動作是sys=[u;x(1:
end-1)]。
而濾波器的輸出,是暫器中存的值和目前的輸入跟weightcoefficient做內積。
所以mdlOutputs的動作是sys=weight*[u;x](weight是一個行矩陣)。
完整的FIR濾波器s-function收錄在附錄。
現在我們有了FIR濾波器s-function的程式。
接下來要將它真正建成能在simulink中使用的元件。
開啟一個新的simulink檔案後,直接在工具箱的搜尋欄中鍵入”s-function”。
將空的s-function元件拖曳到檔案中,點選它後,在S-functionname鍵入剛剛存檔的FIR濾波器的s-function的檔名:
FIR_2,在S-functionparameter中依序鍵入我們增加的變數,sample_time和weight,以逗號隔開。
如同圖十所示。
圖十
然後再以第一章所學到的方法加上mask,讓sample_time和weight可以由mask外部設定。
現在我們得到一個可以任意設定取樣時間以及weightcoefficient的FIR濾波器,一個自己建立的新元件。
附錄:
FIR_2.m
function[sys,x0,str,ts]=FIR_2(t,x,u,flag,sample_time,weight)
switchflag,
case0,
[sys,x0,str,ts]=mdlInitializeSizes(sample_time,weight);
case1,
sys=mdlDerivatives(t,x,u);
case2,
sys=mdlUpdate(t,x,u);
case3,
sys=mdlOutputs(t,x,u,weight);
case4,
sys=mdlGetTimeOfNextVarHit(t,x,u);
case9,
sys=mdlTerminate(t,x,u);
otherwise
error(['Unhandledflag=',num2str(flag)]);
end
function[sys,x0,str,ts]=mdlInitializeSizes(sample_time,weight)
sizes=simsizes;
sizes.NumContStates=0;
sizes.NumDiscStates=length(weight)-1;
sizes.NumOutputs=1;
sizes.NumInputs=1;
sizes.DirFeedthrough=1;
sizes.NumSampleTimes=1;%atleastonesampletimeisneeded
sys=simsizes(sizes);
x0=zeros(length(weight)-1,1);
str=[];
ts=[sample_time0];
functionsys=mdlDerivatives(t,x,u)
sys=[];
functionsys=mdlUpdate(t,x,u)
sys=[u;x(1:
end-1)];
functionsys=mdlOutputs(t,x,u,weight)
sys=weight*[u;x];
functionsys=mdlGetTimeOfNextVarHit(t,x,u)
sampleTime=1;%Example,setthenexthittobeonesecondlater.
sys=t+sampleTime;
functionsys=mdlTerminate(t,x,u)
sys=[];
%endmdlTerminate
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 在Matlab 53中使用 Matlab 53 使用