1

我有一个更普遍的问题,关于标准 Linux-OS 中处理播放声音和通过串行端口接收数据的时间。

目前,我正在读取通过 USB 转串行桥 (pl2303) 到达的 PCM 信号,该信号是从 FPGA 记录、编码和发送的。

现在,我需要在录制的声音流中的已知位置创建“峰值”,并计划从在已知时刻录制的同一台机器播放声音文件。峰值必须在最大 50ms 的窗口内开始和停止,它的长度可能是 ~200ms...

现在,我的问题是:我可以期望时间有多精确?我知道,有几个组件会添加“未知滞后”、抖动:

  • USB 到串行桥接器从串行端收集约 20 个字节,然后将它们发送到 USB 端(在 230400 波特下,这会导致约 1 毫秒)
  • 如果我在录制软件之前直接调用“`sleep 1; mpg123 $MP3FILE` &”,Linux-Kernel 会以不同的方式安排它们(可能这会导致几个 10 毫秒,取决于系统负载?)
  • 声卡/驱动程序可能会增加一些未知的延迟......
  • 在我的情况下,像“nice”或“sched_setscheduler”这样的技巧会增加价值吗?
  • 我可以在我的录音软件中建立一个额外的线程来播放声音。这样做,时间可能会更准确,但我还有很多工作要做......

非常感谢。

无论如何我都会尝试,但我正在寻找一些背景知识来更好地理解和解决我即将出现的问题。

4

2 回答 2

0

又是我……经过一个不安的夜晚,我解决了我奇怪的时间问题……我的第一次编辑并不完全正确,因为我发布的内容不是 100% 可复制的。运行更多测试后,我可以得出以下 Plot,显示时间准确性:

分析结果 http://mega2000.de/~mzenzes/pics4web/2010-05-28_13-37-08_timingexperiment.png

我尝试了两种不同的 ubuntu 内核2.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
于 2010-05-28T11:58:27.523 回答
0

我不是 100% 确定,但我想你的内核需要重建,以允许调度程序减少切换任务的延迟时间,比如多任务处理,在内核 2.6.x 系列中,有一个选项可以使内核更流畅通过使其可抢占。

  • 转到处理器类型和功能
  • 抢占模式
  • 选择抢占式内核(低延迟桌面)

这应该可以简化时序并使声音由于更少的抖动而显得更平滑。

试试这个并重新编译内核。当然,有很多内核补丁可以减少每个任务切换的时间片,使其更加流畅,您的里程可能会有所不同,具体取决于:

  1. 处理器速度 - 使用什么处理器?
  2. 内存 - 多少 RAM?
  3. 磁盘输入/输出 - 越快越好

结合使用这三个因素,将对调度程序和多任务功能产生影响。延迟越低,粒度越细。

顺便说一句,有一个专门用于实时捕获声音的 linux 发行版,我不记得它的名字了,那个发行版中的内核被大量修补以使声音捕获非常流畅。

于 2010-05-21T11:00:07.627 回答