如果我想将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 。
答案 0 :(得分:12)
我认为你想要从分贝转换为增益。
音频方程为:
分贝获得:
gain = 10 ^ (attenuation in db / 20)
或在C:
gain = powf(10, attenuation / 20.0f);
从增益转换为db的公式为:
attenuation_in_db = 20 * log10 (gain)
答案 1 :(得分:1)
答案 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