Как преобразовать 18-битные два дополнения в число с плавающей запятой, используя Java - PullRequest
0 голосов
/ 03 декабря 2018

Данные загружаются 18-разрядным АЦП.Одна информация разбита на три байта, а последние 6 битов бесполезны.Опорное напряжение 1 вольт, это означает, что 0x1FFFF представляет 1 и 0x3FFFF представляет -1.Как конвертировать 18-битные дополнения в поплавок с помощью Java.Я написал один, и он работает, но я думаю, что он недостаточно эффективен.У меня ужасная ява.

    float data;
    int value = ((byte0 & 0xff) << 10) | ((byte1 & 0xff) << 2) | ((byte2 & 0xff) >> 6); // combine 3 bytes into int  
    int tmp = value & 0x2000;   // judge positive or negative

    if (tmp != 0) {
        value = value - 262144 /* 2^18 */;
        data = ((float)value) * 2 / 262143 /* 2^18-1 */;
    } else {
        data = ((float)value) * 2 / 262143;
    }

Ответы [ 2 ]

0 голосов
/ 03 декабря 2018

Поместите знаковый бит АЦП в то же место, что и знаковый бит 32-разрядного целого числа, и вы можете упростить использование родного знака.

public static final float ADC_RANGE = 1.0f; // From -1V to +1V
public static final int   ADC_BITS  = 18;
public static final int   ADC_RANGE = 1 << (ADC_BITS - 1);
public static final int   ADC_MASK  = (ADC_RANGE - 1) << (32 - ADC_BITS);

    int bits = ((byte0 & 0xFF) << 24) | ((byte1 & 0xFF) << 16) | ((byte2 & 0xC0) << 8); // Combine 3 bytes into int, left-aligned
    float value = bits / (float)ADC_MASK * ADC_RANGE;

[править] использовать константы для 'магические числа '

0 голосов
/ 03 декабря 2018

Вы можете попробовать

double data = (value << 14) / (double) (0x1FFFF << 14);

При этом будет использоваться смещенное 32-битное значение дополнения 2 с.

ПРИМЕЧАНИЕ. Если это было дополнение 2 с, 0x3ffff должно быть наименьшим отрицательным числом, и0x20000 - самое большое отрицательное число.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...