解释PsychToolBox教程中的一行代码



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

有这样一行:

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

我看不懂。有人能给我解释一下吗?特别是vbl + (waitframes - 0.5) * ifi)部分。谢谢!

Alex说的都是对的;我只是在为-0.5添加一个解释(我没有足够的声誉来评论他的回答)

重述一下:在每个循环/帧中,您翻转屏幕缓冲区并在vbl变量中获得翻转的时间。在下一个循环中,你根据上一次(即vbl + [some number of seconds])来计时下一次翻转。因此,您的代码行既在函数调用中使用vbl的先前值,又将其设置为函数返回的新值。vbl是滚动更新的。vbl是"垂直空白"时间,一个相当准确的估计,当你的显示器实际刷新*,所以对齐帧这是一个好主意。

问题是离最后一个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是合理的。我们实际上是在说"在vbl+ifi/2之后尽快做下一次翻转",知道Screen('Flip')实际上不能在刷新之前做,并且知道我们有ifi/2的余地来吸收计时计算中的小误差。

waitframes的运算留给读者作为练习。

*假设PTB设置正确,可以很好地与您的硬件配合-请注意这些警告消息!

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

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

RHS是来自PTB的命令,告诉窗口翻转屏幕(' flip ',窗口)- vbl + (waitframes - 0.5)*ifi是翻转指令中的附加参数,告诉计算机等待那个时刻来翻转屏幕。即屏幕("翻转",窗口,, )

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

无论如何,在它翻转屏幕之后,它节省了屏幕翻转的时间,因此下一次翻转命令可以使用该时间戳作为指定下一次翻转何时发生的基础(vbl+(waitframes-0.5)*ifi

相关内容

  • 没有找到相关文章

最新更新