2010-05-21 80 views
1

我有一個更爲普遍的問題,關於在標準的Linux操作系統中處理播放聲音和通過串口接收數據的時間。當前,我正在讀取一個通過USB到串行橋(pl2303)到達的PCM信號,該信號被記錄,編碼並從FPGA發送。Linux:在錄製/播放聲音期間的定時

現在,我需要在錄製的聲音流的已知位置創建「峯值」,並計劃播放來自在已知時刻錄製的同一臺機器的聲音文件。峯值必須在最大50ms的窗口內開始和停止,它的長度可以是〜200ms ...

現在,我的問題是:我可以期待如何精確定時?我知道,那幾個組件添加「未知滯後」,抖動:從串行側20個字節將它們發送到USB端(在230400Baud這導致〜1ms的前

  • USB轉串口網橋收集〜 )
  • 如果我稱之爲「'睡1; mpg123的$ MP3FILE` &」我的直接錄音軟件前,Linux的內核將安排他們differenty(也許這會導致幾毫秒,這取決於系統負載)
  • 的?聲卡/驅動程序可能會添加一些更多的未知滯後...
  • 像「nice」或「sched_setscheduler」這樣的技巧在我的情況下會增加值嗎?
  • 我可以在播放聲音的錄音軟件中創建一個附加線程。這樣做,時間可能會更精確,但我有更多的工作要做...

非常感謝。

無論如何,我會嘗試它,但我正在尋找一些背景,以更好地理解和解決我即將出現的問題。

+0

事實證明,使用「sudo chrt --fifo 99 ./experiment.sh」的精度優於10ms - 足夠了!沒有內核補丁,沒有硬件升級沒有模糊多線程編程;-) fifo RT調度在ubuntu標準內核中激活。 – marvin2k 2010-05-21 14:18:33

回答

0

我不是100%肯定,但我會想象你的內核需要重建以允許調度程序減少在多任務切換任務中的等待時間,在內核2.6.x系列中,有一個選項可以使內核通過使其可執行而更順暢。

  • 去處理器類型和特點
  • 佔先型號
  • 選擇搶佔內核(低延遲桌面)

這應該精簡的時間和發出的聲音出現,結果更順暢減少抖動。

嘗試並重新編譯內核。當然也有,大量的內核補丁,這將減少時間片的每個任務切換,使之更加順暢,你的操作可能會有所不同:

  1. 處理器速度 - 使用什麼處理器?
  2. 內存 - 多少內存?
  3. 磁盤輸入/輸出 - 使用這三個因素結合在一起的速度越快,越多越好

,將對調度器和多任務功能具有影響。延遲越低,它越細。

順便說一句,有一個專門用於實時捕捉聲音的專門Linux發行版,我不記得它的名字,該發行版中的內核大量修補以使聲音捕捉非常流暢。

0

它又是我......經過一個不安分的夜晚,我解決了我奇怪的時間問題......我的第一個編輯並不完全正確,因爲我發佈的內容不是100%可重現的。運行一些更多的測試後,我可以想出以下的圖,其表示定時精度:

Results from analysis http://mega2000.de/~mzenzes/pics4web/2010-05-28_13-37-08_timingexperiment.png

我嘗試了兩種不同ubuntu-kernels2.6.32-21-generic2.6.32-10-rt

我試圖實現RT-調度:sudo chrt --fifo 99 ./experimenter.sh

我試圖改變省電選項:echo {performance,conservative} | sudo tee /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor

這導致在8個不同的測試中,每個測試50次。這裏是數字:

        mean(peakPos) std(peakPos) 
rt-kernel-fifo99-ondemand   0.97   0.0212 
rt-kernel-fifo99-performance  0.99   0.0040 
rt-kernel-ondemand     0.91   0.1423 
rt-kernel-performance    0.96   0.0078 
standard-kernel-fifo99-ondemand 0.68   0.0177 
standard-kernel-fifo99-performance 0.72   0.0142 
standard-kernel-ondemand   0.69   0.0749 
standard-kernel-performance  0.69   0.0147