1. 音频基础概念:声音的物理特性与数字音频原理
1.1 声音的物理特性
声音本质上是介质(空气、水、固体)中的机械振动,以纵波形式传播。理解其三个基本物理量是掌握数字音频的起点。
| 物理量 | 定义 | 单位 | 听觉感知 | 典型范围 |
|---|---|---|---|---|
| 频率 | 单位时间内振动的周期数 | Hz(赫兹) | 音调(高低) | 人耳 20 Hz ~ 20 kHz |
| 振幅 | 振动偏离平衡位置的最大位移 | dB(分贝) | 响度(大小) | 0 dB(听阈)~ 120 dB(痛阈) |
| 相位 | 振动在某一时刻所处的周期位置 | °(度)或 rad(弧度) | 声场定位、音色 | 0° ~ 360° |
嵌入式开发提示: 在 ALSA 驱动中,频率决定采样率的选择(如 44.1 kHz 对应 22.05 kHz 奈奎斯特频率),振幅决定 ADC/DAC 的位深度需求,相位则影响多声道同步与混音算法。
1.2 数字音频原理
将连续的模拟声波转换为离散的数字信号,需要经过采样、量化和编码三个步骤。三个核心参数决定了数字音频的质量与数据量。
1.2.1 采样率(Sample Rate)
每秒对模拟信号采样的次数,单位 Hz。根据奈奎斯特采样定理:采样率必须 ≥ 2 × 信号最高频率,才能无失真重建原始信号。
- 8 kHz:电话语音质量
- 44.1 kHz:CD 音质(覆盖 20 kHz 人耳上限)
- 48 kHz:DVD / 专业音频标准
- 96 kHz / 192 kHz:高解析音频
1.2.2 位深度(Bit Depth)
每个采样点用多少比特表示振幅精度。位深度越大,动态范围越宽,量化噪声越低。
- 8 bit:256 级量化,动态范围约 48 dB,常见于早期语音
- 16 bit:65536 级量化,动态范围约 96 dB,CD 标准
- 24 bit:16777216 级量化,动态范围约 144 dB,录音室标准
- 32 bit float:浮点表示,用于 DSP 内部处理
1.2.3 声道数(Channels)
独立音频信号的数量,决定声场维度。
- Mono(单声道):1 个声道
- Stereo(立体声):2 个声道(左/右)
- 5.1 环绕声:6 个声道(前左/前右/中置/低音/后左/后右)
- 7.1 环绕声:8 个声道
数据速率计算公式: 数据速率 (bps) = 采样率 (Hz) × 位深度 (bit) × 声道数
示例:CD 音质立体声 → 44100 × 16 × 2 = 1,411,200 bps ≈ 1.41 Mbps
示例:CD 音质立体声 → 44100 × 16 × 2 = 1,411,200 bps ≈ 1.41 Mbps
1.3 PCM 数据格式详解
PCM(Pulse Code Modulation,脉冲编码调制)是数字音频最基础的未压缩格式,ALSA 底层直接操作的就是 PCM 数据流。理解 PCM 的存储布局是编写音频驱动的核心前提。
1.3.1 PCM 数据帧与周期
- 采样帧(Frame):一个时间点上所有声道的采样数据集合。对于立体声,一个帧包含左声道 + 右声道两个采样值。
- 周期(Period):硬件中断或 DMA 传输的基本单位,通常包含多个帧。ALSA 中通过
snd_pcm_hw_params_set_period_size()设置。 - 缓冲区(Buffer):由多个周期组成,用于平滑数据流,防止 underrun/overrun。
1.3.2 PCM 数据排列方式
根据声道数据在内存中的组织顺序,PCM 分为两种主流布局:
| 排列方式 | 描述 | 内存布局示例(16-bit 立体声) | ALSA 配置 |
|---|---|---|---|
| 交错(Interleaved) | 各声道采样交替存储:L R L R L R ... | [L0][R0][L1][R1][L2][R2]... |
SND_PCM_ACCESS_RW_INTERLEAVED |
| 非交错(Non-interleaved) | 各声道数据分块连续存储:L L L ... R R R ... | [L0][L1][L2]...[R0][R1][R2]... |
SND_PCM_ACCESS_RW_NONINTERLEAVED |
常见陷阱: 嵌入式平台中,I2S 接口通常默认使用交错格式。如果用户空间程序误将非交错数据写入交错配置的驱动,会导致左右声道数据错位,产生“金属声”或完全无声。务必通过
snd_pcm_hw_params_set_access() 明确匹配。
1.3.3 PCM 数据格式标识
ALSA 使用 snd_pcm_format_t 枚举定义 PCM 格式,常见值如下:
| ALSA 格式宏 | 位深度 | 字节数 | 字节序 | 典型用途 |
|---|---|---|---|---|
SND_PCM_FORMAT_S16_LE |
16 | 2 | 小端 | Linux 默认,x86/ARM 常用 |
SND_PCM_FORMAT_S16_BE |
16 | 2 | 大端 | 网络设备、某些 DSP |
SND_PCM_FORMAT_S24_LE |
24 | 3 | 小端 | 高精度音频采集 |
SND_PCM_FORMAT_S32_LE |
32 | 4 | 小端 | 专业声卡、内部处理 |
SND_PCM_FORMAT_FLOAT_LE |
32 | 4 | 小端 IEEE 754 | 浮点 DSP 流水线 |
1.3.4 PCM 数据在内存中的循环访问
关键概念: 硬件指针(HW Pointer)由 DMA 控制器自动推进,表示硬件当前写入/读取的位置;应用程序指针(APP Pointer)由用户空间通过
snd_pcm_avail_update() 查询并推进。两者之差即为缓冲区中可用的数据量。当 APP 指针追上 HW 指针时发生 underrun(播放时数据不足);当 HW 指针追上 APP 指针时发生 overrun(录音时数据溢出)。
1.4 本章小结
- 声音的物理三要素(频率、振幅、相位)直接映射到数字音频的采样率、位深度和声道数。
- PCM 是 ALSA 操作的核心数据格式,理解帧、周期、缓冲区的层级关系是驱动编程的基础。
- 交错与非交错布局的选择影响内存访问效率和硬件 I2S 接口匹配。
- 环形缓冲区模型中的 HW/APP 指针管理是避免音频卡顿和故障的关键。