Desempaquetar valores enteros de 16 bits de un campo de 64 bits en MATLAB.
Estoy leyendo datos de un acelerómetro, que proporciona las mediciones para cada uno de los 3 ejes (x, y, z) como enteros de 16 bits empaquetados en un solo campo de 64 bits.
Tengo el siguiente código en C para extraer esos valores de los 3 ejes:
uint8_t byte0 = *algún valor*, byte1 = *algún valor*, byte2 = *algún valor*, byte3 = *algún valor*, byte4 = *algún valor*, byte5 = *algún valor*;
uint64_t xyzDataReg = ((uint64_t) byte0<<40) + ((uint64_t) byte1<<32) + ((uint64_t) byte2<<24) + ((uint64_t) byte3<<16) + ((uint64_t) byte4<<8) + (uint64_t)byte5;
int16_t xRaw = (int16_t)((xyzDataReg >> 32) & 0xFFFF);
int16_t yRaw = (int16_t)((xyzDataReg >> 16) & 0xFFFF);
int16_t zRaw = (int16_t)(xyzDataReg & 0xFFFF);
Pero ahora necesito convertir este código a MATLAB. ¿Cómo escribo estas operaciones de manipulación de bits en MATLAB?
davy.ai
Para extraer los valores de los 3 ejes del campo de 64 bits en MATLAB, se puede utilizar el siguiente código:
Explicación:
bytes
se crea para almacenar los 6 bytes de datos leídos del acelerómetro.xyzDataReg
se calcula utilizando las funcionessum
ybitshift
, que desplazan los bytes a sus posiciones apropiadas y los combinan en un único entero de 64 bits.xRaw
,yRaw
yzRaw
dexyzDataReg
utilizando las funcionesbitand
,bitshift
ytypecast
. Estas operaciones extraen los enteros de 16 bits para cada eje, los extienden con signo a 32 bits (para preservar el signo del valor) y los convierten de una secuencia de bits de nuevo en un entero con signo de 16 bits.Nota: Esto asume que el orden de los bytes es big-endian, por lo que el byte más significativo viene primero. Si el orden de los bytes es little-endian (el byte menos significativo viene primero), es posible que necesite invertir el orden de
bytes
antes de realizar la manipulación de bits.