オーディオ サンプルを 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 関数ですか?
ありがとう