PCM音频振幅值是什么?

38

我用Android智能手机开始进行音频录制。

我已经成功将语音记录保存到PCM文件中。当我解析数据并打印出符号化的16位值时,可以创建如下图所示的图形。但是,我不理解沿y轴的振幅值。

  1. 振幅值的单位是什么?这些值是有符号的16位,因此它们必须从-32K到+32K范围内变化。但这些值代表什么呢?分贝?

  2. 如果我使用8位值,则这些值的范围必须从-128到+128。这将如何映射到16位值的音量/“响度”上?你只需要使用16对1的量化映射吗?

  3. 为什么会有负数?我认为完全的静音应该产生值为0的结果。

如果有人能指点一下我正在记录什么的网站,我将不胜感激。我找到了webpages关于PCM文件格式的信息,但没有数据值的说明。

enter image description here


一个小问题:有符号的16位是+/- 32K。 - AShelly
5个回答

28

想象一下麦克风的表面。当它静止时,表面处于位置零。当你说话时,会导致你嘴周围的空气振动。振动类似于弹簧,可以在两个方向上进行移动,如前后、上下或内外。空气中的振动也会使麦克风表面振动,如上下移动。当它向下移动时,可能会被测量或采样为正值。当它向上移动时,可能被采样为负值。(或者也可能相反。)当你停止说话时,表面恢复到零位置。

从PCM录音数据中得到的数字取决于系统的增益。使用常见的16位样本,范围是-32768至32767,这是可以记录而不失真、削波或溢出的振动的最大可能偏移。通常,增益设置略低,以便最大值不会正好处于失真边缘。

补充:

8位PCM音频通常是无符号数据类型,范围为0..255,128表示“静音”。因此,必须添加/减去这种偏差,并按大约256进行缩放,以在8位和16位音频PCM波形之间进行转换。


1
那么y轴(振幅)是无单位的吗?如果是这样,那么播放应用程序是否需要解释该值并以给定音量播放信号? - stackoverflowuser2010
1
我仍然不理解录音端发生了什么。麦克风和模数转换器(ADC)似乎有很多变量,可以将噪声映射到PCM范围内(无论是+1到-1还是+32K到-32K)。考虑两个声源:大约40分贝的正常语音和大约120分贝的喷气发动机。是谁决定PCM的+32K值映射到120分贝或40分贝?这是由声音工程师或ADC单元决定的设置吗?在Android / iPhone中是否有一种方法来设置此范围映射? - stackoverflowuser2010
1
是的,有很多变量。增益可能由未记录的AGC(自动增益控制)算法决定。 - hotpaw2
2
@stackoverflowuser2010 你混淆了数字世界和模拟世界。采样值和分贝级别之间没有关联。基本上,如果麦克风和录音电路被设计为记录高达40db的声音,则+32k(或-32k)的采样级别将接近40db声音的峰值水平。将麦克风远离源,相同的峰值将以低于+32k的数字化方式出现。这仍然忽略了AGC电路的影响! - staticsan
1
太好了!感谢您提供这个。我不太关心单位,但我不清楚“负”值意味着什么。用振动的术语解释是非常合理的。因此,-1.0f值与+1.0f值一样“响亮”吗?但在“振动频率”方面,如果您尝试混合两个值,它们将相互抵消并给出(实质上)静音。 - Bob C
显示剩余3条评论

9
原始数字是将模拟音频信号转换为数字信号的量化过程中产生的一种人工制品。更合理的想法是将音频信号视为围绕0振动,并延伸至+1和-1,以达到信号的最大偏移。超出这个范围,就会出现削波,导致谐波失真并且听起来很糟糕。
然而,计算机在分数方面的表现不佳,因此使用从0到65536的离散整数来映射该范围。在大多数应用程序中,+32767被认为是麦克风或扬声器振膜的最大正向偏移。除非你开始考虑录制(或播放)电路的特性,否则采样点与声压级之间没有任何相关性。
(顺便说一句,16位音频非常标准且广泛使用。它是信噪比和动态范围的良好平衡。8位嘈杂,除非进行一些奇怪的非标度处理。)

3
很多很好的答案,但它们没有以易于阅读的方式直接回答您的问题。
幅值的单位是什么?这些值是有符号的16位,因此它们必须在-32K到+32K范围内。但是这些值代表什么?分贝?
这些值没有单位。它们只是表示模拟数字转换器输出的数字。来自A/D转换器的数字是麦克风和前置放大器特性的函数。
如果我使用8位值,那么这些值必须从-128到+128范围内。如何将其映射到16位值的音量/“响度”?您只需使用16:1的量化映射吗?
我不理解这个问题。如果您正在记录8位音频,则您的值将为8位。您是否将8位音频转换为16位?
为什么会有负值?我认为完全的寂静会导致值为0
麦克风上的振动膜会向两个方向振动,因此会产生正电压和负电压。值为0表示没有声音,因为它表示振膜没有移动。请参见麦克风的工作原理 有关数字表示声音的更多详细信息,请参见此处

关于我关于8位音频的问题,我的意图是询问真实可听级别如何映射到8位范围。如果80分贝的割草机产生16位幅值+20K,那么同样的80分贝噪音是否会产生8位幅值+78? - stackoverflowuser2010
理想情况下,是的(这取决于音频是否有符号/无符号)。答案取决于您使用的麦克风的指定范围以及他们如何调整前置放大器以映射从中输出的电压级别的动态范围。 - Error 454

3
这里的16位数字是来自麦克风的A/D转换器值(您已经知道这一点)。还要知道,在麦克风和A/D转换器之间的放大器具有自动增益控制(AGC)。AGC将积极改变麦克风信号的放大,以防止过多的电压击中A/D转换器(通常< 2伏直流电)。此外,还有直流电压解耦,将输入信号设置在A/D转换器范围的中心位置(例如1伏特直流电)。
因此,当没有声音击中麦克风时,AGC放大器向A/D转换器发送平坦的1.0伏特直流信号。当声波击中麦克风时,它会创建相应的交流电压波。AGC放大器接收AC电压波,将其置于1.0 Vdc处,并将其发送到A/D转换器。A/D采样(每秒约44,000次/测量直流电压),并输出电压的+/-16位值。因此,-65,536 = 0.0 Vdc,+65,536 = 2.0 Vdc。 +100 = 1.00001529 Vdc和-100 = 0.99998474 Vdc击中A/D转换器。+值高于1.0 Vdc,-值低于1.0 Vdc。
请注意,大多数音频系统使用对数公式对音频波进行对数曲线处理,以使人耳更好地听到它。在数字音频系统(带有ADC)中,数字信号处理将此曲线放置在信号上。 DSP芯片是大生意,TI已经利用它们进行了各种应用,不仅仅是音频处理。 DSP可以将非常复杂的数学运算工作到实时数据流中,这会使iPhone的ARM7处理器陷入困境。比如你要向256个超声波传感器/接收器阵列发送2MHz脉冲--你明白了。

3
Why are there negative values? I would think that complete silence

would result in values of 0

The diaphragm on a microphone vibrates in both directions and as a result creates positive and negative voltages. A value of 0 is silence as it indicates that the diaphragm is not moving. See how microphones work

小小澄清:记录的是振膜的位置。当没有震动或没有位置变化时就会出现静默。因此,您看到的振动是推动空气并随时间产生气压变化的结果。在任何振动的顶部和底部峰值处,空气不再被推动,因此峰值时发生静默。信号中最响亮的部分是位置变化最快的地方,通常在峰值中间。振膜从一个峰值移动到另一个峰值的速度决定了振膜所产生的压力大小。当顶部和底部峰值降至零(或它们共享的其他数字)时,就没有振动也没有声音。此外,随着振膜减速以便在峰值之间有更长的时间间隔,生成或记录的声音压力也会减少。

我建议阅读《雅马哈音响加固手册》以获取更深入的阅读体验。了解微积分的概念可以帮助理解音频和振动。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接