PCM术语与概念¶
样本¶
PCM 音频,无论是输入还是输出,都由样本(samples)组成。单个样本表示某一时刻一个声道声音的振幅。要表示实际声音,需要大量独立的样本;例如 CD 音频每秒会采集 44100 个样本。
样本可以有多种不同的尺寸,精度范围从 8 位到 64 位不等。每个样本的具体格式也可能不同——它们可以是高位字节序的整数、低位字节序的整数,或浮点数。
从音乐角度而言,样本尺寸决定了动态范围。动态范围是指可重现的最安静信号与最响亮信号之间的差异。
帧¶
一帧(frame)包含每个通道恰好一个样本。如果只有一个通道(单声道),一帧就是一个单独的样本。如果是立体声,每帧则包含两个样本,以此类推。
帧大小¶
指每个帧的字节大小。
该值变化范围很大:如果每个采样为 8 位,且处理的是单声道音频,则帧大小为 1 字节;对于六声道、64 位浮点采样的音频,帧大小为 48 字节。
采样率¶
PCM 音频由连续的音频帧流构成。
采样率(sample rate)控制着当前帧被替换的频率。例如,8000 Hz 的采样率意味着每秒播放或采集 8000 次新帧。
数据速率¶
指在特定帧大小和采样率下,每秒必须消耗或提供的字节数。也叫比特率(bit rate)。
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--------------|