关于播放声音和通过串口接收数据的标准Linux操作系统的时序,我有一个更普遍的问题。
目前,我正在读取通过USB转串口桥(pl2303)到达的PCM信号,该信号由FPGA记录,编码和发送。
现在,我需要在录制的声音流中的已知位置创建“峰值”,并计划从已知时刻录制的同一台机器播放声音文件。峰值必须在最大50ms的窗口内开始和停止,它的长度可能是〜200ms ......
现在,我的问题是:我对时间的准确程度如何?我知道,有几个组件会增加“未知滞后”,抖动:
非常感谢。
无论如何我会尝试,但我正在寻找一些背景知识,以便更好地理解和解决我即将出现的问题。
答案 0 :(得分:0)
我不是百分百肯定,但我认为你的内核需要重建以允许调度程序减少切换任务的延迟时间和多任务处理,在内核2.6.x系列中,有一个选项可以使通过使内核变得更加顺畅,内核更加顺畅。
这应该简化时间并使声音看起来更平滑,因为更少的抖动。
尝试并再次重新编译内核。当然,有很多内核补丁可以减少每个任务切换的时间片,使其更加平滑,您的里程可能会有所不同,具体取决于:
顺便提一下,有一个专门用于实时捕获声音的Linux发行版,我不记得它的名称,该发行版中的内核经过严格修补,使声音捕获非常流畅。
答案 1 :(得分:0)
再次是我...经过一个不安的夜晚,我解决了我奇怪的时间问题...我的第一次编辑并不完全正确,因为我发布的内容并非100%可重复。在运行了一些测试之后,我可以得出以下Plot,显示时序准确度:
Results from analysis http://mega2000.de/~mzenzes/pics4web/2010-05-28_13-37-08_timingexperiment.png
我尝试了两个不同的ubuntu-kernels:2.6.32-21-generic
和2.6.32-10-rt
我尝试实现RT调度:sudo chrt --fifo 99 ./experimenter.sh
我尝试更改powersaving-options: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