【问题标题】:PCM audio amplitude values?PCM音频幅度值?
【发布时间】:2011-08-18 22:19:13
【问题描述】:

我开始使用我的 Android 智能手机进行录音。

我已成功将录音保存到 PCM 文件。当我解析数据并打印出带符号的 16 位值时,我可以创建如下图所示的图表。 但是,我不了解沿 y 轴的幅度值。

  1. 幅度值的具体单位是什么?这些值是 16 位有符号的,因此它们的范围必须在 -32K 到 +32K 之间。但是这些值代表什么?分贝?

  2. 如果我使用 8 位值,则值的范围必须在 -128 到 +128 之间。这将如何映射到 16 位值的音量/“响度”?你会只使用 16 比 1 的量化映射吗?

  3. 为什么会有负值?我认为完全沉默会导致值为 0。

如果有人可以将我指向一个包含有关记录内容的信息的网站,我将不胜感激。我在 PCM 文件格式上找到了webpages,但没有找到数据值。

【问题讨论】:

  • 一点点:有符号的 16 位是 +/- 32K。
  • 已修复,感谢您指出这一点。

标签: iphone android audio audio-recording pcm


【解决方案1】:

16 位数字是来自麦克风的 A/D 转换器值(您知道这一点)。还要知道麦克风和 A/D 转换器之间的放大器具有自动增益控制 (AGC)。 AGC 将主动改变麦克风信号的放大率,以防止过多的电压冲击 A/D 转换器(通常

因此,当麦克风没有声音时,AGC 放大器向 A/D 转换器发送扁平线 1.0 伏直流信号。当声波撞击麦克风时,它会产生相应的交流电压波。 AGC 放大器接收交流电压波,以 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 脉冲 - 您明白了。

【讨论】:

    【解决方案2】:
    Why are there negative values? I would think that complete silence
    

    将导致值为 0

    麦克风上的振膜会双向振动 结果产生正电压和负电压。值为 0 表示静音 因为它表明隔膜没有移动。看看麦克风如何 工作

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

    我推荐Yamaha Sound Reinforcement Handbook 以获得更深入的阅读。理解微积分的概念也有助于理解音频和振动。

    【讨论】:

      【解决方案3】:

      这里有很多很好的答案,但它们并没有以一种易于阅读的方式直接解决您的问题。

      幅度值的具体单位是什么?值是 带符号的 16 位,因此它们的范围必须从 -32K 至 +32K。但是这些值代表什么?分贝?

      这些值没有单位。它们只是表示来自模数转换器的数字。来自 A/D 转换器的数字是麦克风和前置放大器特性的函数。

      如果我使用 8 位值,那么值 范围必须在 -128 到 +128 之间。如何 会被映射到 16 位的音量/“响度” 价值观?你会用16比1吗 量化映射?

      我不明白这个问题。如果您正在录制 8 位音频,则您的值将是 8 位。您是在将 8 位音频转换为 16 位吗?

      为什么会有负值?我会 认为完全的沉默会 结果为 0

      麦克风上的振膜会双向振动,因此会产生正电压和负电压。值 0 表示静音,因为它表示隔膜没有移动。见how microphones work

      有关如何以数字方式表示声音的更多详细信息,请参阅here

      【讨论】:

      • 关于我关于 8 位音频的问题,我的目的是询问真正的可听电平如何映射到 8 位范围。如果一台 80 dB 的割草机产生 +20K 的 16 位幅度值,那么同样的 80 dB 噪声是否会产生 8 位幅度值,例如 +78?
      • 理想情况下,是的(取决于音频是否已签名/未签名)。答案取决于您使用的麦克风的指定范围以及他们对前置放大器的调谐程度以映射来自它的电压电平的动态范围。
      【解决方案4】:

      原始数字是用于将模拟音频信号转换为数字信号的量化过程的产物。将音频信号视为 0 附近的振动更有意义,延伸至 +1 和 -1 以实现信号的最大偏移。除此之外,你会得到削波,这会扭曲谐波并且听起来很糟糕。

      但是,计算机在分数方面的工作并不是那么好,因此使用从 0 到 65536 的离散整数来映射该范围。在大多数此类应用中,+32767 被认为是麦克风或扬声器振膜的最大正偏移。采样点和声压级之间没有相关性,除非您开始考虑录音(或回放)电路的特性。

      (顺便说一句,16 位音频非常标准且被广泛使用。它在信噪比和动态范围之间取得了很好的平衡。除非您进行一些时髦的非标准缩放,否则 8 位是嘈杂的。)

      【讨论】:

        【解决方案5】:

        想想麦克风的表面。当它静默时,表面在零位置处是静止的。当你说话时,这会导致你嘴周围的空气振动。振动类似于弹簧,并且在两个方向上都有运动,如前后、上下或进出。空气中的振动也会导致麦克风表面振动,就像上下移动一样。当它向下移动时,可能会测量或采样一个正值。当它向上移动时,可能会被采样为负值。 (或者可能相反。)当你停止说话时,表面会回到零位。

        您从 PCM 录音数据中获得的数字取决于系统的增益。对于常见的 16 位样本,范围是从 -32768 到 32767,以获得最大可能的振动偏移,可以在不失真、削波或溢出的情况下记录。通常增益设置得低一点,这样最大值就不会在失真的边缘。

        添加:

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

        【讨论】:

        • 那么y轴(幅度)是无单位的吗?如果是这种情况,那么是否由播放应用程序来解释该值并以给定的音量播放信号?
        • 我仍然不明白录制结束时会发生什么。麦克风和模数转换器 (ADC) 似乎有很多变量可以将噪声映射到 PCM 范围(无论是 +1 到 -1 还是 +32K 到 -32K)。考虑两个声源:大约 40 dB 的正常语音和大约 120 dB 的喷气发动机。谁决定 PCM 的 +32K 值映射到 120 dB 还是 40 dB?这是由音响工程师或 ADC 单元决定的设置还是什么? Android/iPhone 中有没有办法设置这个范围映射?
        • 是的,有很多变数。增益可能由未记录的 AGC(自动增益控制)算法决定。
        • @stackoverflowuser2010 你混淆了数字世界和模拟世界。与样本值和分贝级别没有相关性。基本上,如果麦克风和录音电路设计用于录制高达 40db 的声音,那么 +32k(或 -32k)的采样电平将接近 40db 声音的峰值电平。将麦克风远离源,same 峰值将数字化,而不是低于 +32k。这仍然忽略了 AGC 电路的影响!
        • 太棒了!谢谢你。我不太关心单位,但我不清楚“负”值是什么意思。用振动来解释它是完全有道理的。那么 -1.0f 值与 +1.0f 值一样“响亮”吗?但就“振动频率”而言,如果你试图混合这两个值,它们会抵消并给你(基本上)沉默。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-09-24
        • 2022-10-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多