9

WAVファイルの振幅を25%減らしたい場合は、次のように記述します。

for (int i = 0; i < data.Length; i++)
{
    data[i] *= 0.75;
}

ただし、オーディオテクニックについて読んだ記事の多くは、振幅をデシベルで説明しています。私は原則としてデシベル単位の対数的性質を理解していますが、実際のコードに関してはそれほど理解していません。

私の質問は、WAVファイルのボリュームをたとえば20デシベルだけ減衰させたい場合、上記の例のようなコードでこれをどのように行うのでしょうか。

更新:指定されたデシベル数(10、20などの正の数として入力)で減衰するための式(Nils Pipenbrinckの回答に基づく):

public void AttenuateAudio(float[] data, int decibels)
{
    float gain = (float)Math.Pow(10, (double)-decibels / 20.0);
    for (int i = 0; i < data.Length; i++)
    {
        data[i] *= gain;
    }
}

したがって、 20デシベルだけ減衰させたい場合、ゲイン係数は.1です。

4

4 に答える 4

12

デシベルからゲインに変換したいと思います。

オーディオの方程式は次のとおりです。

獲得するデシベル:

  gain = 10 ^ (attenuation in db / 20)

またはCで:

  gain = powf(10, attenuation / 20.0f);

ゲインからデシベルに変換する式は次のとおりです。

  attenuation_in_db = 20 * log10 (gain)
于 2009-07-19T02:34:48.187 に答える
1

オーディオを少しだけ使いたい場合は、のnormalizeパッケージで良い結果が得られましたnongnu.org。それがどのように行われるかを研究したい場合は、ソースコードを無料で入手できます。私も使ったことがwavnormありますが、そのホームページは現在公開されているようです。

于 2009-07-19T03:11:22.823 に答える
1

考慮すべきことの1つ:.WAVファイルには多くの異なる形式があります。上記のコードは、WAVE_FORMAT_FLOATに対してのみ機能します。PCMファイルを扱っている場合、サンプルは8、16、24、または32ビット整数になります(8ビットPCMは0..255の符号なし整数を使用し、24ビットPCMはパックまたはアンパックできます(packed == 3バイト値が隣り合ってパックされ、アンパック== 4バイトパッケージの3バイト値)。

そして、代替エンコーディングの問題があります。たとえば、Win7では、すべてのWindowsサウンドは実際にはWAVコンテナ内のMP3ファイルです。

残念ながら、思ったほど単純ではありません:(。

于 2009-07-21T02:06:32.167 に答える
1

おっと、私は質問を誤解しました…dBからfloat(上記のように振幅の乗数として使用できます)に変換するPythonの実装を見ることができます。

https://github.com/jiaaro/pydub/blob/master/pydub/utils.py

一言で言えば、それは:

10 ^ (db_gain / 10)

したがって、音量を6 dB減らすには、各サンプルの振幅に次の値を掛けます。

10 ^ (-6 / 10)  ==  10 ^ (-0.6)  ==  0.2512
于 2012-12-05T22:31:50.487 に答える