Psychtoolbox刺激呈现方式

用完就忘,忘了就查,查完不会。索性这次备注一下。

PTB刺激呈现的方式

先讲CRT显示器。

CRT显示器的原理可以百度。当电子束扫完最后一行最右边的像素点时,会跳回到第一行最左边的像素点重新开始扫描。这个跳跃的时间段称之为垂直空白(vertical blank)。把两个垂直空白之间的时间就称为一帧。(a Frame)
需要提的是,完成一帧的扫描后,会发出一个垂直同步回扫信号。
在这里插入图片描述

前后缓冲区的交换:

在这里插入图片描述
1.被试此刻看到乌云的图片。(前缓冲区 = 刺激呈现的屏幕)
2.maltab给PTB发出Screen()的绘制命令,PTB把这些命令翻译成OpenGL的渲染命令,在传递给图形加速器硬件。
(可以通过OpenGL for Matlab接口或通过一些已编译的OpenGL C-Plugin直接提交绘图命令)
在这里插入图片描述
1.被试此刻看到乌云的图片。
2.matlab发布Screen()绘制命令
3.图形硬件在后台处理OpenGL命令,在后缓冲区绘制。而matlab和PTB能够并行执行其他操作,例如键盘查询,声音输出。
在这里插入图片描述
1.maltab发布 Screen(‘Flip’)命令,刺激准备呈现。
2.matlab进入睡眠。图形硬件等待垂直回扫信号。等待通过硬件中的一些内置低电平触发电路实现,不受主处理器上任何定时噪 声的影响。
在这里插入图片描述
1.垂直回扫信号出现,图形硬件交换前后缓冲区。
2.图形硬件的电路确保缓冲区交换与垂直回扫信号精确同步。maltab被唤醒。
在这里插入图片描述
被试能感知到无撕裂的刺激更新。PTB采用刺激呈现的时间戳。并且以窗口的背景色清除后缓冲区以准备进行下一次刺激绘制。
在这里插入图片描述
被试能在显示屏幕看到新的图片。(前缓冲区)

PTB官网Timing Demo的解释

vbl = Screen(‘Flip’, window, twhen); 指定 twhen 参数,可以设置何时进行页面切换。
Note:PTB在指定 twhen 参数之后,在第一个出现的垂直回扫信号时进行缓冲区交换。

PTB官网用了一个 waitframes 变量。写法是 : (waitframes - 0.5) * ifi ,对这个稍微解释下:
假如刺激是这样呈现的方式:

ifi = Screen('GetFlipInterval', window);	% 显示器刷新一帧所需的时间
tvbl = Screen('Flip', window);  % 在循环外同步到垂直回扫信号
for i=1:nImages
    Draw i'th new stimulus image ...
    tvbl = Screen('Flip', window, tvbl + (waitframes - 0.5) * ifi);
end

waitframes = 10,则变为了 vbl = Screen(‘Flip’, window, vbl + (10 - 0.5) * ifi);
在这里插入图片描述
实际是 9.5 * ifi,也就是指定 “9.5帧” 的时间,而屏幕扫完第9帧,就会发出一个垂直回扫信号,PTB就在指定 twhen 参数之后的第一个垂直回扫信号时进行缓冲区交换了。

因此对于TPB官网的 Accurate Timing demo 和 Wait Frames demo 就只是 twhen 参数不一样的区别了。
(twhen的取值,依赖于实验刺激的呈现时间)

PTB代码调试(补充)

1.在 Psychtoolbox\PsychOneliners文件夹下有个 PsychDebugWindowConfiguration.m 函数,该函数允许设置窗口的透明度,可以在呈现刺激的时候同时在maltab的命令窗口或其他GUI窗口操作。
To enable:函数的调用要在 Screen(‘OpenWindow’,…) 之前。
To disable:输入 clear Screen 或者 clear all 命令
值得注意的是,调用这个函数以后,刺激的时序可能不准确,因此对于实际采集数据时候的实验要禁用。
关于该函数的详细信息可以通过 help PsychDebugWindowConfiguration 查看。
2.第二种调试方法是在 Screen(‘OpenWindow’,…) 开窗口的时候指定窗口大小,即非全屏。配合matlab的断点,调试的快捷键等操作也可以用来debug。(有时候会使用这种方法查看刺激呈现的顺序有没有错误)

猜你喜欢

转载自blog.csdn.net/zhu_wendao/article/details/88028923
今日推荐