9

如果我想将 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

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

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

然后是替代编码的问题 - 例如在 Win7 中,所有 Windows 声音实际上都是 WAV 容器中的 MP3 文件。

不幸的是,这并不像听起来那么简单:(。

于 2009-07-21T02:06:32.167 回答
1

如果您只是想调整一些音频,我使用nongnu.org. 如果您想研究它是如何完成的,源代码是免费提供的。我也用过wavnorm,其主页目前似乎已发布。

于 2009-07-19T03:11:22.823 回答
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
于 2012-12-05T22:31:50.487 回答