问题引入
分析音频文件过程中,发现16bit的PCM文件,采样值显示为2900,Audition上分贝却显示为-21dB,为啥?
本着知其然,更要知其所以然的原则,进行了一番查阅分析。原来,dB的d即“分”(deci-)指十分之一,B即贝,是贝尔的缩写(bel,纪念发明家亚历山大·格拉汉姆·贝尔)。
那为什么好好的线性域不用,要用10倍对数域呢?显而易见的好处是便于表示有小间隔内,数值的量级动态范围大,数值太大无法直观比较,转换到对数域10倍/20倍对数,用更小的数来表达,便于人们直观比较。
核心公式
根据维基百科定义,分贝dB的转换公式为:
- 能量/功率:
10lg(Ps / Pn)
- 采样值/幅值:
20lg(Prms / Pref)
我被这两个公式给迷糊住了,有时候是用第一种,如求SNR信噪比,有时候又是用的第二种,如电路中电压。
分析公式可知,核心来自于10lg(Ps / Pn)
,由于它是能量的比值或者由功率比定义的,10倍时用的是功率比,即数值的平方。如果我们不想求能量,想直接从幅值单位来处理的话,就需要调整下公式,推导过程如下:
10lg(Ps / Pn)
= 10lg(Val^2 / Ref^2)
= 10lg((Val / Ref)^2)
= 20lg(Val / Ref)
= 20lg(Prms / Pref)
于是,就能得到采样值/幅值的比值时,对应的dB转换公式。所以,我们也就知道了前文两个公式的用途:
- 功率比、能量比场景,用10lg
- 声压、电压、数字成像、采样值、幅值等,用20lg
问题回答
说回初始问题,那么现在PCM文件中采样值到dB分贝是如何转换的呢?
过程如下:
- 日常生活中常见Pref是以最小幅值为参考,Pref=1
- PCM中,以最大幅值作为Pref,则最大db为0,最小为负无穷
- 其中,0db上下分布的都是负db,上部对应的是幅值为正,下部对应的是幅值为负
- PCM中,统一将采样值取绝对值,进行
20lg(Prms / Pref)
变换到db - db肯定都是负值,如采样值为正,则db结果放上部,否则放下部
所以问题引入就可以得到解答:
- 带符号位的16bit整数对应的最大值为2^15-1=32767
- 所以Pref=32767,实际采样值取绝对值后为2900
- 代入公式,则有20lg(2900/32767) = -21.06dB
- 由此得证
举一反三
下面以24bit的PCM数据为例,结合具体图例,进行类似分析。
实例分析:
- 有符号24bit的最大值为2^23-1=8388607,所以Pref=8388607
- 观察选中区域,左下角第一个采样值点,对应数值为-4M,取绝对值为4M
- 代入公式,则有20lg(4000000/8388607) = -6.43dB
- 由于该采样值为负,所以分布在0db的下方,对应-6dB
取样值如图:
转换为db的结果:
幅值域和分贝对比,上下部都有-6db:
本文小结
综上,分贝本质是能量比值(无单位)的对数域变化,缩小对应尺度,便于人们直观观察。只是对无量纲的数据,转换了下尺度,带来的好处是更好的观测动态范围极大的数据,不同量级多的。
读到此处,分贝你怎么看?
扩展知识
问题1:常用dB单位dBFS的认识,绝对尺度是多少?
- FS指
Full Scale
- 绝对尺度为位深的最大值
- dB最大值为0,普遍值都为负数