【发布时间】:2017-12-17 10:57:45
【问题描述】:
几个月前,我问了一个与我现在遇到的问题非常相似的问题,但有点不同,我相信这个问题的答案在这里不适用。
基本上,我正在编写一个微控制器来进行 USB 音频录制(使用 USB 音频类 2.0/高速 USB)。作为测试,我只是大胆地在音频输入中记录一个简单的 440 Hz 正弦波,看看我是否能得到一个干净的信号。当我记录这个正弦波时,我会在波形中得到一个非常周期性的中断。这种中断以记录信号的形式出现,试图达到 0 或静音。然后它继续正常。如图:
如您所见,在 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 个缓冲区时的结果。
【问题讨论】:
-
猜测是在你应该复制 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