Matlab 快速数据类型转换 4x1byte 到 1x32byte
Matlab fast data type conversion 4x1byte to 1x32byte
我正在接收将音频样本编码为 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 矩阵(注意不会发生数据复制):
data = reshape(data,3,[]);
添加零字节(这是复制发生的地方):
data = [data;zeros(1,size(data,2),'uint8')];
将矩阵转换为 int32
:
data = typecast(data(:),'int32');
您似乎对符号位做了一些额外的调整。我认为你需要做的是填充不是零字节,而是 0 或 255 字节,具体取决于第三个字节的符号。然后第 3 步变为:
sign = bitget(data(3:3:end),8);
sign = uint8(sign*255);
data = [data;sign,'uint8')];
[注意我实际上没有运行上面的代码,如果我在某处打字错误请告诉我!]
我正在接收将音频样本编码为 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 矩阵(注意不会发生数据复制):
data = reshape(data,3,[]);
添加零字节(这是复制发生的地方):
data = [data;zeros(1,size(data,2),'uint8')];
将矩阵转换为
int32
:data = typecast(data(:),'int32');
您似乎对符号位做了一些额外的调整。我认为你需要做的是填充不是零字节,而是 0 或 255 字节,具体取决于第三个字节的符号。然后第 3 步变为:
sign = bitget(data(3:3:end),8);
sign = uint8(sign*255);
data = [data;sign,'uint8')];
[注意我实际上没有运行上面的代码,如果我在某处打字错误请告诉我!]