Simulink 数据类型
Simulink data types
我正在通过双精度或单数据类型在 simulink 中读取带有 s 函数块的 arduino 板上的 IMU,尽管我只需要 2 位小数精度("xyz.ab")。我想改进改变数据类型的性能并想知道;
有没有办法在 s-function 块中或通过 adding/using 除了使用定点工具之外的任何其他转换 blocks/codes 将精度降低到 2 位小数?
对于真正的定点传输,定点工具箱是最通用的答案,如 Phil 的评论所述。
但是,为了避免使用工具箱,您还可以设计自己的定点整数格式并添加一个接受浮点输入并将其转换为整数格式(反之亦然)的块。
例如如果您知道范围是 327.68 < var < 327.67,您可以将浮点数定义为 int16 除以 10。在 matlab 函数块中,您只需说
y=int16(u*100.0);
将输入转换为 S-Function。
在输出上它将是一个反转
y=double(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代码接口是浮点型(single/double),不能改成整型;你不会从四舍五入的小数点得到任何加速,因为完整的浮点数无论如何都会被传输。即使您确实设法使用整数减少了一点数据,我怀疑除非您传输大量数据,否则这可能不会带来巨大的加速。反正接口代码会有比较大的开销
祝你项目顺利!
我正在通过双精度或单数据类型在 simulink 中读取带有 s 函数块的 arduino 板上的 IMU,尽管我只需要 2 位小数精度("xyz.ab")。我想改进改变数据类型的性能并想知道;
有没有办法在 s-function 块中或通过 adding/using 除了使用定点工具之外的任何其他转换 blocks/codes 将精度降低到 2 位小数?
对于真正的定点传输,定点工具箱是最通用的答案,如 Phil 的评论所述。
但是,为了避免使用工具箱,您还可以设计自己的定点整数格式并添加一个接受浮点输入并将其转换为整数格式(反之亦然)的块。
例如如果您知道范围是 327.68 < var < 327.67,您可以将浮点数定义为 int16 除以 10。在 matlab 函数块中,您只需说
y=int16(u*100.0);
将输入转换为 S-Function。 在输出上它将是一个反转
y=double(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代码接口是浮点型(single/double),不能改成整型;你不会从四舍五入的小数点得到任何加速,因为完整的浮点数无论如何都会被传输。即使您确实设法使用整数减少了一点数据,我怀疑除非您传输大量数据,否则这可能不会带来巨大的加速。反正接口代码会有比较大的开销
祝你项目顺利!