为USB音频扩展数字信号处理
在本应用笔记中,我们将描述如何将DSP功能扩展到XMOS USB音频堆栈中。
USB音频是一款高度可配置的软件;在其最简单的形态中,它可能只是将单个ADC与USB音频接口连接起来;但它还可以处理多种I2S、TDM、DSD、S/PDIF、ADAT等接口。通常数据只是实时传输,但可能感兴趣的DSP可能包括:
- 均衡器
- 混音器
- 动态范围压缩器
- 音频效果器
本应用笔记讨论了USB音频堆栈提供的API,以便您可以在堆栈中包含DSP算法。
作为参考,我们提到了以下您可能想要使用的仓库:
- http://github.com/xmos/sw_usb_audio.git 用于USB音频参考设计
- https://github.com/xmos/lib_xua.git 用于USB音频库设计
USB音频简介
USB音频的基本结构如图1所示。左侧是USB接口连接到主机,这部分由XUD和XUA库处理。XUD 是xcore的底层USB库,XUA 是在xcore上实现的USB音频协议。右侧是一系列接口(ADC,DAC,S/PDIF,ADAT)。USB音频提供了从左到右(USB主机计算机到接口)的路径,这被称为输出路径;还有从右到左(接口到USB主机计算机)的路径,这被称为输入路径。这里所说的输入路径和输出路径是以主机(例如PC或手机)为中心的命名方式,我们之所以这样使用输入和输出,是因为它与USB标准的术语一致。
XU316设备有两个 Tile (tiles),在许多设计中,其中一个 Tile 将是空的。但这并不总是这样,可能会出现ADC/DAC I/O引脚位于另一个 Tile 上的情况。对于添加简单的DSP来说,这种微妙的差别并不重要。此外,用于USB堆栈的物理核心可能是 Tile 0或 Tile 1,这取决于设计。
USB音频提供的API
USB音频栈提供了一个您需要重写的函数,以便在系统中添加任何DSP功能:
extern void UserBufferManagement (
unsigned output_samples[NUM_OUTPUTS],
unsigned input_samples[NUM_INPUTS]
);
为了简洁,我们在这段代码中使用NUM_OUTPUTS和NUM_INPUTS来分别指代输出音频通道数(NUM_USB_CHAN_OUT)和输入音频通道数(NUM_USB_CHAN_IN)。
UserBufferManagement