从PsychToolBox教程中解释一行代码

时间:2016-06-24 13:43:07

标签: matlab psychtoolbox

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

有这一行:

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

我无法弄明白。有人可以向我解释一下吗?特别是vbl + (waitframes - 0.5) * ifi)部分。谢谢!

2 个答案:

答案 0 :(得分:1)

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

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

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

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

答案 1 :(得分:1)

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

回顾一下:在每个循环/帧上,您翻转屏幕缓冲区并在vbl变量中获取翻转时间。在下一个循环中,根据最后一个翻转计算下一个翻转,即vbl + [some number of seconds]。因此,您的代码行在函数调用中都使用先前的vbl值,并将其设置为函数返回的新值。 vbl以滚动方式更新。 vbl是&#39;垂直消隐&#39;时间,非常准确地估计你的显示器实际刷新的时间*,所以将帧与帧对齐是一个好主意。

问题是从最后一个vbl到下一次翻转的距离有多远。正如亚历克斯所说,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是合理的。我们真的说'#34;在vbl+ifi/2&#34;之后尽快做下一次翻转,知道Screen('Flip')在刷新之前无法实际执行此操作,并且安全知道我们有ifi/2余地来吸收时间计算中的微小不准确。

waitframes的算法留给读者练习。

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

**更糟糕的是,这可能不会出现在PTB的错误中,例如丢帧数,因为PTB已达到您的要求:在指定时间内下一次监视器刷新时缓冲缓冲区。在这种情况下,你知道你的实验的唯一方法就是落后并提出错误定时的刺激,如果你碰巧在运行时发现它的话!