【问题标题】:Matlab fast data type conversion 4x1byte to 1x32byteMatlab 快速数据类型转换 4x1byte 到 1x32byte
【发布时间】:2018-05-25 17:37:28
【问题描述】:

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

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

为此,我编写了以下函数,其中inputuint8 类型的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

可以使用以下 sn-ps 运行示例:

    % 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 函数?

谢谢

【问题讨论】:

    标签: matlab performance type-conversion 32-bit 24-bit


    【解决方案1】:

    我的工作方式如下:

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

      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 字节填充,具体取决于第三个字节的符号。第三步就变成了:

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

    [注意我并没有实际运行上面的代码,如果我在某处打错了请告诉我!]

    【讨论】:

    • 感谢克里斯,这要快得多!我唯一需要更改的是第 4 步,因为 typecast 只能接受标量或向量输入:data = typecast(data(:), 'int32')
    • @TheSuperLemming :谢谢,我已经修复了帖子以供将来参考。
    猜你喜欢
    • 2010-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-26
    相关资源
    最近更新 更多