Simulink数据类型

时间:2019-03-22 07:17:13

标签: matlab simulink

我正在读取arduino板上的simulink中带有s-function块的IMU(按双或单数据类型),但我只需要2位小数精度为(“ xyz.ab”)。我想通过更改数据类型并对此感到奇怪;

除了使用定点工具外,还有什么方法可以将s功能块中的精度降低到两位小数,或者通过在simulink中添加/使用其他转换块/代码来实现精度?

Sfunctionblock

1 个答案:

答案 0 :(得分:0)

对于真正的定点转移,如Phil的评论所述,定点工具箱是最通用的答案。

但是,为了避免使用工具箱,您还可以设计自己的定点整数格式,并添加一个采用浮点输入并将其转换为整数格式的块(反之亦然)。

例如如果您知道范围是327.68

y = int16(u * 100.0);

将输入转换为S功能。 在输出上将是反转

y = double(u)/100.0;

(可以通过使用乘法,除法和转换块来避免使用Eml / matlab功能代码。)

但是,请注意可用位,并且缩放(*,/)操作是在浮点而不是整数上完成的。

2 ^(nrOfBits-1)-1向您显示可以表示的范围,包括签名。对于uint8 / 16/32无符号类型,范围为2 ^(nrOfBits)-1。然后,您可以使用缩放比例将可表示的位调整为您使用的浮点范围。缩放范围除以2 ^ nrOfBits将告诉您分辨率是多少(步长为多少)。

转到这种类型的整数接口时,您还需要在Arduino端相应地缩放变量。 (我假设您可以访问该代码-否则,将很难使用除已提供的接口之外的任何其他接口)

请注意,intXX(doubleVar * scale)将始终将值截断为整数。如果需要适当的舍入,还应该包括舍入功能,例如:

int16(round(doubleVar * scale));

您不需要使用以10为基数的刻度,可以使用任何比例和偏移量,但是如果您保持以10为基数(例如0.1 10.0 100.0 1000.0等),则手动确定数字会更容易。

最后一点,如果Arduino代码接口是浮点(单/双)并且不能更改为整数类型;由于完整的浮点数无论如何都会被传递,因此从小数点后舍入不会得到任何加速。即使您确实设法使用整数来减少数据量,但我怀疑除非您传输大量数据,否则这可能不会大大提高速度。无论如何,接口代码的开销将相对较大。

祝您的项目好运!