Simulink是有定點化工具(fixed-point tool),沒有用過,因為我想生成一個不帶有浮點數的代碼的話只要把所有的數據類型定義為非浮點的形式就好了。
首先
要做的是找到模型中的浮點數(當然如果建模的時候沒有對數據類型進行特別設置的話,默認的數據類型都是double型的浮點數)。找浮點數有兩個方法:

  • 以R2014a為例,選擇菜單欄中的Display/Signal & Ports/Port Data Type,就可以順着數據流來查找浮點數了。如下:

simulink索引模塊_數據類型

  • 可以在ModelExplorer中直接對數據類型進行排序,查找浮點數,如下:

simulink索引模塊_數據類型_02

  • 。點擊圈起來的部分出現括號內出現(and below)即可,然後在DataType列排序查找浮點數據類型(signal Or Double)然後對應修改就好了。
    其次
    對浮點數的數據類型進行修改。Simulink中的所有數據都是按照實際值進行計算的,數據類型的轉換是在‘後台’處理的。用Simulink自己的説法就是,用Scope檢測到的數都是RWV(real world Value),後台處理或者説生成代碼中數據都是SI(Stored Integer)。一般情況下我們只需要關注RWV就好了,讓工具來操心SI以及後邊複雜的變換。具體到浮點數的修改,我們只需要考慮需要保留的精度,剩下的運算交給Simulink就好了。定義數據類型的方式為:
    fixdt(a,b,c,d),
    其中
    a表示符號位:0 unsigned; 1 signed
    b表示數據寬度:一般有8,16,32幾個選擇
    c表示分辨率
    d表示偏移量。
    如 fixdt(1,16,2^1,20)就表示一個int_16分辨率為2,偏移量為20的數據類型,實際值為34存儲的數據就為(34-20)/2=7.
    note:
  • 有些數學運算是不支持浮點運算的,比如説 e^x。這裏我的經驗就是沒有查表不能解決的問題,至於説查表怎麼設計就要看具體情況了。
  • 有些庫模塊也是不支持浮點運算的,這個只能自己考慮尋找新的模塊或者重新設計算法了。
  • 關於fixdt可以參考matlab官方的説法,命令框輸入
    help fixdt
    即可找到。(非常重言的技能,這也是matlab作為友好工具的重要體現)