解释 PsychToolBox 教程中的一行代码

Explaning a line in code from PsychToolBox tutorial

我正在学习 PsychToolBox 并参考了本教程。 http://peterscarfe.com/movingdotgriddemo.html

有这一行:

vbl  = Screen('Flip', window, vbl + (waitframes - 0.5) * ifi); 

我想不通。有人可以向我解释一下吗?特别是 vbl + (waitframes - 0.5) * ifi) 部分。谢谢!

LHS(左侧)上的 vbl 是一个变量,其中存储屏幕 'flipped' 的时间。

RHS 是来自 PTB 的命令,告诉 window 翻转 - Screen('Flip',window) - vbl + (waitframes - 0.5)*ifi 是额外的翻转指令中的参数告诉计算机等待翻转屏幕的那一刻。 IE。屏幕('Flip',window,)

在这种情况下,屏幕将在上一次翻转 (the vbl + ...) 位后翻转 (waitframes - 0.5)*ifi 秒。因为 ifi 是帧间间隔(屏幕连续刷新之间的时间),我们可以简单地说 vbl + ifi,它会在每次刷新时翻转屏幕,但是,我们在其中添加 (waitframes - 0.5) 乘数,以便我们可以指定在再次翻转屏幕之前我们应该等待多少次刷新。我从来没有真正理解 -0.5 部分的逻辑,所以我很想知道是否有人可以回答这一点。

总之,翻屏后,它会保存翻屏的时间,以便下一次翻屏命令可以使用该时间戳作为指定下一次翻屏时间的基础(vbl+(waitframes-0.5)* ifi

亚历克斯说的一切都是正确的;我只是为 -0.5 添加一个解释(我没有足够的声誉来评论他的回答)

回顾一下:在每个循环/帧中,您翻转屏幕缓冲区并在 vbl 变量中获取翻转时间。在下一个循环中,您根据上一个翻转计时下一个翻转,即 vbl + [some number of seconds]。因此,您的代码行既使用函数调用中 vbl 的先前值,又将其设置为函数 returns 的新值。 vbl 滚动更新。 vbl 是 'vertical blanking' 时间,可以非常准确地估计您的显示器实际刷新时间*,因此将帧与此对齐是个好主意。

问题是距离上一个vbl多远才能进行下一次翻转。正如 Alex 所说,ifi 是刷新之间的时间,或 1/[your monitor refresh rate in Hz]。让我们暂时忽略 waitframes 并假设您想要在每次显示器刷新时打开,即 waitframes = 1.

那么你的代码行就简化为

vbl  = Screen('Flip', window, vbl + ifi/2);

所以我们要求在下次刷新之前翻转半个 ifi。 为什么不要求在下一次刷新时翻转,即 vbl + ifi 因为该总和是浮点计算,可能包含小的舍入误差。 Screen('Flip') 只能在下一次显示器刷新时交换屏幕缓冲区,所以如果该总和中的错误略微过冲会怎样?然后你只是要求翻转时间稍微超出你实际想要的显示器刷新,而 PTB 必须等待几乎整个 ifi 才能真正翻转**。

因此我们要求在 所需的监视器刷新之前 一定量(小于 ifi)的翻转时间 - ifi/2 是合理的。我们实际上是在说 "do the next flip ASAP after vbl+ifi/2",既知道 Screen('Flip') 实际上无法在刷新之前做到这一点,又知道我们有 ifi/2 余地来吸收更新中的小错误时序计算。

waitframes的算术留作reader的练习。

*假设 PTB 已正确设置以与您的硬件配合使用 - 请注意这些警告消息!

**更糟糕的是,这可能不会出现在 PTB 的错误中,例如丢失的帧数,因为 PTB 已经实现了您的要求:从您指定的时间开始在下一次监视器刷新时翻转缓冲区。在那种情况下,你知道你的实验滞后和出现错误时间刺激的唯一方法就是你在运行时碰巧发现它!