Matlab быстрое преобразование типов данных 4x1 байта в 1x32 байта - PullRequest
0 голосов
/ 25 мая 2018

Я получаю пакеты двоичных данных, кодирующих аудиосэмплы в виде 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, которая может обрабатывать более эзотерические преобразования типов данных?

Спасибо

1 Ответ

0 голосов
/ 25 мая 2018

Я бы работал следующим образом:

  1. Заполните ваш uint8 буфер как можно большим количеством непрерывных 3-байтовых значений:

    data = uint8([255 0 0 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3]);
    
  2. Преобразуйте матрицу в матрицу 3xN (обратите внимание, что копирование данных не происходит):

    data = reshape(data,3,[]);
    
  3. Добавьте нулевые байты (это место, где происходит копирование):

    data = [data;zeros(1,size(data,2),'uint8')];
    
  4. Приведите матрицу к int32:

    data = typecast(data(:),'int32');
    

Вы, кажется, делаете некоторые дополнительные настройки с битом знака.Я думаю, что вам нужно сделать там пэд не с нулевым байтом, а с 0 или 255 байтом, в зависимости от знака третьего байта.Шаг 3 становится следующим:

sign = bitget(data(3:3:end),8);
sign = uint8(sign*255);
data = [data;sign,'uint8')];

[Примечание. Я не запускал приведенный выше код, пожалуйста, дайте мне знать, если я где-то сделал опечатку!]

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