第一章 音频硬件基础:数字音频的“三驾马车”

各位同学,咱们今天聊聊数字音频的基础。说实话,我刚开始接触音频驱动时,也被那些术语搞得头大。什么采样率、位深、声道数,听起来像天书。但后来我发现,搞懂这三样东西,数字音频的大门就算敲开了。

1.1 采样率、位深、声道数

先说说采样率。说白了,就是把连续的模拟信号,每隔一段时间“咔嚓”拍一张照片。这个拍照的频率,就是采样率。常见的采样率有:

  • 8kHz:电话语音,够用就行
  • 44.1kHz:CD音质,音乐播放的标配
  • 48kHz:DVD/视频常用,我项目里大部分用这个
  • 96kHz/192kHz:高保真音频,发烧友的最爱

为什么是44.1kHz?这跟奈奎斯特定理有关——采样率至少要是信号最高频率的两倍。人耳能听到20kHz,所以44.1kHz刚好够用。我在一个项目中遇到过客户非要上192kHz,结果Codec不支持,折腾了两天才发现是规格书看错了。嗯,这里要注意,不是越高越好,硬件得跟上。

再说位深。位深决定了每个采样点的精度。打个比方:

  • 16位:CD标准,动态范围约96dB
  • 24位:专业音频,动态范围约144dB
  • 32位:浮点处理,一般用于内部计算

位深越大,能记录的细节越多。但代价是数据量翻倍。我习惯用24位做录音项目,16位做播放项目。为什么?录音需要更多动态余量,播放嘛,16位人耳基本听不出区别。

最后是声道数。这个最简单:

  • 单声道(Mono):一个通道,比如对讲机
  • 立体声(Stereo):左右两个通道,耳机标配
  • 多声道(5.1/7.1):家庭影院,每个音箱一个通道

你想想看,如果采样率是48kHz,位深24位,立体声,那一秒钟的数据量是多少?48k × 24 × 2 = 2.304Mbps。这个数字在配置DMA时很有用,后面会讲到。

核心公式:数据速率 = 采样率 × 位深 × 声道数

记住这个,配置DMA和I2S时钟时天天用。

1.2 I2S/PCM/TDM总线协议

数字音频数据怎么在芯片之间传输?靠的就是这些总线协议。我最早接触的是I2S,后来发现PCM和TDM其实是一家人。

I2S总线

I2S(Inter-IC Sound)是飞利浦发明的,三根线搞定:

  • BCLK:位时钟,每个bit一个脉冲
  • LRCK:左右声道选择,高电平左声道,低电平右声道
  • SDATA:数据线,串行传输

I2S的时序有个特点:数据在BCLK的下降沿变化,在上升沿采样。这个细节我在调试时吃过亏——有一次波形看起来都对,就是没声音,最后发现是Codec和CPU的相位反了。加个反相器搞定。

PCM协议

PCM(Pulse Code Modulation)跟I2S很像,但时序略有不同。PCM的帧同步信号是一个短脉冲,不像I2S那样占半个周期。我个人习惯把PCM看作I2S的变种,实际项目中两者经常混用。

TDM协议

TDM(Time Division Multiplexing)就厉害了。它可以在一条数据线上传输多个声道。比如8个声道,每个声道轮流占用一个时隙。这在多麦克风阵列中很常见。

我曾经在一个项目中用TDM接了4个数字麦克风,每个麦克风占2个时隙,总共8个通道。配置时隙偏移量时折腾了半天,最后发现是Codec的寄存器没写对。避坑指南:TDM的时隙对齐一定要看规格书的时序图,别想当然。

我的经验:I2S适合立体声,TDM适合多声道。如果只是耳机输出,I2S就够了。如果是智能音箱的麦克风阵列,TDM是首选。

1.3 Codec与DMA控制器

Codec是音频的“翻译官”。它负责把数字信号转成模拟信号(DAC),或者把模拟信号转成数字信号(ADC)。Codec内部通常还有:

  • 混音器(Mixer):把多路音频混合
  • 增益控制:调节音量
  • 滤波器:去噪、去混叠

DMA控制器呢?它是数据的“搬运工”。CPU很忙,不能一直盯着音频数据。DMA可以自动从内存搬数据到I2S发送FIFO,或者从I2S接收FIFO搬数据到内存。这样CPU就能腾出手来做别的事。

配置DMA时要注意:

  • 数据宽度:16位还是24位?跟位深匹配
  • 突发传输:一次搬多少个字?我一般设4或8
  • 循环模式:播放时用循环,录音时用单次

注意:DMA的优先级设置要小心。如果DMA优先级太低,音频数据可能来不及搬,导致FIFO下溢(播放时出现爆音)或上溢(录音时丢数据)。我曾经因为这个被客户投诉过,后来把DMA优先级调到最高才解决。

1.4 常见的音频硬件拓扑结构

搞懂了上面的东西,咱们来看看实际硬件是怎么连的。常见的拓扑有几种:

方案一:CPU + Codec

最简单的方案。CPU的I2S接口直接连Codec。适合耳机、扬声器输出。我最早做的MP3播放器就是这种结构。

方案二:CPU + DMA + Codec

CPU通过DMA搬运数据,减轻CPU负担。适合需要持续音频流的场景,比如音乐播放器。

方案三:CPU + DSP + Codec

DSP负责音频处理(降噪、回声消除等),CPU只做控制。适合智能音箱、语音助手。

方案四:多Codec + TDM

多个Codec通过TDM总线共享一条数据线。适合多声道录音或播放。

下面我画了一张图,帮你理清这些关系:

CPU I2C控制 DMA 数据搬运 内存 音频缓冲区 I2S BCLK/LRCK/SD Codec DAC/ADC 扬声器 麦克风 数据流 I2C控制 DMA读取 I2S数据 模拟输出 模拟输入 典型音频硬件拓扑:CPU + DMA + I2S + Codec

这张图展示的是最典型的方案。CPU通过I2C配置Codec,DMA从内存搬数据到I2S接口,I2S把数字音频传给Codec,Codec转成模拟信号驱动扬声器。反过来,麦克风的模拟信号经Codec转成数字,通过I2S传回DMA,存入内存。

你想想看,这个流程里每一步都离不开我们刚才讲的知识。采样率决定了I2S的BCLK频率,位深决定了DMA的数据宽度,声道数决定了I2S的LRCK频率。环环相扣,缺一不可。

避坑指南:我曾经在一个项目中,CPU和Codec的I2S时钟极性配置反了,导致数据错位。调试了整整一天,最后用逻辑分析仪抓波形才发现。所以我的建议是:先看规格书的时序图,再用逻辑分析仪验证,最后才写驱动代码。

好了,这一章的内容就到这里。音频硬件基础是后面所有章节的基石,搞懂了这些,后面学ALSA驱动框架、PCM设备注册、DMA缓冲区管理就会轻松很多。


专注资料整理