【问题标题】:High precision millisecond timer in matlabmatlab中的高精度毫秒定时器
【发布时间】:2019-10-19 01:16:49
【问题描述】:

我正在尝试在 matlab 中实现一个高精度的毫秒级计时器。每T秒,我想查询一个与matlab链接的相机,如果内存中有图像,我想把它拉出来。与相机的实际连接很简单 - 但出现了一个问题,因为图像每隔约 60 毫秒就会出现一次,并且需要在另一张图像进入相机缓冲区之前将其全部拉出。这实质上意味着我需要至少每约 30 毫秒检查一次相机缓冲区,最好是每约 5 毫秒。

虽然 MATLAB 内置的 timer 函数表面上允许毫秒计时,但它的精度很差。虽然在 >95% 的执行中,内置的 MATLAB 计时器确实会在运行之间暂停约 5 毫秒,但在约 5% 的情况下,它会在约 30 毫秒左右徘徊,在约 1% 的情况下,两次执行之间需要 > 100 毫秒,这令人无法接受的表现。我应该在 MATLAB 的辩护中澄清一下,同时还有另外两个计时器在运行(两个周期均为 1 秒),并且打开了许多图形窗口,所以即使我的机器很强大(16 核,64GB RAM),也有当然要同时做很多事情。我曾尝试使用基于 .NET 定时器 (System.Timers.Timer(period)) 以及 Java 睡眠函数 (java.lang.Thread.sleep(period)) 的定时器,理论上两者都应该更精确,而且两者都比 MATLAB 定时器更好(在更笨重的成本),没有一个能够在数千次迭代中始终实现

也许我要求的是一些不可实现的东西 - 但我希望有一些方法可以在 MATLAB 中实现一个高精度计时器,即使有其他数字/计时器,它也会继续以 ms 时间尺度执行/命令被半同时执行。我也许应该澄清一下,当只运行一个没有其他定时器/数字打开的定时器时,我能够始终如一地实现

【问题讨论】:

  • 唯一的方法是不在计算机上运行任何其他东西。在 Linux 上有一种实时模式,如果中断被禁用并且一个程序可以独占运行,而不会中断。也许Windows有类似的东西。您不能期望在多进程环境中获得实时性能。
  • 嗨 Cris,虽然我承认这表面上很困难,但当 MATLAB 上没有其他任何东西打开时,计时器能够在
  • 我确信它运行良好......直到 Java 的垃圾收集器启动,或者操作系统决定为您的文件建立索引或查找更新,或者其他一些计划的作业开始。
  • 是的,我承认操作系统级别的影响令人担忧 - 但至少在我到目前为止的测试中,在没有其他数字的 MATLAB 实例上运行计时器时,我从未遇到过问题打开/计时器运行。也许那些操作系统级别的影响会成为问题,但现在我正试图找到一种方法来优化 MATLAB 中的计时器。我以“高”优先级运行 MATLAB,这对我很有帮助。
  • 我认为您遇到了典型的 MATLAB 行为。 MATLAB 程序并不是真正的多线程。如果程序很忙(例如,在 for 循环中做一些工作),你的计时器回调将暂停(除非你调用 pausedrawnow)。

标签: matlab timer windows-10


【解决方案1】:

根据您的具体操作,Psychtoolbox 的计时系统可能会对您有所帮助。

具体来说,请查看WaitSecs 函数及其文档。它应该比timer 更精确,并且文档包含了一些关于一般实现高精度计时的技巧。

GetSecs 函数也相关。

但是,切换到WaitSecs 可能对您没有帮助。在这种情况下,您可以确定您的机器负载过重,无法执行您想要执行的操作。

【讨论】:

    猜你喜欢
    • 2016-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-07
    • 2014-03-20
    • 1970-01-01
    相关资源
    最近更新 更多