几个月前,我问了一个非常类似的问题,问我现在正在经历什么,但是有点不同,我相信这个问题的答案在这里不适用。
基本上,我正在编程一个微控制器来进行USB音频录制(使用USB Audio Class 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)。无论我尝试多少框架“修复”,我似乎都无法摆脱它。如果公众同意这是一个时钟同步问题,我会更好地了解如何继续。
对此有任何帮助将不胜感激!如果需要,我会发布更多代码。感谢
编辑结果我以44.1kHz的采样率记录了Audacity中的48 kHz正弦波。我已经改变了48 kHz录音的图像,以显示正确的采样录音。
EDIT2 所以我玩过用于捕获编解码器输入的缓冲区数量。上图中显示的输出是当我使用10个缓冲区时。
答案 0 :(得分:1)
我没有任何微控制器知识,但有些观察......
当我第一次看到这个时,我认为与时钟频率不匹配有关。辍学在44.1 kHz处足够规律,对于一个样本似乎辍学。看起来下一个样本是没有丢失的情况,这意味着输入的数字数据速率无法跟上数字播放速率。缓冲区不足。
你的48 kHz录音很有意思。在这种情况下,零值近似为几个样本,并且波形在之前和下潜之后变得零。这意味着在模拟方面存在更多问题。根据你所说的,这里没有模拟域音频...我的理论是你的48 kHz录音并不是真正发生在低级别的事情,而且重采样44.1 kHz至48 kHz。
同样有趣的是,44.1 kHz录音中有一个丢失的丢失。
我认为知道退出是否得到保证,并确保是否以确切的频率保证是有用的。我认为在这里确认整个信号路径也是一件好事,并确保在测试中没有进行软件重采样。