es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para extraer los valores de los 3 ejes del campo de 64 bits en MATLAB, se puede utilizar el siguiente código:

    bytes = [byte0, byte1, byte2, byte3, byte4, byte5];
    xyzDataReg = uint64(sum(bitshift(uint64(bytes), [40 32 24 16 8 0])));
    xRaw = typecast(bitshift(bitand(xyzDataReg, uint64(hex2dec('FFFF0000'))), -32), 'int16');
    yRaw = typecast(bitshift(bitand(xyzDataReg, uint64(hex2dec('0000FFFF0000'))), -16), 'int16');
    zRaw = typecast(bitand(xyzDataReg, uint64(hex2dec('00000000FFFF'))), 'int16');
    

    Explicación:

    • El vector bytes se crea para almacenar los 6 bytes de datos leídos del acelerómetro.
    • La variable xyzDataReg se calcula utilizando las funciones sum y bitshift, que desplazan los bytes a sus posiciones apropiadas y los combinan en un único entero de 64 bits.
    • Luego, se extraen las variables xRaw, yRaw y zRaw de xyzDataReg utilizando las funciones bitand, bitshift y typecast. 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.

Comments are closed.