Matlab快速数据类型转换4x1字节到1x32字节

Matlab快速数据类型转换4x1字节到1x32字节,matlab,performance,type-conversion,32-bit,24-bit,Matlab,Performance,Type Conversion,32 Bit,24 Bit,我正在接收二进制数据包,将音频样本编码为24位无符号整数。这些需要转换为32位有符号(2的补码)整数进行输出 然而,由于数据分块的方式,24位字有可能跨数据包边界分割。因此,我将每个字节作为一个8位无符号整数进行缓冲,准备在收到所有数据包后,以3(+1字节的零填充)为一组进行重铸 为此,我编写了以下函数,其中input是类型为uint8的1x3数组: % This function takes 3 8-bit decimal values as input and converts th

我正在接收二进制数据包,将音频样本编码为24位无符号整数。这些需要转换为32位有符号(2的补码)整数进行输出

然而,由于数据分块的方式,24位字有可能跨数据包边界分割。因此,我将每个字节作为一个8位无符号整数进行缓冲,准备在收到所有数据包后,以3(+1字节的零填充)为一组进行重铸

为此,我编写了以下函数,其中
input
是类型为
uint8
的1x3数组:

    % 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函数,可以处理更深奥的数据类型转换


谢谢

我的工作如下:

  • 用尽可能多的连续3字节值填充
    uint8
    缓冲区:

    data = uint8([255 0 0 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3]);
    
  • 将矩阵重塑为3xN矩阵(注意:不会发生数据复制):

  • 添加零字节(这是进行复制的地方):

  • 将矩阵强制转换为
    int32

    data = typecast(data(:),'int32');
    
  • 您似乎对符号位做了一些额外的调整。我认为你需要做的不是用零字节,而是用0或255字节,这取决于第三个字节的符号。然后,步骤3变为:

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

    [请注意,我还没有实际运行上述代码,如果我在某个地方打错了,请告诉我!]

    谢谢克里斯,这会更快!我唯一需要更改的是步骤4,因为
    typecast
    只能接受标量或向量输入:
    data=typecast(data(:),'int32')
    @superlemming:谢谢,我已经修复了这篇文章,以备将来参考。
    data = typecast(data(:),'int32');
    
    sign = bitget(data(3:3:end),8);
    sign = uint8(sign*255);
    data = [data;sign,'uint8')];