USB 音频输入中断

USB Audio Input Interruption

几个月前,我问了一个与我现在遇到的问题非常相似的问题,但有点不同,我认为该问题的答案不适用于此处。

基本上,我正在编写一个微控制器来进行 USB 录音(使用 USB 音频 Class 2.0/高速 USB)。作为测试,我只是在 audacity 的音频输入中录制一个简单的 440 Hz 正弦波,看看我是否可以获得干净的信号。当我记录这个正弦波时,我在波形中发现了一个非常周期性的中断。这种中断以记录信号试图变为 0 或静音的形式出现。然后它继续正常。如图:

采样率 - 44.1 kHz:

采样率 - 48 kHz:

如您所见,48 kHz 采样率的中断时间更长。当我的 mcu 的编解码器数据转到 USB 时,我猜我遇到了一些奇怪的问题。当我停用 USB 时没有问题(基本上是编解码器输入 -> mcu -> 编解码器输出)。

以下是我如何计算从 Apple 的 USB 音频指南中获得的帧长度(使用 44.1kHz 采样率和 24 比特率):

#define AUDIO_POLL_INT     4
#define FRAME_BYTES        3
#define NUM_CHANNELS       STEREO

// Calculate the frame length
uint16_t frame_len = 44 (44.1kHz/1000 samples) * NUM_CHANNELS * FRAME_BYTES;
// Every 10 ms, calculate frame length with additional frame (only applies to 44.1kHz sample rate)
if (!(frame_pos % 9)) frame_len += (1 * NUM_CHANNELS * FRAME_BYTES)

// Increment frame position per usb call
frame_pos = (((frame_pos + 1) / 8) * (2 << (AUDIO_POLL_INT-1))) % 10;

到目前为止...我唯一能想到的导致此问题的原因是 USB 时钟和编解码器时钟之间的同步(USB 为 12 MHz,编解码器为 11.2896 MHz 或 12.288 MHz)。无论尝试多少帧 "fixes",我似乎都无法摆脱它。如果一般 public 同意这是一个时钟同步问题,我会对如何继续进行更好的了解。

如有任何帮助,我们将不胜感激!如果需要,我会 post 更多代码。谢谢

EDIT 原来我在 Audacity 中以 44.1kHz 的采样率录制了 48kHz 的正弦波。我已经更改了 48 kHz 录音的图片以显示正确的采样录音。

EDIT2 因此,我研究了用于捕获编解码器输入的缓冲区数量。上图中显示的输出是我使用 10 个缓冲区时的结果。

这是我在 44.1kHz 下使用一个缓冲区时的样子(周期性;每 45 毫秒发生一次):

我没有任何微控制器知识,但有一些观察...

当我第一次看到这个时,我假设与时钟速率不匹配有关。在 44.1 kHz 时,信号丢失非常规律,似乎恰好在一个样本中信号丢失。下一个样本似乎也是没有丢失的样本,这意味着输入的数字数据速率无法跟上数字播放速率。缓冲区欠载。

虽然你的 48 kHz 录音很有趣。在这种情况下,零值近似于几个样本,并且波形在下潜到零之前和之后变得不稳定。这意味着在事物的模拟方面更多地存在一些问题。不过,根据您所说的,这里没有模拟域音频……我的理论是您的 48 kHz 录音并不是真正发生在低电平的情况,并且某些东西已将 44.1 kHz 重新采样到 48 kHz。

同样有趣的是,在 44.1 kHz 录音中缺少丢失。

我认为了解辍学率是否得到保证以及是否以准确的频率得到保证会很有用。我认为最好在这里确认整个信号路径,并确保在您的测试中没有进行软件重采样。