matlab - Simulink 数据类型
问题描述
我正在通过双或单数据类型在 arduino 板上读取带有 s-function 块的 arduino 板上的 IMU,尽管我只需要 2 位小数精度(“xyz.ab”)。我想通过更改数据类型来提高性能并想知道;
除了使用定点工具之外,有没有办法将 s-function 块中的精度降低到小数点后 2 位,或者在 simulink 中添加/使用任何其他转换块/代码?
解决方案
对于真正的定点转移,定点工具箱是最通用的答案,如 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 代码接口是浮点(单/双)并且不能更改为整数类型;您不会从四舍五入中获得任何加速,因为无论如何都会传输完整的浮点数。即使您确实设法使用整数减少了一点数据,我怀疑这可能不会带来巨大的加速,除非您传输大量数据。无论如何,接口代码都会有比较大的开销。
祝你的项目好运!
推荐阅读
- ios - 使用 MPMediaPlayer Swift 4 淡化(动画)音量
- node.js - 如何从我的 package.json 文件启动主 index.js
- arrays - 从数组的参数创建案例类
- ios - 使用 Flutter 的 Cupertino 小部件,如何在底部标签栏顶部触发水平页面转换
- java - java是否在内部创建了持有main方法的类的对象?
- c# - Unity3D - 如何为我的对象池预实例化创建加载栏?
- javascript - 通过 JavaScript 附加的 HTML 不会触发 jQuery on('click') 功能
- ffmpeg - Ffmpeg - 多重叠加 - 错误在哪里?
- mysql - MySQL触发器检查插入是否成功
- blockchain - 为什么我的 ocm_cpuminer.exe 黑屏上的所有这些命令是什么意思?