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