音频 PCM 的数据中包含负值,但是分贝转换公式中的值要求是正值,请问这样是否存在冲突呢?

2020-05-04 16:31:11 +08:00
 SystemLight

音频 PCM 的数据中包含负值,但是分贝转换公式中的值要求是正值,请问这样是否存在冲突呢?

我通过 python 采集到的 sample 值是包含负值的,这样的话如何将这个振幅值转成分贝值,还有 adobe Audition 中的时域波形图基准线为何是负无穷而不是 0 呢,看起来怪怪的。

4622 次点击
所在节点    程序员
29 条回复
noe132
2020-05-04 16:38:00 +08:00
分贝是个比值单位,要看做对比的值( 0db )是哪一个。
振幅是负的不是取个绝对值就搞定的事么
catror
2020-05-04 17:05:59 +08:00
分贝是衡量数量比例的单位,正负是不会影响比例的。另外你给出的计算公式应该是不对。
ZZSZZSZZS
2020-05-04 17:20:55 +08:00
pcm 就是有正有负的,因为这是个正弦波就是有正有负的,跟交流电一样,所以你把负的取绝对值就好了。
ZZSZZSZZS
2020-05-04 17:23:17 +08:00
幅度趋近于 0 的时候,db 就是趋近于负无穷啊
Accelerant
2020-05-04 17:51:42 +08:00
麦克风的振膜是可以两个方向运动的,0 就是静止
msg7086
2020-05-04 19:27:19 +08:00
振幅不是震动的幅度吗?幅度不就是采样点到 0 的距离吗?你负数采样点到 0 的距离也不是负距离呀。
SystemLight
2020-05-04 19:40:39 +08:00
@msg7086 我的音频数据的位深是 2 字节的,我取数据时候是不是用无符号的 16 位整型去取就行了啊,我现在用的是有符号的整型,会出现负值,但是不清楚这个 2 字节的 sample 表示的大小到底是不是有符号的
liuzhedash
2020-05-04 19:42:20 +08:00
首先:取绝对值是不正确的,假设声音的波形按照 x 轴为时间,y 轴为振幅显示,取绝对值等于把 y 轴负半轴的波形翻转到正半轴。
有负值的原因:音频采集的两个主要物理量是采样频率( sample rate )和采样深度( bit depth ),采样频率代表每秒对声音进行多少次采样,采样深度代表每次采样用多少 bit 的信息描述采样结果,如果把这个结果定义为有符号数,那么就会有负值,反之定义为无符号数就不会有负值。
公式:这个公式本身没问题,但是有限定条件:当采样深度是 16bit,且采样过来的数值定义为无符号数的时候(值域[0,65535]),可以用这个公式计算 db 数值。
SystemLight
2020-05-04 19:42:25 +08:00
@Accelerant 那音频数据每一个 sample 的大小是有符号的还是无符号的呢,音频数据有正负方向的说法么
SystemLight
2020-05-04 19:45:12 +08:00
@liuzhedash 对对对,我现在不清楚的是这个数据定义本身是有符号的还是无符号的呢,因为我自己转的时候,2 个字节么,我可以转成有符号,也可以转无符号,但是这个真实情况下是不是有符号还是无符号就不清楚了。
autogen
2020-05-04 20:06:30 +08:00
归一化*65535
deanguqiang
2020-05-04 20:10:55 +08:00
@liuzhedash 你是认真的吗。。。
几乎所有的 ADC 采样进来都是有符号数(可能会有一个 1/2dBFS 的偏置),楼主的公式是计算 dBFS,即相对满幅度的分贝值,所以按照绝对值就行了。
deanguqiang
2020-05-04 20:13:41 +08:00
另外我认为楼主的公式不太对,16bit 有符号数的范围是-32768 到 32767,所以 dBFS = 20 * log10(abs(sample) / 32768)。
liuzhedash
2020-05-04 20:20:21 +08:00
@deanguqiang
我搞错了,16bit 的采样数值应该有符号的
liuzhedash
2020-05-04 20:32:06 +08:00
@deanguqiang
@SystemLight
研究了一下,13L 的公式是正确的。
我 8L 说的有很多问题,不要看了。

可以参考这两个:
https://blog.jianchihu.net/pcm-vol-control-advance.html
https://stackoverflow.com/questions/28632721/does-16bit-integer-pcm-data-mean-its-signed-or-unsigned
xiangyuecn
2020-05-04 20:39:40 +08:00
pcm=[1,-2,3,-4.....]
计算这个 pcm 的分贝的一种方法:取出 pcm 里面的最大值,可以不管负数(或者用绝对值),然后用这个最大值来计算有多少分贝。

so,取最大值不可能会出现负数,最多为 0
jagger2048
2020-05-04 20:45:24 +08:00
1. 首先 lz 的公式中 20*log_10 ( x ) 其实就是 10 * log_10(x^2),有平方的情况下正负无所谓
2. 其次 一般 16 bits 的 PCM 都是有符表示,公式中的 65536 有问题,应该是 32767
thedrwu
2020-05-04 20:51:41 +08:00
计算采样单位宽度的电功率,除以参考功率,做 10log,不管数值正负,功率肯定是正的。但是楼主说的不是这个。

如果楼主指的是人耳听到的 dB,每个频率的标准线不一样,先傅立叶拆成频谱再做除法或者减法。

基准线负无穷是因为 log0=负无穷。
msg7086
2020-05-04 20:53:53 +08:00
采样都是有符号的。
SystemLight
2020-05-04 21:03:58 +08:00
@jagger2048 实际上公式是 10 * log_10((sample/32767)^2) 对吧

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/668467

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX