首页 > 解决方案 > Simulink 数据类型

问题描述

我正在通过双或单数据类型在 arduino 板上读取带有 s-function 块的 arduino 板上的 IMU,尽管我只需要 2 位小数精度(“xyz.ab”)。我想通过更改数据类型来提高性能并想知道;

除了使用定点工具之外,有没有办法将 s-function 块中的精度降低到小数点后 2 位,或者在 simulink 中添加/使用任何其他转换块/代码?

功能块

标签: matlabsimulink

解决方案


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

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

例如,如果您知道范围是 327.68 < var < 327.67,您可以将浮点数定义为 int16 除以 10。在 matlab 函数块中,您只需说

y=int16(u*100.0);

将输入转换为 S 函数。在输出上,这将是一个逆转

y=双(u)/100.0;

(使用乘法、除法和转换块可以避免使用 Eml/matlab 函数代码。)

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

2^(nrOfBits-1)-1 显示您可以表示的范围,包括标牌。对于无符号类型 uint8/16/32,范围是 2^(nrOfBits)-1。然后,您使用缩放将可表示位适合您使用的浮点范围。缩放范围除以 2^nrOfBits 将告诉您分辨率是多少(步长有多大)。

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

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

int16(round(doubleVar*scale));

您不需要使用以 10 为底的比例,可以使用任何缩放和偏移量,但如果您保持以 10 为底(即 0.1 10.0 100.0 1000.0 等),手动计算数字会更容易。

最后一点,如果 Arduino 代码接口是浮点(单/双)并且不能更改为整数类型;您不会从四舍五入中获得任何加速,因为无论如何都会传输完整的浮点数。即使您确实设法使用整数减少了一点数据,我怀疑这可能不会带来巨大的加速,除非您传输大量数据。无论如何,接口代码都会有比较大的开销。

祝你的项目好运!


推荐阅读