第3章 MTK8676音频硬件架构:音频编解码器(Codec)介绍、I2S/TDM/PDM接口详解、DSP与NPU协同处理路径、硬件音频通路图

各位工程师朋友,咱们今天来啃一块硬骨头——MTK8676的音频硬件架构。说实话,我第一次拿到这颗芯片的datasheet时,也被那密密麻麻的框图吓了一跳。但别怕,我带你一层层剥开它。

3.1 音频编解码器(Codec)介绍

MTK8676内部集成了一个多通道音频Codec。这玩意儿说白了就是负责模拟信号和数字信号之间的来回转换。我习惯把它分成三块来看:

  • ADC通道:麦克风进来的模拟信号,转成数字信号给DSP处理
  • DAC通道:DSP处理完的数字信号,转成模拟信号推喇叭
  • 数字接口:跟外部Codec或放大器通信的通道

我在项目中遇到过一个问题:用内部Codec做双麦降噪时,发现底噪特别大。查了半天,原来是ADC的增益没配好。嗯,这里要注意——内部Codec的ADC最大支持到110dB SNR,但实际能跑到多少,取决于你的PCB布局和电源质量。

关键参数速查表:

参数内部Codec外部Codec(选配)
ADC SNR110dB120dB+
DAC SNR112dB125dB+
采样率8kHz~192kHz8kHz~384kHz
通道数2入2出4入8出

3.2 I2S/TDM/PDM接口详解

这三个接口,是音频工程师的吃饭家伙。我一个个说。

3.2.1 I2S接口

I2S是最经典的音频数字接口。它用三根线:BCK(位时钟)、LRCK(左右声道时钟)、SD(数据线)。MTK8676支持标准的I2S格式,也支持左对齐和右对齐。我个人习惯用标准I2S,兼容性最好。

为什么会这样?因为很多外部Codec默认就是I2S模式,省得你来回调寄存器。

3.2.2 TDM接口

TDM是I2S的升级版。它可以在一条数据线上传多个声道。比如8通道TDM,一根SD线就能搞定8个麦克风的数据。MTK8676支持2/4/8/16通道TDM。

我的经验:做多麦阵列时,TDM比I2S省GPIO。但要注意TDM的时隙对齐问题。我曾经因为时隙配错了一个bit,导致第3个麦和第4个麦的数据串了,排查了两天才找到原因。

3.2.3 PDM接口

PDM接口是数字麦克风专用的。它只有两根线:CLK和DATA。MTK8676内部有PDM转PCM的硬件滤波器,可以直接接数字MEMS麦克风。

你想想看,PDM的好处是什么?省走线、抗干扰。坏处呢?带宽有限,一般只支持到48kHz采样率。做语音唤醒足够了,但做高保真录音就不太够。

3.3 DSP与NPU协同处理路径

这是MTK8676最牛的地方。它把DSP和NPU串在了一起,形成了一条完整的音频处理流水线。

我画个简化的路径图给你看:

麦克风 → ADC → DSP(降噪/波束成形) → NPU(语音识别) → DSP(回声消除) → DAC → 喇叭

实际流程比这复杂得多。我拆开讲:

  1. DSP负责前端处理:包括AEC(回声消除)、ANC(主动降噪)、BF(波束成形)。这些算法对实时性要求高,DSP的延迟控制在5ms以内。
  2. NPU负责后端识别:唤醒词检测、语音识别。NPU跑神经网络模型,一次推理大概10-20ms。
  3. 共享内存机制:DSP处理完的数据,通过共享内存直接喂给NPU,不需要经过CPU中转。延迟能降低30%以上。

注意:DSP和NPU共用DDR带宽。如果你的模型太大,或者DSP处理链太长,可能会抢带宽。我建议你提前算好带宽预算,别等到调优时才发现瓶颈。

3.4 硬件音频通路图

好了,咱们把上面这些串起来,画一张完整的音频通路图。这张图我建议你打印出来贴在工位上。

┌─────────────────────────────────────────────────────────┐
│                    MTK8676 SoC                          │
│  ┌──────────┐    ┌──────────┐    ┌──────────┐         │
│  │ 内部Codec │───▶│   DSP    │───▶│   NPU    │         │
│  │ ADC/DAC   │    │ 降噪/回音 │    │ 唤醒/识别 │         │
│  └────┬─────┘    └────┬─────┘    └────┬─────┘         │
│       │               │               │                │
│  ┌────┴─────┐    ┌────┴─────┐    ┌────┴─────┐         │
│  │ I2S/TDM  │    │ 共享内存  │    │ 模型推理  │         │
│  │ 接口     │    │ 缓冲区    │    │ 引擎     │         │
│  └────┬─────┘    └──────────┘    └──────────┘         │
│       │                                                │
│  ┌────┴─────┐                                          │
│  │ PDM接口   │                                          │
│  └──────────┘                                          │
└─────────────────────────────────────────────────────────┘
         │                    │
         ▼                    ▼
  外部Codec/AMP         数字MEMS麦

这张图里,我特别想强调两个点:

  • 数据流是单向的:从麦克风到喇叭,数据只往前走,不走回头路。这样可以避免环路自激。
  • 共享缓冲区是关键:DSP和NPU之间的数据交换,全靠这块共享内存。我建议你把它放在DDR的固定地址,不要用动态分配,否则容易出时序问题。

避坑指南:我曾经在一个项目里,把DSP的输出缓冲区设得太小,导致NPU读数据时丢帧。后来改成双缓冲机制——DSP写一块,NPU读另一块,交替使用。问题就解决了。

好了,这一章的内容就这些。音频硬件架构是语音助手的地基,地基不稳,上面调得再好也白搭。下一章咱们开始讲实际的调优方法,到时候会用到今天这些知识。

公众号:蓝海资料掘金营,微信deep3321