1

私の質問はこの質問に関連していますが、逆です。

UInt32(オーディオフレーム)を2つのSInt16(左と右)に分割しますか?

上記のリンクでは、opは32ビットフレームを2つの16ビットサンプル(左と右)に分割したいと考えていました。

2つの16ビットサンプルがあり、それらを単一の32ビットインターリーブフレームとして表現したいと思います。

私がこれまでに試みたことはこのように見えます。

UInt32* ar = malloc(totalFramesInFile * sizeof (ar));

for (int b=0; b < totalFramesInFile; b++)
{
  UInt32 l = soundStructArray[audioFile].audioDataLeft[b];
  UInt32 r = soundStructArray[audioFile].audioDataRight[b];

  UInt32 t = (UInt32) l + r;

  ar[b] = t;
}
soundStructArray[audioFile].audioData = ar;

これは合法で正しいですか?経験が浅いのでわかりません。私のオーディオ出力は少し奇妙に聞こえます、そして私は除去のプロセスによって何が悪いのかを決定しようとしています。

誰かが私がしていることが2つの16ビットサンプルを32ビットフレームとして表現する正しい方法であることを確認するか、正しい方法を提案することができれば役に立ちます。

自分のやったことが間違っているような気がします。これは、32ビットフレームの最初の16ビットを左に、次の16ビットを右にする必要があるためだと思います。全部が2つの合計であってはならない……と思います。

4

2 に答える 2

4

変更する必要があります::

UInt32 t = (UInt32) l + r;

に:

UInt32 t = (l << 16) | (r & 0xffff);

これによりl、最上位 16 ビットと最下位 16 ビットがt挿入されrます。

詳細な説明

バイナリで次のように見える2 つの 16 ビット サンプルlおよびがある場合:r

l: LLLLLLLLLLLLLLLL
r: RRRRRRRRRRRRRRRR

まず、それらを 32 ビットに拡張しましょう。

l: 0000000000000000LLLLLLLLLLLLLLLL
r: 0000000000000000RRRRRRRRRRRRRRRR

l次に、16 ビット左にシフトしましょう( l << 16)

l: LLLLLLLLLLLLLLLL0000000000000000
r: 0000000000000000RRRRRRRRRRRRRRRR

次に、それらをOR ( |) します。

t: LLLLLLLLLLLLLLLLRRRRRRRRRRRRRRRR

ほら!これで、後で簡単に抽出できる 32 ビット値に結合されましたlr

于 2010-11-26T08:55:58.753 に答える
2

これは Paul R の回答を補足するものとして取り上げますが、コメントするには少し長すぎました。

より「明白」な代替ソリューションは、32 ビット値で上位または下位の 16 ビット値を明示的に設定することです。ユニオンでこれを行うことができます。

typedef union {
    struct {
        SInt16 high;
        SInt16 low;
    } parts;
    UInt32 word;
} IntConverter;

使用法:

IntConverter * ar = malloc(totalFramesInFile * sizeof (IntConverter));

for (int b=0; b < totalFramesInFile; b++)
{
    ar[b].parts.high = soundStructArray[audioFile].audioDataLeft[b];
    ar[b].parts.low = soundStructArray[audioFile].audioDataRight[b];
}
soundStructArray[audioFile].audioData = (UInt32 *) ar;

ただし、このアプローチでは、データが実際にメモリに格納される方法に依存するため、基礎となるプラットフォームについてもう少し知る必要があります。ただし、ターゲット プラットフォームとコンパイラによっては、より効率的な場合があります。

于 2010-11-26T11:06:39.980 に答える