【问题标题】:USB Audio Input InterruptionUSB 音频输入中断
【发布时间】:2017-12-17 10:57:45
【问题描述】:

几个月前,我问了一个与我现在遇到的问题非常相似的问题,但有点不同,我相信这个问题的答案在这里不适用。

基本上,我正在编写一个微控制器来进行 USB 音频录制(使用 USB 音频类 2.0/高速 USB)。作为测试,我只是大胆地在音频输入中记录一个简单的 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)。无论我尝试了多少框架“修复”,我似乎都无法摆脱它。如果公众同意这是一个时钟同步问题,我会更好地了解如何继续。

对此的任何帮助将不胜感激!如果需要,我会发布更多代码。谢谢

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

EDIT2 所以我已经玩弄了我用来捕获编解码器输入的缓冲区的数量。上图中显示的输出是我使用 10 个缓冲区时的结果。

当我使用一个 44.1kHz 的缓冲区(周期性;每 45 毫秒发生一次)时,情况如下:

【问题讨论】:

  • 猜测是在你应该复制 1 个音频样本的帧上......你不是。
  • 另外,在 48KHz 版本上,您不需要更改帧大小。 48000 均分为 1000(因此您应该始终每帧发送 48 个立体声样本,每个通道样本 3 个字节)
  • 嗨@RussSchultz,这是我上面代码的错误;在 48kHz 我不添加任何额外的帧(它保持在 48 * 2 * 3 = 288)。但我将从丢失的 44.1kHz 帧中回顾它。但是对于 48 kHz,看起来每次都缺少 4 个样本。我猜我错过了4帧?但这没有任何意义,因为 48 kHz 帧大小是一致的,而 44.1 kHz 你必须添加额外的帧,因为它是不均匀的

标签: audio usb microcontroller


【解决方案1】:

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

当我第一次看到这个时,我认为与时钟速率不匹配有关。在 44.1 kHz 处的衰减足够规律,它似乎只针对一个样本而衰减。下一个样本似乎也是没有丢失的样本,这意味着传入的数字数据速率无法跟上数字播放速率。缓冲区不足。

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

另外有趣的是,在 44.1 kHz 录音中存在丢失的丢失。

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

【讨论】:

  • 嗨布拉德,所以你的评论让我印象深刻...我在录制时忘记将大胆项目设置为 48 kHz!你是对的,录音正在被重新采样,这就是为什么它很不稳定。该帖子已被编辑以反映它的实际外观。至于实际辍学;当您说缓冲区欠载时...如果我理解正确,我可能只是在该特定 USB 写入时发送了不正确的帧长度?
  • 只是补充一下,因为我的字符用完了...当我不进行 USB 传输(只是将音频直接输入和输出 mcu)时,我不会在任何频率(做一个正弦波啁啾确认)。
  • 更多观察结果... 使用经过校正的 48 kHz 采样波形,您可以看到比 44.1 kHz 发生的信号丢失频率更高。此外,这很难说,但看起来它每次都发生在不同数量的样本上。你能证实吗?如果可能的话,你能把它调到 96 kHz 或 88.2 kHz 看看会发生什么吗?如果你多次运行测试,dropouts的间隔会改变吗?
  • 不幸的是,我的代码中没有内置 88.2/96 kHz 采样率选项。从我的测试会话中,它似乎确实定期发生。然而,非常有趣的是,有时记录比其他测试运行得更流畅(例如,一旦我将采样率从 44.1->48 重新配置,我会得到更纯正的正弦波/没有丢失)。一旦我对此进行更多研究,我将发布更多结果。感谢您的帮助!
  • 老实说,这是我还没有尝试过的一件事哈哈。谢谢!将你标记为帮助我的答案
猜你喜欢
  • 1970-01-01
  • 2021-09-10
  • 1970-01-01
  • 2012-11-14
  • 1970-01-01
  • 2020-12-15
  • 2014-05-06
  • 2018-09-17
  • 1970-01-01
相关资源
最近更新 更多