【问题标题】:How to combine two 8-bit numbers to 16-bit in Octave如何在 Octave 中将两个 8 位数字组合为 16 位
【发布时间】:2019-11-11 07:11:01
【问题描述】:

我正在处理来自 GY-87(acc 和陀螺仪传感器模块)的数据,我从它收到的数据格式为 ACCEL_YOUT_HIGH 和 ACCEL_YOUT_LOW,用于 Y 轴,分别指定 HIGH 和 LOW 值。我被告知“高和低寄存器本质上是 8 位的,因此两者的组合将是 16 位有符号数据”。但我真的不知道如何将它们组合成 16 位数据。这是一个示例:ACCEL_YOUT_HIGH=254 ACCEL_YOUT_LOW=144

我已经尝试过 JAVAScript 的方式,但它在 octave 中不起作用。

var number8Bit1 = firstNumber & 0xff;
var number8Bit2 = ((firstNumber >> 8) & 0xff);

【问题讨论】:

  • 那会反过来。 (high << 8) | low 将合并
  • @SamiKuhmonen 但 '
  • 和256相加是一样的,后面可能要补正号
  • 是的,<< 不是 Octave 中的运算符。相反,请使用 bitshift 函数。
  • 或使用类型转换

标签: matlab octave gyroscope


【解决方案1】:

由于您的数据是 16 位签名的,我认为最优雅的解决方案是使用 typecast(正如 Andy 评论的那样)。

为了使 typecast 解决方案正常工作,您需要执行以下操作:

  1. 将每个值转换为uint8
  2. 从两个uint8 元素构建一个数组(把较低的元素放在第一位,因为我们的系统是little-endian
  3. 使用typecast 将两个字节转换为单个int16 元素。
  4. 将结果转换为double(您可以跳过这部分,但这是一种常见的做法——以防您需要对结果应用计算)。

代码示例:

high = 254;
low = 144; 
res = double(typecast([uint8(low), uint8(high)], 'int16'))

结果:

res = -368

如果您想使用纯数学运算(正如 Sami 评论的那样),您可以按以下方式进行:

res = high*256 + low;
if (res >= 2^15)
    res = res - 2^16; %Correct the sign.
end

我觉得它不太优雅,因为if 语句不清楚......


您还可以使用 bitshiftbitortypecast(正如 Cris 评论的那样)。
貌似是C代码res = (short)((high << 8) | low)

res = typecast(uint16(bitor(bitshift(high, 8), low)), 'int16');

我发现它不如第一个解决方案优雅,因为移位和或操作在 MATLAB / Octave 中不自然...

【讨论】:

  • 对于 MATLAB 实现,我肯定会选择 typecast。我怀疑它也将是 3 个选项中最快的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-02-13
  • 1970-01-01
  • 2016-06-01
  • 1970-01-01
  • 2015-06-25
  • 1970-01-01
  • 2013-07-01
相关资源
最近更新 更多