定点化

Simulink是有定点化工具(fixed-point tool),没有用过,因为我想生成一个不带有浮点数的代码的话只要把所有的数据类型定义为非浮点的形式就好了。
首先
要做的是找到模型中的浮点数(当然如果建模的时候没有对数据类型进行特别设置的话,默认的数据类型都是double型的浮点数)。找浮点数有两个方法:

  • 以R2014a为例,选择菜单栏中的Display/Signal & Ports/Port Data Type,就可以顺着数据流来查找浮点数了。如下:
    这里写图片描述
  • 可以在ModelExplorer中直接对数据类型进行排序,查找浮点数,如下:这里写图片描述。点击圈起来的部分出现括号内出现(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作为友好工具的重要体现)

猜你喜欢

转载自blog.csdn.net/modolllee/article/details/54572304