本次內容【思想】將帶大家認識Simulink定點數,,下面將分別介紹定點數的理論基礎,、Simulink中實現過程及定點數的應用場合。 理論基礎 在介紹定點數之前,,需要先科普下計算機中的數據(整形,、浮點型)的存儲方式。 從最簡單的8位整型開始,,不考慮正負數的情況下,,二進制數從0000 0000~1111 1111(8個位)表示0~255。如何考慮正負符號,,就需要引入補碼,,用最高位來標記正負號。0000 0000 ~0111 1111表示0~127,;1000 0000~11111111表示-1~-128,。整型數據的表達很好理解,浮點型數據就稍微麻煩點,。根據IEEE(電氣和電子工程師協(xié)會)對32位浮點數的定義如下: 在一個32位的內存空間中,,最高位用來表示正負符號,接下來的8位用來表示整數部分,,最后的23位用來表示小數部分,。 計算的方法就是把8位整數部分的值與23位小數部分的值共同表達浮點型數據。 定點數的原理就是根據上面的方法,,定義不同內存空間中整數與小數部分的長度來實現浮點型數據的表達,。假設我們可以試圖利用8位的內存空間來表示浮點數: 正數形式 如果用最低1位來表示小數位,則0111 1111代表的是+63.5 如果用最低2位來表示小數位,,則0111 1111代表的是+31.75 如果用最低3位來表示小數位,,則0111 1111代表的是+15.875 如果用最低4位來表示小數位,則0111 1111代表的是+7.9375 負數形式 如果用最低1位來表示小數位,,則1111 1111代表的是-0.5 如果用最低2位來表示小數位,,則1111 1111代表的是-0.25 如果用最低3位來表示小數位,則1111 1111代表的是-0.125 如果用最低4位來表示小數位,,則1111 1111代表的是-0.0625 Simulink中的實現 Simulink專門用于數據類型轉換的模型,,Data Type Converison 在輸出的數據類型中可以看到除了常見的int/float/double類型外還有fixdt的定點數據類型,支持三種類型的定點數,。 可以通過Matlab強大的幫助文件了解fixdt的使用,。例如:fixdt(1,16,8),,其中第一個參數1表示是否有符號【1:有、2:沒有】,;第二個參數16表示當前用來表述整個浮點數的數據長度為16位,;最后一個參數8表示用來表述小數部分的數據長度為8位。定點數的存儲可以為策略工程師提供靈活的浮點數管理方式,。 定點數的應用場合 如果看過之前純電動仿真控制策略文章《AVL-CRUISE純電動仿真策略提高教程》的朋友肯定對這個有印象,。仿真工程師將輸入的信號統(tǒng)一轉換為double數據類型,再進行策略邏輯運算,。但是,,在嵌入式工程師看來,這種行為簡直是【敗家子】,。在復雜的控制算法模型中,,一方面,如果所有的浮點型數據都直接用double或者float,,單片機內存堆棧根本無法放下這么多內容,。另一方面,實際的控制工程不需要使用到double這么高的數據精度,。 例如在Simulink中同樣表示0.5數值,,可以用8位、16位甚至32位,,但是它們占用內存的大小卻有所不同,! 根據前面生成代碼的建模方式《Simulink代碼生成應用教程》,創(chuàng)建一個簡單的算法,,同時對這個算法生成C語言代碼,。 可以看到在生成的結果中,模型中常量模塊中的0.5浮點型數據已經被整型數據所取代,。 其實在實際應用過程中,,數據精度并不是越高越好,數據精度高意味著付出的內存資源更多,。因此,,在內存緊張的嵌入式系統(tǒng)中,工程師可以通過定點數的方式找到一個精度和資源之間的平衡點,。 |
|