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)
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 时,建议先设置采样率、位深、声道数等访问参数,最后设置周期和缓冲区大小。因为改变访问参数可能会重置周期/缓冲区约束。
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),是后续章节中正确设置周期大小和缓冲区大小的数学基础。