在嵌入式音频处理领域,如何在有限的硬件资源上实现低延迟、高可靠性的数字信号处理,一直是工程实践的核心挑战。DSPi 项目为树莓派 Pico(RP2040)和 Pico 2(RP2350)量身打造了一套完整的音频 DSP 固件解决方案,其架构设计在 DMA 管道管理、I2S 外设集成以及实时信号处理流水线方面积累了大量可落地的工程参数。本文将从这三个维度出发,剖析其核心实现机制,为从事同类开发的工程师提供可直接参考的技术细节。
DMA 管道架构:从 USB 音频到输出的全链路设计
DSPi 固件的 DMA 管道设计是实现零 CPU 开销音频传输的关键。整个数据流采用双核分工模式:Core 0 负责 USB 通信、音频流处理和第一对 S/PDIF 输出的 EQ 与转换;Core 1 则根据配置工作在三种模式之一 ——PDM 模式下运行 delta-sigma 调制器用于超低音输出,EQ Worker 模式下并行处理更高编号的 S/PDIF 输出通道,或在空闲模式下降低功耗。
在 DMA 控制器配置层面,S/PDIF 输出使用 PIO0 状态机完成 BMC 编码与 NRZI 调制,每个输出槽位共享同一个 PIO 程序但通过不同的 FIFO 入口实现独立数据流。值得注意的是,项目使用固定系统时钟 307.2 MHz(VCO 1536 MHz / 5 / 1),这一设计确保了 PIO 分频器在所有支持的采样率(44.1 kHz、48 kHz、96 kHz)下均为整数分频,避免了时钟切换引入的瞬态噪声。RP2040 需要 1.15 V 核心电压才能稳定运行在这一超频频率,而 RP2350 则在同一电压下轻松达成。
USB 音频输入通过 Pico SDK 的 USB Audio Class 实现,支持 16-bit 和 24-bit PCM 格式,采样率通过标准的 USB Audio Rate Set 请求动态切换。固件维护了一个深度可配置的环形缓冲区,统计信息包括 USB PHY 错误计数器(CRC 错误、位填充错误、超时、溢出、序列错误)以及 S/PDIF DMA starvation 计数器 —— 后者直接反映输出侧是否存在因数据供应不足导致的静音填充事件,是评估系统稳定性的关键指标。
I2S 与 S/PDIF 输出:PIO 编程与运行时配置
DSPi 在输出端同时支持 I2S 和 S/PDIF 两种数字音频格式,且每个输出槽位可在运行时独立切换,无需重新烧录固件。I2S 输出采用标准的 24-bit 左对齐格式(MSB 在前),32 位帧结构,所有 I2S 槽位共享同一个 BCK/LRCLK 时钟对。由于 PIO 侧边输出约束,LRCLK 引脚始终固定为 BCK 引脚编号加 1,这一限制在硬件布线时必须提前规划。
可选的 master clock(MCK)支持 128× 或 256× 采样率倍率输出。在 96 kHz 采样率下,由于 PIO 时钟分频器的限制,仅支持 128× 倍率。MCK 引脚同样可通过 REQ_SET_MCK_PIN 命令在运行时重新映射,这对使用外置 PLL 的 DAC 芯片尤为重要。
S/PDIF 输出使用 PIO 状态机完成 biphase mark code 编码,光学输出需要外接 Toshiba TX179 等 Toslink 发射器,或者通过简单的电阻分压器实现同轴输出。所有输出 GPIO 引脚(包括 I2S BCK 和 MCK)均支持运行时重映射,通过 REQ_SET_OUTPUT_PIN 命令可指定新的引脚编号,固件会自动执行禁用 - 重配 - 启用的序列,整个过程约产生 1 ms 的该输出通道音频中断。GPIO 12(UART TX)以及 GPIO 23-25(电源控制与 LED)为保留引脚,不可分配给输出使用。
五级实时信号处理流水线:参数化设计
DSPi 将音频处理划分为五个依次执行的 Pass,每个 Pass 都有明确的处理阶段和可配置参数:
Pass 1 – Per-Channel Preamp(每通道前置放大):在信号进入 DSP 链之前对 USB 输入的左右声道分别施加独立增益(单位:dB),范围为 -inf 至 +20 dB。此阶段位于链路最前端,确保后续所有处理都基于统一电平。
Pass 2 – Master EQ(主参数均衡):每个主声道支持最多 10 段参量均衡,支持六种滤波器类型 ——Flat(旁通)、Peaking(峰值)、Low Shelf(低架)、High Shelf(高架)、Low Pass(低通)、High Pass(高通)。RP2040 使用 Q28 定点算术和转置直接二型(TDF2)Biquad 实现;RP2350 则采用混合 SVF/Biquad 架构 —— 截止频率低于 Fs/7.5(约 6.4 kHz @ 48 kHz)的滤波器使用 Cytomic SVF(线性梯形积分)拓扑以获得更优的低频数值精度,高于此阈值的滤波器回退到传统 Biquad 以节省周期。
Pass 2.5 – Volume Leveller(音量平衡器):可选的 RMS 检测向上压缩器,使用软拐点(soft-knee)过渡,立体声联动(左右声道中较响者决定增益),确保安静内容被提升而响亮内容保持不变。关键参数包括:目标电平、压缩速度、向上增益上限(-6 dBFS 安全限制器防止过载)、10 ms 前瞻(lookahead)开关以及噪声门阈值。当 PDM 超低音输出启用时,Core 1 被 delta-sigma 调制器完全占用,Volume Leveller 仍在 Core 0 上正常执行。
Pass 3 – Headphone Crossfeed + Loudness(耳机交叉馈送 + 响度补偿):Headphone Crossfeed 实现 BS2B(Bauer Stereophonic-to-Binaural)交叉馈送,配合一阶全通滤波器产生约 220 μs 的耳间时间延迟(ITD),模拟 60 度立体声扬声器摆放的声道间时间差。提供三档预设(Default 700 Hz / 4.5 dB、Chu Moy 700 Hz / 6.0 dB、Jan Meier 650 Hz / 9.5 dB)以及自定义频率(500–2000 Hz)和馈送电平(0–15 dB)参数。Loudness Compensation 基于 ISO 226:2003 等响曲线,根据当前 USB 主机音量位置动态调整 EQ,补偿人耳在低音量下对低频和高频敏感度下降的生理特性。
Pass 4 – Matrix Mixer(矩阵混音器):将 USB 立体声输入路由至全部输出通道。RP2350 实现 2×9 矩阵(9 路输出),RP2040 为 2×5 矩阵。每个交叉点支持独立启用、增益(-inf 至 +12 dB)和相位反转。当某输出通道被禁用时,其后续处理(EQ、延迟、D/A 转换)被完全跳过以节省 CPU 周期。
Pass 5 – Per-Output EQ + Gain + Mute + Delay(输出级处理):每个输出通道拥有独立的 10 段参量均衡(与 Master EQ 相同的滤波器类型集)、增益调节(-inf 至 +12 dB)、静音控制和可调延迟(最长 85 ms,对应 48 kHz 下 4096 采样点)。延迟参数用于多路音箱与超低音之间的时域对齐,固件自动补偿 S/PDIF/I2S 与 PDM 输出之间的路径延迟差。Master Volume(-128 dB 静音哨兵值至 0 dB)在该阶段与各输出增益相乘,由于已在最后一级完成,实际计算开销为零。
工程实践要点与监控参数
在生产部署中,以下监控参数应纳入系统健康度评估:Peak meter(每个通道的峰值电平与削波检测)、CPU 负载(Core 0 与 Core 1 分别报告)、Buffer fill statistics(缓冲区填充深度统计)、PDM ring buffer over/underrun(超低音环形缓冲区溢出与下溢)、S/PDIF DMA starvations(每个槽位的 DMA 饥饿事件计数)。当 starvation 计数器持续增长时,通常意味着 Core 1 负载过高或 DMA 优先级配置不当,需要检查输出通道数量与 EQ 复杂度是否超出当前平台的处理能力。
固件支持 10 槽位预设系统,每个槽位存储完整 DSP 状态(含引脚分配),并可通过 USB 批量参数传输(REQ_GET_ALL_PARAMS / REQ_SET_ALL_PARAMS)在单次控制传输中同步约 2.9 KB 的完整状态数据。诊断信息可通过 REQ_GET_STATUS 命令按需获取,wValue 字段选择不同的 telemetry 类别。
资料来源:DSPi 项目 GitHub 仓库(https://github.com/WeebLabs/DSPi),该固件同时支持 RP2040 与 RP2350 平台,已进入生产就绪状态。