Matlab快速数据类型转换:将4个字节的数据类型转换为1个32位的字节。

3
我收到了编码音频样本的二进制数据包,这些样本以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内置的函数可以处理更神秘的数据类型转换?

谢谢。

1个回答

1
我会按照以下方式工作:

  1. Fill your uint8 buffer with as many contiguous 3-byte values as you can:

    data = uint8([255 0 0 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3]);
    
  2. Reshape the matrix into a 3xN matrix (note no data copy happens):

    data = reshape(data,3,[]);
    
  3. Add the zero bytes (this is where a copy happens):

    data = [data;zeros(1,size(data,2),'uint8')];
    
  4. Cast the matrix to int32:

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

您似乎对符号位进行了一些额外的调整。我认为您需要在那里填充的不是零字节,而是0或255字节,具体取决于第三个字节的符号。然后,第3步变为:

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

[请注意,我并没有实际运行上面的代码,请让我知道如果我在哪里打错了!]


谢谢Cris,这快多了!我唯一需要更改的是第四步,因为“typecast”只能接受标量或向量输入:data = typecast(data(:), 'int32') - TheSuperLemming
@TheSuperLemming:谢谢,我已经修复了这篇文章以备将来参考。 - Cris Luengo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接