如何通过给定的分贝值衰减WAV文件?

时间:2009-07-19 02:21:46

标签: audio wav

如果我想将WAV文件的幅度降低25%,我会这样写:

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

然而,我读到的很多关于音频技术的文章都以分贝的形式讨论了振幅。我原则上理解分贝单元的对数性质,但在实际代码方面却没有那么多。

我的问题是:如果我想减少WAV文件的音量,比如20分贝,我会如何在上面的例子中执行此操作?

更新:公式(根据Nils Pipenbrinck的回答)减去给定数量的分贝(输入为正数,例如10,20等):

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 个答案:

答案 0 :(得分:12)

我认为你想要从分贝转换为增益。

音频方程为:

分贝获得:

  gain = 10 ^ (attenuation in db / 20)

或在C:

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

从增益转换为db的公式为:

  attenuation_in_db = 20 * log10 (gain)

答案 1 :(得分:1)

如果您只想调整某些音频,我使用nongnu.org中的normalize包获得了良好的效果。如果你想研究它是如何完成的,源代码是免费提供的。我还使用了wavnorm,其主页似乎已经出现了。

答案 2 :(得分:1)

要考虑的一件事:.WAV文件有许多不同的格式。上面的代码仅适用于WAVE_FORMAT_FLOAT。如果您正在处理PCM文件,那么您的样本将是8,16,24或32位整数(8位PCM使用0..255的无符号整数,24位PCM可以打包或解压缩(打包== 3个字节值彼此相邻打包,解包= = 4字节包中的3个字节值。)

然后还有备用编码的问题 - 例如在Win7中,所有的窗口声音实际上都是WAV容器中的MP3文件。

遗憾的是,它不像听起来那么简单:(。

答案 3 :(得分:1)

哎呀我误解了这个问题......你可以看到我的python实现从dB转换为浮点数(你可以用它作为上面显示的幅度乘数),反之亦然

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

简而言之,它是:

10 ^ (db_gain / 10)

因此,为了将音量减小6 dB,您可以将每个样本的幅度乘以:

10 ^ (-6 / 10)  ==  10 ^ (-0.6)  ==  0.2512