1. 音频基础概念:采样率、位深、声道数、PCM数据格式

在嵌入式Linux音频开发中,采样率、位深、声道数和PCM数据格式是构成数字音频流的四个基本维度。理解它们之间的数学关系与物理含义,是正确配置ALSA参数、避免音频失真或驱动适配失败的前提。

1.1 采样率(Sample Rate)

采样率定义了一秒钟内对模拟音频信号进行采样的次数,单位是Hz(赫兹)或kHz(千赫兹)。根据奈奎斯特采样定理,采样率必须至少为信号最高频率的两倍,才能无混叠地重建原始波形。

采样率 典型用途 奈奎斯特频率
8 kHz 电话语音、对讲系统 4 kHz
16 kHz 宽带语音、VoIP 8 kHz
44.1 kHz CD音频、MP3 22.05 kHz
48 kHz DVD、数字电视、专业音频 24 kHz
96 kHz 高解析度音频、录音棚 48 kHz
192 kHz 超高解析度音频、测量 96 kHz
嵌入式避坑:许多嵌入式SoC的音频控制器只支持有限的采样率集合(如8/16/48/96 kHz)。在ALSA驱动中配置一个硬件不支持的采样率,会导致 snd_pcm_hw_params 返回 -EINVAL。务必先通过 snd_pcm_hw_params_test_rate 验证硬件能力。

1.2 位深(Bit Depth / Sample Format)

位深表示每个采样点用多少比特来量化信号的幅度。位深越大,动态范围越宽,量化噪声越低。动态范围的理论值约为 6.02 × N + 1.76 dB,其中N为位深。

  • S16_LE(16位有符号小端):最常用的格式,CD音质标准,动态范围约96 dB。
  • S24_LE(24位有符号小端):专业音频常用,动态范围约144 dB,在32位容器中存储时称为S24_3LE或S24_4LE。
  • S32_LE(32位有符号小端):高解析度音频,动态范围约192 dB,常用于内部处理。
  • FLOAT_LE(32位浮点小端):DSP处理链中的标准格式,支持0 dB以上过采样而不截顶。
位深与ALSA格式名称:ALSA使用 SND_PCM_FORMAT_S16_LE 等宏定义格式。在驱动中配置位深时,必须匹配硬件FIFO的实际宽度。例如,硬件只支持24位右对齐,但用户空间传入S32_LE,驱动需要做移位或截断处理,否则会产生噪声。

1.3 声道数(Channels)

声道数描述音频流中独立信号轨道的数量。常见的声道布局包括:

声道数 布局名称 典型应用
1 Mono(单声道) 麦克风输入、语音播报
2 Stereo(立体声) 音乐播放、耳机输出
4 Quad(四声道) 环绕声、多路录音
6 5.1环绕声 家庭影院、车载音频
8 7.1环绕声 高端游戏、专业影院

在PCM数据流中,声道数据按照交错(Interleaved)或非交错(Non-interleaved)方式排列。交错模式下,每个帧(Frame)包含所有声道的一个采样点,按声道顺序连续存放。

1.4 PCM数据格式与帧结构

PCM(Pulse Code Modulation)是数字音频的原始表示形式。理解帧(Frame)和周期(Period)的概念是ALSA参数配置的核心。

// 一个立体声、16位、48 kHz的PCM帧结构(交错模式)
// 帧大小 = 声道数 × 位深/8 = 2 × 2 = 4 字节
// 每秒数据量 = 采样率 × 帧大小 = 48000 × 4 = 192000 字节/秒

帧 n:     [左声道采样(2字节)] [右声道采样(2字节)]
帧 n+1:   [左声道采样(2字节)] [右声道采样(2字节)]
...
关键公式:
  • 帧大小(bytes/frame) = 声道数 × (位深 / 8)
  • 数据率(bytes/sec) = 采样率 × 帧大小
  • 周期大小(period_size) = 每次硬件中断传输的帧数
  • 缓冲区大小(buffer_size) = 周期大小 × 周期数(通常为2~4)
PCM交错数据帧结构(立体声 16位) 帧 n 左声道 (16位) 帧 n 右声道 (16位) 帧 n+1 左声道 (16位) 帧 n+1 右声道 (16位) 帧 n+2 左声道 (16位) 帧 n+2 右声道 (16位) … 帧 = 所有声道的一个采样点 帧大小 = 2 × 2 = 4 字节 数据率 = 48k × 4 = 192 kB/s 交错:声道交替排列在流中

1.5 四个参数的数学关系

采样率、位深、声道数共同决定了PCM音频流的数据率和缓冲区延迟。在ALSA驱动中,这些参数通过 snd_pcm_hw_params_set_* 系列函数进行配置。

// 计算示例:配置一个低延迟音频流
// 参数:采样率=48000, 位深=16, 声道数=2, 周期大小=256帧

帧大小 = 2 × (16/8) = 4 字节
周期大小(字节)= 256 × 4 = 1024 字节
周期时间 = 256 / 48000 = 5.33 毫秒
缓冲区大小(2个周期)= 2 × 1024 = 2048 字节
缓冲区延迟 = 2 × 5.33 = 10.67 毫秒
ALSA配置顺序:在调用 snd_pcm_hw_params 时,建议先设置采样率、位深、声道数等访问参数,最后设置周期和缓冲区大小。因为改变访问参数可能会重置周期/缓冲区约束。
音频参数 → 数据率计算流程 采样率 (Hz) 例: 48000 位深 (bit) 例: 16 声道数 例: 2 帧大小 声道数 × (位深/8) 数据率 (bytes/s) 采样率 × 帧大小 = 48000 × 4 = 192 kB/s

1.6 常见音频格式对比

格式 采样率 位深 声道数 数据率(约) 典型场景
电话语音 8 kHz 16 1 16 kB/s VoIP、对讲
CD音频 44.1 kHz 16 2 176.4 kB/s 音乐播放
DVD音频 48 kHz 24 6 864 kB/s 5.1环绕声
高解析音频 96 kHz 24 2 576 kB/s 录音棚监听
DSP内部处理 48 kHz 32 (float) 2 384 kB/s 音频算法链
本章小结:采样率决定频率范围,位深决定动态范围,声道数决定空间维度,PCM格式决定数据排列方式。这四个参数在ALSA驱动中通过 snd_pcm_hw_params_set_rate、snd_pcm_hw_params_set_format、snd_pcm_hw_params_set_channels 进行配置。理解它们之间的乘法关系(数据率 = 采样率 × 声道数 × 位深/8),是后续章节中正确设置周期大小和缓冲区大小的数学基础。