在嵌入式音频处理领域,将成本不到两杯咖啡钱的树莓派 Pico(RP2040)或 Pico 2(RP2350)变成一台具备完整数字音频处理能力的 USB 声卡,这个想法听起来像是天方夜谭。然而 DSPi 项目用工程化的实现证明了这一点。它不仅实现了 24 位音频的端到端处理,还提供了参量均衡、矩阵混音、响度补偿、耳机交叉馈送等完整 DSP 功能。本文将从底层架构视角,剖析其 I2S+DMA 管道设计、双核处理模型以及滤波器实现细节,为嵌入式音频固件开发提供可落地的参数与设计思路。
核心架构:USB 音频输入到多格式输出的完整管道
DSPi 的音频信号链路设计遵循线性、低延迟原则,整个处理流程被划分为五个独立通道。USB 输入端支持 16 位或 24 位 PCM 立体声,采样率涵盖 44.1 kHz、48 kHz 和 96 kHz 三档。值得注意的是,系统时钟固定在 307.2 MHz(VCO 1536 MHz 除以 5 再除以 1),这一选择使得 PIO 分频器在所有支持的采样率下都能得到整数比值,从而避免了因时钟切换导致的音频截断或爆音。RP2040 需要将核心电压提升至 1.15 V 才能稳定运行在这一频率,而 RP2350 则可以轻松达成。
音频数据进入固件后的第一道处理是 PASS 1 级别的独立通道前级放大,每一路 USB 输入(左 / 右)都有独立的增益控制,单位为分贝。这个前级增益在 DSP 链路的最前端施加,确保后续所有处理都基于统一的电平基准。PASS 2 阶段执行主通道的 10 段参量均衡,这里是整个管道中计算量最大的模块之一。PASS 2.5 是可选的响度级(Volume Leveller),一种基于 RMS 检测的向上压缩器,用于在不同响度的音源之间保持一致的感知音量。PASS 3 处理耳机交叉馈送(基于 BS2B 算法的立体声转双耳转换)以及主峰值电平表。PASS 4 是矩阵混音器,将两路 USB 输入路由到最多 9 路输出(RP2350)或 5 路输出(RP2040),每个交叉点都有独立的增益和相位反转控制。最后在 PASS 5 阶段,每路输出独立经过 10 段输出均衡、增益调节、延时校正,然后乘以主音量系数后送往外设。
在输出端,每个编号槽位都可以在运行时动态配置为 S/PDIF 或 I2S 格式。I2S 输出采用标准的 24 位数据、左对齐帧格式、MSB 在前的位序,所有 I2S 槽位共享同一组 BCK(位时钟)和 LRCLK(左右时钟),LRCLK 固定为 BCK 加 1,这是由 PIO 侧置约束决定的物理限制。可选的 MCK(主时钟)支持 128 倍或 256 倍采样率输出,某些外部 DAC 需要这一路时钟才能正常工作。此外还有一路专用的 PDM 低音炮输出,使用二阶 Delta-Sigma 调制器运行在 256 倍过采样(48 kHz 时为 12.288 MHz 位时钟),配合 TPDF 抖动和噪声整形,可以直接驱动有源低音炮而无需额外 DAC。
双核处理模型:计算资源的精细分配
RP2040 和 RP2350 都是双核处理器,DSPi 充分利用了这一特性来并行化音频处理。Core 0 承担了大部分职责:USB 通信、音频数据流接收、DSP 处理(包括主均衡、交叉馈送、响度补偿、矩阵混音以及第一对 S/PDIF 输出的均衡和转换)以及控制逻辑。Core 1 则有三种工作模式,根据当前配置动态切换。
当 PDM 低音炮输出被启用时,Core 1 完全专注于二阶 Delta-Sigma 调制器,此时只能使用前两路 S/PDIF 输出(一对立体声)。当 PDM 关闭且高编号输出被激活时,Core 1 作为 EQ Worker 运行,处理输出 3 至 8(RP2350)或输出 3 至 4(RP2040)的均衡、延时和 S/PDIF 转换,与 Core 0 并行处理。如果既不使用 PDM 也不使用高编号输出,Core 1 处于空闲状态。这种动态切换机制使得有限的计算资源始终用在了最需要的地方。
在数学处理引擎方面,两个平台采用了截然不同的策略。RP2040 使用 28 位定点数(Q28)运算,配合手写优化的 ARM 汇编代码处理内层 DSP 循环,以弥补缺少硬件浮点单元的性能损失。RP2350 则得益于内置的硬件 FPU,采用了单精度浮点流水线。更关键的是,RP2350 的滤波器实现采用了混合拓扑:低于采样频率七点五分之一(约 6.4 kHz,48 kHz 采样率下)的滤波器使用 Cytomic SVF(状态变量滤波器)的线性梯形积分形式,而更高频率的滤波器则使用传统的二阶直接形式 II(TDF2)双二阶滤波器。SVF 拓扑在低频段具有出色的数值精度,避免了传统双二阶滤波器在低频高 Q 值情况下因系数量化产生的频偏问题。
延迟特性与工程化参数
对于实时音频处理而言,延迟是核心指标之一。DSPi 的端到端延迟取决于多个因素:USB 主机端的缓冲策略、USB 控制器本身的处理延迟、以及固件内部的处理延迟。在 48 kHz 采样率下,典型的 USB 音频帧间隔约为 20.83 毫秒,固件内部每个处理通道的缓冲区深度约为几十到上百样本。值得称道的是,DSPi 在 S/PDIF 输出路径上实现了自动 latency compensation(延迟补偿),确保 S/PDIF/I2S 和 PDM 两条输出路径在时域上对齐。每路输出支持最多 85 毫秒的延时(48 kHz 下为 4096 样本),足以满足绝大多数扬声器与低音炮的物理位置对齐需求。
系统监控方面,固件提供了丰富的遥测数据。通过 USB 控制协议的 GET_STATUS 请求,可以获取每路通道的峰值电平、CPU 负载百分比、PDM 环形缓冲区 overrun/underrun 计数、S/PDIF DMA starvation 计数等关键指标。Starvation(饥饿)事件表示 S/PDIF DMA 需要缓冲区但消费者池为空,此时固件会插入静默缓冲区作为替补,这比传统的基于 USB 数据包间隙的 underrun 计数更能反映输出侧的真实 dropout 情况。此外还有 USB PHY 层错误计数器(CRC 错误、位填充错误、超时、溢出、序列错误)用于诊断物理层连接质量。
实践要点
开发类似的嵌入式音频固件时,有几个关键参数值得特别关注。系统时钟的选择应当使 PIO 分频器在目标采样率下得到整数结果,DSPi 选用的 307.2 MHz 恰好满足 44.1、48、96 kHz 三档采样率的整数分频要求。缓冲区大小的设计需要在延迟和稳定性之间取得平衡,过大的缓冲会增加延迟,过小则可能导致 underrun。RP2040 平台若要运行在 307.2 MHz,核心电压必须从默认的 1.10 V 提升至 1.15 V 以上,否则可能出现不稳定。滤波器设计方面,若目标应用涉及低频段的高 Q 值均衡(如房间校正中的陷波滤波器),建议在 RP2350 上利用 SVF 拓扑的低频精度优势,或者在 RP2040 上适当提升定点数的运算精度。
固件的 USB 控制协议采用 Vendor Class 接口,在 Windows 上通过 WinUSB/WCID 实现无驱安装,在 macOS 上通过 Interface 0 控制。固件支持通过 USB 进入 UF2 引导加载器进行在线升级,这一特性使得产品可以在不拆机的情况下推送新版本固件。所有输出 GPIO 引脚(包括 I2S 的 BCK 和 MCK)都支持运行时重配置,无需重新烧录,这为定制 PCB 设计提供了极大的灵活性。
资料来源:DSPi 项目 GitHub 仓库(https://github.com/WeebLabs/DSPi)