1. 音频系统概述:数字音频基础与总线协议
本章作为整个课程的基石,将系统梳理数字音频的核心概念、编解码器工作原理以及主流的数字音频总线协议。理解这些基础是后续深入分析 ARM 音频驱动、DMA 传输机制以及 ALSA 框架调优的必备前提。
1.1 数字音频基础三要素
数字音频的本质是将连续的模拟声波信号离散化为二进制数据。描述这一过程的核心参数有三个:采样率 (Sample Rate)、位深 (Bit Depth) 和 声道数 (Channels)。它们共同决定了音频数据的质量与数据量。
| 参数 | 定义 | 常见值 | 对音质/数据量的影响 |
|---|---|---|---|
| 采样率 (Sample Rate) | 每秒对模拟信号采样的次数,单位 Hz (kHz)。 | 8kHz (电话), 44.1kHz (CD), 48kHz (DVD/专业), 96kHz/192kHz (高解析度) | 决定频率响应上限(奈奎斯特频率 = 采样率/2)。采样率越高,高频还原越好,数据量线性增加。 |
| 位深 (Bit Depth) | 每个采样点用多少比特来表示其幅度值。 | 16-bit (CD), 24-bit (专业/高解析), 32-bit float (后期处理) | 决定动态范围(理论值 ≈ 6.02 × 位深 + 1.76 dB)。位深越大,信噪比越高,细节越丰富,数据量线性增加。 |
| 声道数 (Channels) | 独立音频信号的数量。 | 1 (Mono), 2 (Stereo), 5.1/7.1 (环绕声), 多通道 (阵列麦克风) | 决定空间感和沉浸感。声道数越多,数据量成倍增加。 |
数据量计算公式:
示例:CD 音质 (44.1kHz × 16bit × 2ch) = 1,411,200 bps ≈ 1.41 Mbps
数据速率 (bps) = 采样率 (Hz) × 位深 (bit) × 声道数示例:CD 音质 (44.1kHz × 16bit × 2ch) = 1,411,200 bps ≈ 1.41 Mbps
工程师视角:在嵌入式系统中,采样率和位深的选择直接影响 DMA 传输的带宽需求和 FIFO 中断频率。例如,从 16bit/48kHz 升级到 24bit/96kHz,数据吞吐量将增加 3 倍,必须重新评估总线负载和 DMA 描述符链的设计。
1.2 音频编解码器 (Codec) 工作原理
Codec (Coder-Decoder) 是模拟音频世界与数字音频世界之间的桥梁。在 ARM 音频系统中,它通常是一个独立的芯片或集成在 SoC 内部,负责完成模数转换 (ADC) 和数模转换 (DAC),并处理增益、滤波、混音等任务。
Codec 的工作流程通常包含以下步骤:
- 模拟输入处理:麦克风或线路输入的微弱模拟信号经过前置放大器 (PGA) 和抗混叠滤波器。
- 模数转换 (ADC):将滤波后的模拟信号按设定的采样率转换为数字 PCM 数据。
- 数字信号处理 (DSP):对数字流进行可编程处理,如音量调节、EQ、噪声抑制、混音等。
- 数模转换 (DAC):将处理后的数字 PCM 数据还原为模拟信号。
- 模拟输出处理:经过重建滤波器和功率放大器驱动耳机或扬声器。
驱动开发注意:Codec 的初始化顺序至关重要。必须先通过控制接口 (I2C/SPI) 配置好电源管理、采样率、接口格式等寄存器,再启动数字音频接口的时钟和数据传输。错误的初始化顺序可能导致 I2S 总线锁死或产生爆音 (Pop Noise)。
1.3 I2S / PCM / TDM 总线协议对比
这三种协议是数字音频设备间传输音频数据的主流串行总线标准。它们都使用至少 3 根信号线:位时钟 (BCLK)、帧同步 (FS/LRCK) 和数据线 (SD)。理解它们的差异是正确配置 CPU 和 Codec 数字接口的前提。
| 特性 | I2S (Inter-IC Sound) | PCM (Pulse Code Modulation) | TDM (Time Division Multiplexing) |
|---|---|---|---|
| 帧同步信号 | 左右声道选择 (LRCK),高电平=左声道,低电平=右声道 (或相反) | 帧同步 (FSYNC),通常为短脉冲,标识一个帧的开始 | 帧同步 (FSYNC),标识一个 TDM 帧的开始 |
| 数据格式 | MSB 对齐,数据在 BCLK 下降沿变化,在上升沿采样。LRCK 在数据之前一个 BCLK 周期变化。 | 数据通常与 FSYNC 对齐,可以是 MSB 或 LSB 对齐。 | 在一个帧内,按固定时隙 (Slot) 依次传输多个声道的数据。 |
| 声道支持 | 原生支持 2 声道 (立体声) | 通常支持 1-2 声道,通过配置可扩展 | 支持多达 8/16/32 声道,适合多麦克风阵列或环绕声 |
| 典型应用 | Hi-Fi 音频播放、耳机、扬声器 | 语音通信、蓝牙音频、窄带应用 | 多通道音频系统、智能音箱、车载音频 |
| 总线利用率 | 较高,无额外开销 | 中等,取决于帧同步脉冲宽度 | 极高,一个帧内可传输多路数据 |
1.4 协议选择与驱动配置要点
在实际的 ARM 音频驱动开发中,选择哪种总线协议取决于硬件设计和应用场景。以下是驱动工程师需要关注的配置要点:
- 主从模式 (Master/Slave):必须明确 BCLK 和 FS 由谁产生。通常 CPU 或 DMA 控制器作为 Master,Codec 作为 Slave,但也可以反向配置。
- 数据格式 (Format):除了标准的 I2S,还有左对齐 (Left-Justified) 和右对齐 (Right-Justified) 格式。Codec 的数据手册会明确说明其支持的格式。
- 位宽与槽宽 (Data Width & Slot Width):例如,传输 16-bit 数据时,BCLK 周期可以是 16 个 (节省功耗) 或 32 个 (兼容 24-bit Codec)。TDM 模式下,每个 Slot 的宽度必须一致。
- 时钟极性 (Polarity):BCLK 和 FS 的上升/下降沿采样或变化需要与 Codec 端匹配,否则会导致数据错位或噪声。
ALSA 驱动中的 DAI 配置示例 (I2S 从模式):
static const struct snd_soc_dai_link_component codec_components[] = {
{
.name = "wm8960-codec.0-001a",
.dai_name = "wm8960-hifi",
}
};
static struct snd_soc_dai_link my_dai_link = {
.name = "My Audio",
.stream_name = "My Audio Stream",
.cpus = &(struct snd_soc_dai_link_component) {
.name = "2020000.i2s",
.dai_name = "i2s-hifi",
},
.codecs = codec_components,
.platforms = &(struct snd_soc_dai_link_component) {
.name = "2020000.i2s",
},
.dai_fmt = SND_SOC_DAIFMT_I2S | // I2S 格式
SND_SOC_DAIFMT_CBS_CFS | // Codec 作为 Slave (BCLK, FS 由 CPU 提供)
SND_SOC_DAIFMT_IB_NF, // BCLK 反转,FS 正常
};
调试技巧:当音频出现“沙沙”声或数据错位时,首先使用示波器或逻辑分析仪检查 BCLK 和 FS 的波形频率与极性。确认 Codec 的
PLL 和 MCLK 配置正确,这是 I2S 总线正常工作的前提。