利用S函數實現自編模塊
發布時間:2008/12/17 0:00:00 訪問次數:1529
有些過程用普通的simulink模塊不容易搭建,可以利用s函數編程來實現所需要的模塊,s函數可以極大地擴展simulink的功能,使得simulink的仿真變得更靈活、更強大。
s函數是一種采用matlab或c語言編寫,用以描述動態系統行為的算法語言。它采用一種特殊的調用規則,從而讓用戶能夠同simulink自身的方程求解器進行交互,這種交互過程同simulink本身標準模塊的工作機制幾乎完全相同。
要使用s函數,必須了解simulink的工作機制。simulink在仿真過程中每隔一段時間就會對模型中的所有模塊進行調用,每個模塊在調用過程中都會完成諸如輸出信號的計算、內部狀態變量的更新及其導數的計算等工作。而仿真開始和結束時刻的調用將完成該模塊的初始化和掃尾工作。
simulink在仿真過程中反復調用s函數,在調用過程中,simulink將調用s函數子程序,這些子程序將完成一下工作:
(1)在仿真循環開始之前的初始化工作:初始化simstruct結構,其中包含了關于s函數的相關信息;設置輸入輸出端口的數目和大小;設置模塊的采樣周期;分配內存并設置sizes數組。
(2)下一個采樣時刻的計算:如果設置的是可變步長的積分算法,則計算下一個計算時刻。如果是固定步長,則計算下一個仿真的步長。
(3)在最大時間步長內計算模塊的輸出。這一步完成以后,模塊所有的輸出都變成有效值。
(4)在最小時間步長內更新離散狀態。
(5)積分過程,這一步一般是針對連續系統而言的。
s函數的引導語旬為:[sys,x0,str,ts]=f(t,x,u,flag,p1,p2,…)。從源程序角度來看,simulink將t,x,u,flag,p1,p2等參數傳遞給s函數,同時需要s函數返回sys,x0,str,ts四個向量。它們的具體含義是:
t:目前仿真中的實際時間。
x:狀態向量,可能為空。
u:輸入向量。
flag:表明simulink不同仿真狀態的標志量。
sys:依據flag的不同返回不同的結果,如flag=3,sys返回s函數的輸出。
x0:初始狀態值,如果沒有狀態變量,則為空向量,在flag=0時忽略。
str:保留為將來使用,必須設置為空矩陣。
ts:兩列矩陣,記錄采樣時間和模塊的延時時間。
在m文件形式的s函數中,simulink將一個flag的參數傳遞給s函數,該參數存儲了目前仿真的狀態,我們必須為每一個flag的值編寫適當的函數。表列舉了仿真的不同狀態下flag的具體以及調用的s函數。
表 不同仿真階段下flag的具體值以及調用的s函數
編碼實現時,在各個狀態對應的函數下編寫相應的功能程序即可。本文就是通過這種方法實現了差動雙相碼、差動碼和彌勒碼的構建。
1. 差動雙相碼的編碼和解碼
差動雙相碼的編碼規則是:在半個位周期中的任意邊沿表示二進制“0”,而沒有邊沿表示二進制“1”。此外,在每一個位周期開始時,電平都要反向。因此,這種碼對接收端來說,位節拍比較容易重建。
根據上述內容,結合差動雙相碼的編碼格式,設計的s函數如下:
可以用與編碼過程類似的方法編程實現差動雙相碼的解碼。解碼的思路為:如果這一時刻的輸入與上一時刻的輸入相同譯作“0”,否則譯作“1”,由于其滯后性,引入一個位延時。設計的s函數如下:
將以上的s函數封裝成模塊并進行仿真,仿真模型和仿真結果如圖1所示。
圖1 差動雙相碼的編解碼仿真模型與仿真波形
2. 差動碼的編碼與解碼
與差動雙相碼的編解碼思路相似,根據差動碼的編碼規則可設計出其編解碼的s函數。將其封裝成模塊并進行仿真,仿真模型和仿真結果如圖2所示。
圖2 差動碼的編解碼仿真模型與仿真波形
3. 米勒碼的編碼與解碼
米勒碼的編碼規則是在半個位周期內的任意邊沿表示二進制“1”,而經過下一個位周期中不變的電平表示二進制“0”。一連串的零在位周期開始時產生電平交變。解碼時在某位的中間看此時的輸入是否與上一時刻相同,相同譯做“0”,否則譯做“1”。同樣,用s函數來設
有些過程用普通的simulink模塊不容易搭建,可以利用s函數編程來實現所需要的模塊,s函數可以極大地擴展simulink的功能,使得simulink的仿真變得更靈活、更強大。
s函數是一種采用matlab或c語言編寫,用以描述動態系統行為的算法語言。它采用一種特殊的調用規則,從而讓用戶能夠同simulink自身的方程求解器進行交互,這種交互過程同simulink本身標準模塊的工作機制幾乎完全相同。
要使用s函數,必須了解simulink的工作機制。simulink在仿真過程中每隔一段時間就會對模型中的所有模塊進行調用,每個模塊在調用過程中都會完成諸如輸出信號的計算、內部狀態變量的更新及其導數的計算等工作。而仿真開始和結束時刻的調用將完成該模塊的初始化和掃尾工作。
simulink在仿真過程中反復調用s函數,在調用過程中,simulink將調用s函數子程序,這些子程序將完成一下工作:
(1)在仿真循環開始之前的初始化工作:初始化simstruct結構,其中包含了關于s函數的相關信息;設置輸入輸出端口的數目和大小;設置模塊的采樣周期;分配內存并設置sizes數組。
(2)下一個采樣時刻的計算:如果設置的是可變步長的積分算法,則計算下一個計算時刻。如果是固定步長,則計算下一個仿真的步長。
(3)在最大時間步長內計算模塊的輸出。這一步完成以后,模塊所有的輸出都變成有效值。
(4)在最小時間步長內更新離散狀態。
(5)積分過程,這一步一般是針對連續系統而言的。
s函數的引導語旬為:[sys,x0,str,ts]=f(t,x,u,flag,p1,p2,…)。從源程序角度來看,simulink將t,x,u,flag,p1,p2等參數傳遞給s函數,同時需要s函數返回sys,x0,str,ts四個向量。它們的具體含義是:
t:目前仿真中的實際時間。
x:狀態向量,可能為空。
u:輸入向量。
flag:表明simulink不同仿真狀態的標志量。
sys:依據flag的不同返回不同的結果,如flag=3,sys返回s函數的輸出。
x0:初始狀態值,如果沒有狀態變量,則為空向量,在flag=0時忽略。
str:保留為將來使用,必須設置為空矩陣。
ts:兩列矩陣,記錄采樣時間和模塊的延時時間。
在m文件形式的s函數中,simulink將一個flag的參數傳遞給s函數,該參數存儲了目前仿真的狀態,我們必須為每一個flag的值編寫適當的函數。表列舉了仿真的不同狀態下flag的具體以及調用的s函數。
表 不同仿真階段下flag的具體值以及調用的s函數
編碼實現時,在各個狀態對應的函數下編寫相應的功能程序即可。本文就是通過這種方法實現了差動雙相碼、差動碼和彌勒碼的構建。
1. 差動雙相碼的編碼和解碼
差動雙相碼的編碼規則是:在半個位周期中的任意邊沿表示二進制“0”,而沒有邊沿表示二進制“1”。此外,在每一個位周期開始時,電平都要反向。因此,這種碼對接收端來說,位節拍比較容易重建。
根據上述內容,結合差動雙相碼的編碼格式,設計的s函數如下:
可以用與編碼過程類似的方法編程實現差動雙相碼的解碼。解碼的思路為:如果這一時刻的輸入與上一時刻的輸入相同譯作“0”,否則譯作“1”,由于其滯后性,引入一個位延時。設計的s函數如下:
將以上的s函數封裝成模塊并進行仿真,仿真模型和仿真結果如圖1所示。
圖1 差動雙相碼的編解碼仿真模型與仿真波形
2. 差動碼的編碼與解碼
與差動雙相碼的編解碼思路相似,根據差動碼的編碼規則可設計出其編解碼的s函數。將其封裝成模塊并進行仿真,仿真模型和仿真結果如圖2所示。
圖2 差動碼的編解碼仿真模型與仿真波形
3. 米勒碼的編碼與解碼
米勒碼的編碼規則是在半個位周期內的任意邊沿表示二進制“1”,而經過下一個位周期中不變的電平表示二進制“0”。一連串的零在位周期開始時產生電平交變。解碼時在某位的中間看此時的輸入是否與上一時刻相同,相同譯做“0”,否則譯做“1”。同樣,用s函數來設
上一篇:編碼抗干擾能力仿真分析
上一篇:利用已有模塊組合實現模塊封裝