3

オーディオ サンプルを 24 ビット符号なし整数としてエンコードするバイナリ データのパケットを受信して​​います。これらは、出力用に 32 ビットの符号付き (2 の補数) 整数に変換する必要があります。

ただし、データがチャンク化される方法により、24 ビット ワードがパケット境界を越えて分割される可能性があります。したがって、各バイトを 8 ビットの符号なし整数としてバッファリングし、すべてのパケットが受信されたときに 3 つのグループ (+ ゼロ パディングの 1 バイト) で再キャストできるようにします。

これを行うために、次の関数を作成しました。ここで、inputは type の 1x3 配列ですuint8

    % 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 関数ですか?

ありがとう

4

1 に答える 1

1

私は次のように働きます:

  1. uint8できる限り多くの連続した 3 バイト値でバッファーを埋めます。

    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 バイトではなく、3 番目のバイトの符号に応じて 0 または 255 バイトでパディングすることだと思います。ステップ 3 は次のようになります。

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

[上記のコードを実際に実行していないことに注意してください。どこかでタイプミスをした場合はお知らせください!]

于 2018-05-25T17:49:50.493 に答える