转载:matlab中的fixdt()的使用方法
在学习matlab/simulink中,会遇见的一个东西就是fixdt()这个东西,此前我对这个东西一直抱有疑惑,现在也不太明白,在网上看了很多的答案,也不甚明了,我这篇博客介绍一下这个东西。
这个是用在定点计算上,在常数模块(constant)中、数据类型转换模块(Data Type Conversion)中以及其他的很多的模块中都有。那么咱们先搭建一个模型
并且设置Constant模块
仿真的结果是32,然后将Output data type 设置成fixdt(1,32,10)
仿真结果是1024,然后将Output data type 设置成fixdt(1,16,9)
仿真结果是64.怎么理解这个东西呢?
其实这是一个点小数点的问题,早就听说定点计算有整数部分和小数部分,小数部分越多,精度越高,这就出现了如果使用所有的字长,高位没有用到,而没有小数位,为了充分利用字长,就出现了点小数点的问题。
fixdt()函数就是这个问题,fixdt(1,16,10),1代表的是否有符号位,16代表的是总共16位,10代表的是小数位是10位。
fixdt(1,16,10)的工作方式就是,总共16位,将1024是10000000000,将16位从右到左数10位作为小数位,其他是整数位,已经是溢出了,就是说已经失真了。
如果看fixdt(1,16,2),仿真的结果是1024,代表的是小数位是2。
(注意:这篇博客是边摸索,边写的)
但是上面瞎扯了那么多,这个东西到底有什么用呢?
1、Q格式。
简单来说Q格式就是定点计算,有整数位和小数位,比如32位的是 从Q0-Q31,16位的就是从Q0-Q15.
Q后面跟的数越大,代表的是小数位越多,精度越高。首先小数位越多,整数位就越少,能表示的范围变小。而Q格式的转换就是左移和右移,将Q格式变成一致就可以进行运算。
2、浮点数
浮点数很简单,就是平常见到的整数、小数这些,但是在计算机里怎么表示呢?怎么把浮点数变成定点数呢?
使用fixdt(1,32,10);这就变成了Q10。
3、理解下面的程序
那么这个程序怎么理解呢?
首先ADC采样是12位的,通过数据类型转换成32位的,因为采集的是三相,选择模块选择出来的是第一个和第二个,减去2048是定标,左移6位就将12位的数变成了从右起第一位一直到第18位,而第二个数据类型转换里是fixdt(1,32,17),变成Q17.
为什么这么做,首先最大18位,小数点后面17位,全部都是小数。设置的SI格式,范围在0-1之间。
2044/2048=0.9980468
因此我认为fixdt()的作用就是做定点用的,还有就是设定小数位是多少位的。
因篇幅问题不能全部显示,请点此查看更多更全内容