我收到了编码音频样本的二进制数据包,这些样本以24位无符号整数的形式呈现。这些数据需要转换为32位有符号(2的补码)整数进行输出。
然而,由于数据被分块的方式,可能会出现24位字跨越数据包边界的情况。因此,我将每个字节作为8位无符号整数缓存,以便在接收到所有数据包后,将其重新组合成3个一组(+1个填充字节)。
我编写了以下函数来执行此操作,其中“input”是一个类型为“uint8”的1x3数组:
可以使用以下代码片段来运行示例:
然而,由于数据被分块的方式,可能会出现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内置的函数可以处理更神秘的数据类型转换?
谢谢。
data = typecast(data(:), 'int32')
- TheSuperLemming