Matlab 如何将两个8位数字组合成16位八度

Matlab 如何将两个8位数字组合成16位八度,matlab,octave,gyroscope,Matlab,Octave,Gyroscope,我正在处理来自GY-87(acc和陀螺仪传感器模块)的数据,我从中收到的数据的形式为ACCEL_YOUT_HIGH&ACCEL_YOUT_LOW,用于Y轴,分别指定高值和低值。我被告知“高寄存器和低寄存器本质上是8位的,因此两者的组合将是16位有符号数据”。但我真的不知道如何将它们组合成16位数据。下面是一个示例:ACCEL_YOUT_HIGH=254 ACCEL_YOUT_LOW=144 我已经尝试过JAVAScript的方式,但它在八度音阶下不起作用 var number8Bit1 = fi

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

我已经尝试过JAVAScript的方式,但它在八度音阶下不起作用

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

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

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

res = high*256 + low;
if (res >= 2^15)
    res = res - 2^16; %Correct the sign.
end
  • 将每个值强制转换为
    uint8
  • 从两个
    uint8
    元素构建一个数组(将较低的元素放在第一位,因为我们的系统
  • 使用
    typecast
    将两个字节转换为单个
    int16
    元素
  • 将结果强制转换为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
    语句不清楚


    您还可以使用、
    bitor
    typecast
    (如Cris所评论)。

    它看起来像是C代码
    res=(short)((high)相反(high@SamiKuhmonen,但“它等于乘以256,然后加上,
    或使用typecast进行MATLAB实现,可能是在yes之后加上符号,
    或使用typecast,我肯定会选择
    typecast
    。我怀疑这也是3个选项中最快的一个。