6

音声データでバッファのボリュームを増やしたい。ポイントは、私は DirectSound を使用しており、1 つのプライマリ バッファーと 1 つのセカンダリ バッファーを持っているということです。すべてのストリームのミキシングは手動で行われます。ボイス チャットでは、すべての参加者が個別の音量レベルを持つことができます。各ストリーム データに値を掛けて (ゲイン)、1 つのバッファーに合計します。すべて正常に動作しますが、データに 1.0f より大きい値を掛けようとすると、クリッピングなどの音が聞こえます。

Audacity エフェクト コンプレッサーを使用してみましたが、これは奇妙なノイズを減らすのに役立ちません。

おそらく、他の方法でゲインを変更する必要がありますか?それとも、別の後処理アルゴリズムを使用しますか?

更新: うわー、私は興味深いことを発見しました! 音量を上げる前とその直後にオーディオをダンプしました。

これが写真です クリップされたオーディオ

品質については申し訳ありません-それがサウンドの表示方法だと思います(私は自分で赤い線を引きました)。値がサンプル データ型を超えているように見えます。しかし、私はなぜ理解できませんか?私のサンプルバッファは BYTE ですが、短いポインタを介してのみアクセスします。署名されていますが、*ptr が約 15 ~ 20,000 の場合でもクリッピングが発生します。

4

1 に答える 1

8

すべてのサンプルについて、より大きなデータ型に変換します。16ビットの符号付きサンプルがある場合、それらは元々SHORTに適合します。ストリームから抽出し、ローカルのdoubleにキャストし、乗算し、CLIPを実行してから、SHORTにキャストバックします。

それはそのように機能しなければなりません...

必要に応じてコードサンプルを提供することもできます。

編集:

あなたの写真は、乗算の前に大きなタイプに展開しなかったことの正確な証拠です-自動的にラップされるため、SHORTでクリッピング条件を「キャプチャ」することはできません。

short* sampleBuffer;
...
short sample=*sampleBuffer;
double dsample=(double)sample * gain;
if (dsample>32767.0) {dsample=32767.0;}
if (dsample<-32768.0) {dsample=-32768.0;}
*sampleBuffer=(short)dsample;
sampleBuffer++;

そしてもう1つ編集:

複数のボイスがある場合(最初にすべてを2倍にします)、次にそれぞれをゲインし、次にそれらを追加し、最後のステップとしてクリップします。

もう1つの編集(+1は私に刺激を与えています):

ステレオをお持ちの場合は、同じものでも機能します。すべてのサンプルをx2カウントするだけです。

number of shorts = number of samples * 2

于 2010-11-29T14:26:33.677 に答える