1. 音频系统概述:从麦克风到扬声器的完整链路
做嵌入式音频开发,首先得把整个系统架构装进脑子里。我刚开始接触这块时,也犯过「只见树木不见森林」的毛病——盯着某个寄存器调了半天,结果发现是I2S时钟配错了。所以这一章,我们先搭好知识框架。
1.1 嵌入式音频系统架构
一个典型的嵌入式音频系统,说白了就是三大部分:音频输入、音频处理、音频输出。你想想看,从麦克风采集声音,到CPU处理,再到扬声器播放,中间要经过多少环节?
模拟麦克风 → 前置放大器 → ADC(模数转换) → I2S/PCM总线 → CPU/DSP处理 → I2S/PCM总线 → DAC(数模转换) → 功放 → 扬声器
我在一个智能音箱项目里遇到过这样的坑:麦克风采集的声音总是有底噪,查了半天发现是模拟地和数字地没分开。嗯,硬件设计上一个小疏忽,软件调得再好也白搭。
嵌入式音频系统通常分为以下几个层次:
- 物理层:麦克风、扬声器、功放芯片、连接器
- 转换层:ADC/DAC、编解码器(如WM8960)
- 总线层:I2S、PCM、TDM、I2C(控制总线)
- 驱动层:ALSA框架、ASoC子系统、平台驱动
- 应用层:音频服务、播放器、录音程序
我个人习惯把系统分成「数据流」和「控制流」两条线来看。数据流走音频数据,控制流走寄存器配置。这两条线在WM8960这样的编解码器里是分开的——数据走I2S,控制走I2C。
1.2 数字音频基础:采样率、位深、声道
数字音频的本质,就是把连续的模拟信号变成离散的数字序列。这里三个核心参数,你必须烂熟于心。
| 参数 | 含义 | 常见值 | 影响 |
|---|---|---|---|
| 采样率 | 每秒采集的样本数 | 8k / 16k / 44.1k / 48k Hz | 决定最高频率范围(奈奎斯特定理) |
| 位深 | 每个样本的比特数 | 16 / 24 / 32 bit | 决定动态范围和信噪比 |
| 声道数 | 独立音频通道数量 | 1(单声道)/ 2(立体声) | 决定数据带宽和硬件资源 |
举个例子,CD音质是44.1kHz采样率、16位深、双声道。它的数据率怎么算?
数据率 = 采样率 × 位深 × 声道数
= 44100 × 16 × 2
= 1,411,200 bps ≈ 1.41 Mbps
我在一个对讲机项目里用过8kHz采样率、16位深、单声道。为什么选8kHz?因为人声的主要能量集中在300Hz-3.4kHz,8kHz采样率刚好满足奈奎斯特定理,还能省带宽。你想想看,如果选48kHz,数据量直接翻6倍,嵌入式系统的CPU和内存都扛不住。
1.3 I2S / PCM / TDM 总线协议详解
这三种总线,是嵌入式音频系统的「高速公路」。数据从编解码器到CPU,全靠它们传输。
1.3.1 I2S(Inter-IC Sound)总线
I2S是飞利浦公司定义的音频总线标准,也是目前最常用的。它只有三条信号线:
- BCLK(位时钟): 每个bit一个脉冲,频率 = 采样率 × 位深 × 声道数
- LRCK(帧时钟/左右声道时钟): 频率 = 采样率,高电平左声道,低电平右声道
- SDATA(串行数据): 音频数据,MSB对齐
举个例子,48kHz采样率、24位深、立体声:
BCLK频率 = 48000 × 24 × 2 = 2.304 MHz
LRCK频率 = 48000 Hz
我曾经在一个项目里把BCLK和LRCK的极性搞反了,结果音频数据全是乱的。后来用示波器一抓,才发现是时序问题。嗯,调试I2S最好的工具就是示波器,别光靠猜。
1.3.2 PCM(脉冲编码调制)总线
PCM总线和I2S很像,但时序略有不同。主要区别在于:
| 特性 | I2S | PCM |
|---|---|---|
| 数据对齐 | MSB对齐,LRCK变化后一个BCLK开始 | MSB对齐,LRCK变化时同步开始 |
| 声道标识 | LRCK电平高低区分左右 | 帧同步脉冲标识声道起始 |
| 典型应用 | 消费音频、编解码器 | 通信、VoIP、数字麦克风 |
说白了,I2S和PCM的差异主要在时序细节上。很多芯片(包括WM8960)都支持两种模式,通过寄存器配置选择。
1.3.3 TDM(时分复用)总线
TDM是I2S的扩展,可以在一条数据线上传输多个声道。比如8声道TDM,就是把8个声道的音频数据按时间片轮流传输。
TDM的应用场景很明确:多麦克风阵列、多声道音频系统。我在一个智能音箱项目里用过TDM,同时采集4个麦克风的数据做波束成形。如果用I2S,得接4条数据线,而TDM只需要1条。