几个月前,我问了一个与我现在所遇到的问题非常相似的问题,但是有一点不同,我相信这个问题的答案在这里不适用。
基本上,我正在对一个微 Controller 进行编程以进行USB音频记录(使用USB Audio Class 2.0 /高速USB)。作为测试,我只是大胆地在音频输入中记录一个简单的440 Hz正弦波,以查看是否可以得到干净的信号。记录此正弦波时,我会在波形中遇到非常周期性的中断。此中断以试图变为0或静音的录制信号的形式出现。然后正常继续。如图所示:
采样率-44.1 kHz:
采样率-48 kHz:
如您所见,在48 kHz采样率下,中断时间更长。我想我的MCU的编解码器数据转到USB时会遇到一些奇怪的问题。停用USB(基本上是编解码器输入-> mcu->编解码器输出)时,我没有任何问题。
以下是如何计算从苹果公司的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个缓冲区时。
这是当我使用一个44.1kHz的缓冲区(周期性;每45毫秒发生一次)时的样子:
最佳答案
我没有任何微 Controller 知识,但是有一些观察...
当我第一次看到这个时,我就认为与时钟速率不匹配有关。压降足够规则,为44.1 kHz,似乎恰好一个采样就压降了。同样,下一个样本似乎是没有丢失的情况下存在的样本,这意味着传入的数字数据速率无法跟上数字回放速率。缓冲区不足。
您的48 kHz录音虽然很有趣。在这种情况下,零值近似于几个样本,并且波形在下潜至零之前和之后有点不稳定。这意味着在事物的模拟方面还有更多问题。不过,根据您的发言,这里没有模拟域音频...那么我的理论是,您的48 kHz录音实际上并不是低电平发生的事情,并且已经对高达48 kHz的44.1 kHz进行了重新采样。
同样有趣的是44.1 kHz录音中缺少丢失。
我认为了解辍学是否得到保证以及是否以确切的频率得到保证将很有用。我认为最好在此处确认整个信号路径,并确保在测试中不进行软件重采样。