2017-08-22 42 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。 另外我會認爲石英晶體現在至少帶有溫度補償功能。