Я получаю пакеты двоичных данных, кодирующих аудиосэмплы в виде 24-битных целых чисел без знака.Для вывода их необходимо преобразовать в 32-битные целые числа со знаком (2 дополнения).
Однако из-за способа разбиения данных на части можно разделить 24-битное слово по границе пакета.Поэтому я буферизую каждый байт как 8-битное целое число без знака, готовое к преобразованию в группы по 3 (+ 1 байт заполнения нулями), когда все пакеты будут получены.
Я написал следующую функцию, чтобы сделать этогде input
является массивом 1x3 типа uint8
:
% This function takes 3 8-bit decimal values as input and converts them to
% a single, signed, 32 bit decimal number.
% NOTE - little endianness is assumed
function output = convert24bitTo32bit(input)
sign = bitget(input(3), 8); % get sign bit
bytes(3) = bitset(input(3), 8, 0); % zero sign bit
value = typecast([bytes, uint8(0)], 'int32') - logical(sign)*(2^23);
end
Пример может быть выполнен с использованием следующих фрагментов:
% Test 255: 11111111 00000000 00000000
input = uint8([255 0 0]);
output = convert24bitTo32bit(input);
fprintf('\n In: 255 \t Out: %d', output)
% Test -2: 01111111 11111111 11111111
input = uint8([254 255 255]);
output = convert24bitTo32bit(input);
fprintf('\n In: -2 \t Out: %d', output)
Эта функция выполняет работу, носамый медленный процесс в моей обработке на несколько порядков.
Есть ли более эффективный способ достижения того же результата?Или встроенная функция Matlab, которая может обрабатывать более эзотерические преобразования типов данных?
Спасибо