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

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。
PCM 数据存储结构(立体声 16-bit) 一个采样帧(Frame)= 左声道采样 + 右声道采样 左声道 L (16-bit) 右声道 R (16-bit) + 周期(Period)= N 个连续帧(例如 1024 帧) 缓冲区(Buffer)= M 个周期(例如 4 个周期) ALSA 通过 period interrupt 在周期边界触发回调,驱动读写指针在缓冲区中循环

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 数据在内存中的循环访问

ALSA 环形缓冲区(Ring Buffer)访问模型 环形缓冲区(Ring Buffer) Period 0 Period 1 Period 2 Period 3 HW 硬件 DMA 写入位置 APP 应用程序读取位置 可读取数据区域
关键概念: 硬件指针(HW Pointer)由 DMA 控制器自动推进,表示硬件当前写入/读取的位置;应用程序指针(APP Pointer)由用户空间通过 snd_pcm_avail_update() 查询并推进。两者之差即为缓冲区中可用的数据量。当 APP 指针追上 HW 指针时发生 underrun(播放时数据不足);当 HW 指针追上 APP 指针时发生 overrun(录音时数据溢出)。

1.4 本章小结

  • 声音的物理三要素(频率、振幅、相位)直接映射到数字音频的采样率、位深度和声道数。
  • PCM 是 ALSA 操作的核心数据格式,理解帧、周期、缓冲区的层级关系是驱动编程的基础。
  • 交错与非交错布局的选择影响内存访问效率和硬件 I2S 接口匹配。
  • 环形缓冲区模型中的 HW/APP 指针管理是避免音频卡顿和故障的关键。