2017-08-22 43 views
0

我有一个应用程序,使用ALSA在8Khz采样音频。这是通过设置snd_pcm_hw_params(),并且可以通过查看/ proc予以确认:ALSA采样率漂移与单调时钟

cat /proc/asound/card1/pcm0c/sub0/hw_params 
access: MMAP_INTERLEAVED 
format: S32_LE 
subformat: STD 
channels: 12 
rate: 8000 (8000/1) 
period_size: 400 
buffer_size: 1200 

样品的计数阅读随时间有效地是一个单调时钟。 如果我用系统单调时钟比较读取的样本数,我注意到随着时间的推移会出现漂移。相对于单调时钟,采样时钟似乎每5个小时大约损失1s。 我有代码可以在应用程序级别对此进行补偿(即将样本数量正确映射到挂钟时间),但我想知道我们是否可以或为什么我们无法在较低级别上做得更好?

回答

0

两个时钟都基于某种可能有一些小错误的振荡器。所以我们可能在7999.5Khz而不是8Khz采样,随着时间的推移误差会增加。同样,系统时钟可能会有一些小的错误。

系统时钟由NTP周期性地修正,因此可能允许更多的错误,但即使如此,这种偏差似乎比我会直观的影响大得多。 但是,请参阅http://www.ntp.org/ntpfaq/NTP-s-sw-clocks-quality.htm

理论上NTP可以生成漂移文件,您可以使用它来查看系统时钟的漂移速率。

我会认为知道有一些小的错误。某些东西会尝试通过在两个不同错误的采样率之间交换来自动自我校正,例如8000.5Khz & 7999.5Khz或下降偶尔的样品。事实上,我认为这种事情是在硬件或固件级别完成的,以便在出现已知错误的情况下稳定平均频率crystal。 另外我会认为石英晶体现在至少带有温度补偿功能。