Skip to content

PCM术语与概念

数字音频 | 维基百科

脉冲编码调制(PCM) | 维基百科

PCM Terminology and Concepts | alsaaudio documentation

样本

PCM 音频,无论是输入还是输出,都由样本(samples)组成。单个样本表示某一时刻一个声道声音的振幅。要表示实际声音,需要大量独立的样本;例如 CD 音频每秒会采集 44100 个样本。

样本可以有多种不同的尺寸,精度范围从 8 位到 64 位不等。每个样本的具体格式也可能不同——它们可以是高位字节序的整数、低位字节序的整数,或浮点数。

从音乐角度而言,样本尺寸决定了动态范围。动态范围是指可重现的最安静信号与最响亮信号之间的差异。

帧

一帧(frame)包含每个通道恰好一个样本。如果只有一个通道(单声道),一帧就是一个单独的样本。如果是立体声,每帧则包含两个样本,以此类推。

帧大小

指每个帧的字节大小。

该值变化范围很大:如果每个采样为 8 位,且处理的是单声道音频,则帧大小为 1 字节;对于六声道、64 位浮点采样的音频,帧大小为 48 字节。

采样率

PCM 音频由连续的音频帧流构成。

采样率(sample rate)控制着当前帧被替换的频率。例如,8000 Hz 的采样率意味着每秒播放或采集 8000 次新帧。

数据速率

指在特定帧大小和采样率下,每秒必须消耗或提供的字节数。也叫比特率(bit rate)。

\[ \text{数据速率} = \text{帧大小} \times \text{采样率} \]

Example

8000 Hz 单声道声音,采用 8 位(1 字节)采样,其数据速率为 8000 * 1 * 1 = 8 kb/s 或 64 kbit/s。这通常用于电话通信。

96000 Hz、6 声道声音,采用 64 位(8 字节)采样,其数据速率为 96000 * 6 * 8 = 4608 kb/s(每秒近 5 MB 的声音数据)。

如果数据速率要求未得到满足,就会发生溢出(在录音时)或欠载(在播放时);术语“xrun”用于指代这两种事件中的任何一种。

周期

CPU 以帧块为单位处理样本数据,这些帧块被称为周期(period)(某些系统也称之为片段)。

操作系统内核的样本缓冲区必须至少容纳两个周期(在任何给定时刻,一个由音频硬件处理,另一个由 CPU 处理)。

一个周期的完成会触发 CPU 中断,从而产生处理开销和上下文切换开销。因此,在给定的数据速率下,较小的周期大小会导致更高的 CPU 资源占用。

更大的缓冲区大小能提升系统对欠载/过载(xrun)的容错能力。将缓冲区划分为更多更小的周期也能达到同样效果,因为这能使其更早地被排空/补充。另一方面,更大的缓冲区也会增加播放延迟,即音频帧从应用程序发出到实际可听之间的时间差。类似地,更大的周期大小会增加采集延迟。

延迟、欠载/过载容错能力与资源消耗之间的权衡,必须根据具体应用场景来做出选择。

周期大小

每个周期以帧为单位的尺寸。注意是帧,而非字节!

例如,如果采样率为 44100 Hz,帧大小为 2 字节,则 20 ms 的周期大小为 44100 * 2 * 0.02 = 1764 帧。

采样大小

也叫位深度(bit depth),指每次采样存储着多少比特的信息,数值直接对应着每次采样的分辨率1。

每个采样占用 physical_bits 位空间。nominal_bits 表示使用了多少个最低有效位,即格式名称中的位深度,有时也简称为采样位数或格式宽度。significant_bits 表示在 nominal_bits 中,采样实际使用了多少个最高有效位,可视为采样分辨率。其可视化结构如下:

MSB |00000000 XXXXXXXX XXXXXXXX 00000000| LSB
              |--significant--|
              |---------nominal---------|
    |-------------physical--------------|