在Matlab 53中使用.docx

上传人:b****1 文档编号:23096805 上传时间:2023-04-30 格式:DOCX 页数:13 大小:438.44KB
下载 相关 举报
在Matlab 53中使用.docx_第1页
第1页 / 共13页
在Matlab 53中使用.docx_第2页
第2页 / 共13页
在Matlab 53中使用.docx_第3页
第3页 / 共13页
在Matlab 53中使用.docx_第4页
第4页 / 共13页
在Matlab 53中使用.docx_第5页
第5页 / 共13页
点击查看更多>>
下载资源
资源描述

在Matlab 53中使用.docx

《在Matlab 53中使用.docx》由会员分享,可在线阅读,更多相关《在Matlab 53中使用.docx(13页珍藏版)》请在冰豆网上搜索。

在Matlab 53中使用.docx

在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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 经管营销 > 生产经营管理

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1