4

私は ffmpeg からのサンプルを持っています。非常に多くの場合、16 ビット サンプル (ショート タイプ) です。ここで説明されているように、dbGain で IIR バンドパス フィルターを使用しまし た。計算されたサンプル値は 32767/-32767 から出て、オーディオ pcm サンプル クリッピングを回避する方法です。アプローチが存在する可能性がありますか?

私はグーグルで検索しましたが、実際の例は見つかりませんでしたか?

アップデート

伝達関数の計算結果を整数にキャストし、オーバーフローをチェックすると、ノイズが引き続き発生します::

int result = A1 * ((int) Rx) + A2 * ((int) Rxx) + A3 * ((int) Rxxx)
                    - B1 * ((int) Ryy) - B2 * ((int) Ryyy);
if (result > 32767)
    result = 32767;
if (result < -32700)
    result = -32700;
y = (short) result;
4

1 に答える 1

2

16 ビットの PCM サンプルは [-32768..+32767] の範囲内である必要があります。入力信号に数学 (この場合はバイカッド フィルター) を適用すると、出力が範囲内にとどまることが保証されません。これは、正のゲインを適用している場合に避けられない結果です。

この種の処理では、範囲の境界に到達することは自然な副作用であるため、いずれかのアプローチを使用して対処する必要があります (リストがいっぱいになることは想定されていません)。

  • 入力信号が十分に静かであることを確認するか、値を数ビット右にシフトして、出力の大きな値に余裕を持たせます。
  • 24 ビット PCM など、出力信号に高いビット数を使用する
  • 出力信号に浮動小数点 PCM を使用して、PCM サンプル範囲外に出ると精度が失われる
于 2012-12-19T09:06:33.640 に答える