分贝 Decibel
分贝(dB)是一个对数单位(logarithmic unit), 表示的是两个相同单位物理量的比值。
作为分母的那个量通常是一个基准值,分贝描述的就是作为分子的物理量相对于这个基准值的大小。
分贝经常用来描述声音,如超过50dB的噪声就会影响人的睡眠和休息,但分贝不仅仅用来描述声音,它还被用来描述电子学等其他领域的物理量,如描述信号强度的衰减 、信噪比等等。本文主要介绍分贝如何描述声音的信号的强弱。
模拟信号下的db测量
用来描述声音强度的物理量有很多:声压,功率,产生声音信号的电压等,使用不同的物理量来表示声音的强度,其得到的分贝也是不同的。
dB(dBSPL)
声音本质上来说是一种波,通过空气传播,传到人耳朵里引发鼓膜的振动。所以,声音的大小,实际就是对这种振动强度的反映。而由于空气的振动会引起大气压强的变换,可以使用压强变化的程度来描述声音的大小,这就是“声压(SPL,Sound Pressure Levels)”概念,其单位是Pa。例如:1米外步枪射击的声音大约是7000Pa;10米外开过汽车大约是0.2Pa。声压和声音大小的关系,可以使用如下公式表示
其中,I是声音的强度;P是声压;ρ是空气阻力,通常在室温下,空气阻力大约是400。
由于声音大小的变化幅度太大,所以需要变换到log域来比较大小。使用声压作为测量量的分贝就是dBSPL,通常用来表示声音大小的dB多指的就是dBSPL。
分贝的计算还需要一个选择一个特定的声压值作为“标准值”(0分贝),该值是固定的。有了这个基准值后代入上面的公式:
其中,P是声压测量值;Pref是标准值(0dBSPL)。
这里选择的声压标准值为2×10−5Pa,20μPa,是人耳在1KHz这个频率下能听到的最小的声音,大致相当于3米外一只蚊子在飞的声音。将标准值代入上式:
数字信号下的db测量
在数字时代音频分贝的表示是dBFS。dBFS的全称为Decibels Full Scale,全分贝刻度,是数值音频分贝值的表示方法。和前面不一样的时,dBFS的基准并不是最小的或者是中间的某一个值,是最大的那个值!也就是说0dBFS是数字设备能达到的最大值,除了最大值外都是负值。
db(FS)
以数字音频的sample为16位有符号(short类型)为例,16位的无符号的最大值为32768,因此dBFS的计算公式:
这样,最小的dBFS为:
也就是说16位有符号音频的动态范围为0 ~ -90dBFS。
音量减半则db值需要调多少?
当你把声音大小减半,则db值需要减少6db,为什么呢?
回顾公式2和公式3可以得出如下结论:
假设X是音量大小的变化量,Y是db大小的变化量,则X和Y的关系是:
所以,如果声音大小减半,相当于 sample 变为 sample/2,则db值的变化为:20*log(1/2) = -6
。下面是对应C代码的实现:
//根据声音的增减系数返回对应db增减值
static float getSoundScaleByDB(float db){ return powf(10.0f,db/20.0f);}
//根据db增减值返回声音对应增减系数
static float getDBBySoundSCale(float scale){return 20.0f * log( fmax(1e-6f,scale) );}
db值随音量大小变化的情况如下图所示:
如果对两个相同的声音做加法则db值会提高多少?
增加3 dB? 或者增加6 dB?
欢迎你在评论区给出正确答案!