4

したがって、-1から+1の範囲のフロートを、次のように設定されたストリーム形式のAUGraphで期待される形式に適切にスケーリングしたいと思います。

size_t bytesPerSample = sizeof (AudioUnitSampleType); // is 4 bytes

stereoStreamFormat.mFormatID          = kAudioFormatLinearPCM;
stereoStreamFormat.mFormatFlags       = kAudioFormatFlagsAudioUnitCanonical;
stereoStreamFormat.mBytesPerPacket    = bytesPerSample;
stereoStreamFormat.mFramesPerPacket   = 1;
stereoStreamFormat.mBytesPerFrame     = bytesPerSample;
stereoStreamFormat.mChannelsPerFrame  = 2;                    
stereoStreamFormat.mBitsPerChannel    = 8 * bytesPerSample;
stereoStreamFormat.mSampleRate        = graphSampleRate; // 44.1k

この質問はグラフの設定に役立ちましたが、次のようにフロートをキャストすると、次のようになります。

sampleValueLeft = (Fixed) (floatVal * 32767.0f); 
// there doesn't seem to be any difference whether i cast into 
// SInt16 or SInt32 (which the Fixed type is defined to be)..

それは機能し、信号は良い音に聞こえますが、非常に静かです。だから私はスケーリングを間違っていますか?より大きな数でスケーリングすると、信号が台無しになります。クリッピングのように聞こえず、出力音量が高くなりません。固定小数点演算を深く研究するつもりはありません。必要なのは、適切な形式にキャストするワンライナーだけです。

ありがとう!

編集:私は別のストリーム形式を使用していましたが、それ以前はステレオ信号で適切に使用する方法を理解できませんでした。この異なる設定では、出力ボリュームに問題はありませんでした。したがって、ゲインの問題はスケーリングに関係しているに違いないと思います...

4

2 に答える 2

5

この投稿を読んでください、それはiOS8.24フォーマットに関する本当に良い説明です。

その結論は次のとおりです。
基本的に、最初の(左)8ビットは(+/-)記号専用であり、残りの24ビットはサウンドであることがわかります。
したがって、Sint16に変換する場合は、ビットを9桁右にシフトしてキャストします。このようにして、(+/-)記号が最初のビットとして保持され、サウンドデータの精度が低下します。
(+/-)1から0の範囲のフロートとして使用する場合は、可能な最大値である32768で除算します。

コードは次のとおりです。

    SInt16 sampleInt16 = (SInt16)(samples[i] >> 9);
    float sampleFloat = sampleInt16 / 32768.0;
于 2013-05-21T07:36:28.863 に答える
3

私は8.24が嫌いです。なぜなら、それを使って数学を行うための便利な関数がないと思うからです。

反対提案:グラフの前にコンバーターユニット(AUConverter)を配置し、入力ASBDを16ビットintなどのより便利なものに設定します(私は常にiOSでintを使用します... floats mayコンバーターに入る作業ですが、私はそれを当てにしません)。コンバーターの出力をASBDに設定しないでください。デフォルトでは、Audio Unit Canonical(8.24)になります。実際、AUConverterを使用せずに最初のユニットに便利なASBDを設定できるかどうかを確認してください。

于 2011-06-04T15:18:47.857 に答える