在 MATLAB (Psychtoolbox) 中使用 KbCheck 和 GetSecs 记录冲突任务中的反应时间
Using KbCheck and GetSecs to record reaction time in a conflict task in MATLAB (Psychtoolbox)
我在 MATLAB 中创建了一个类似于 Stroop 的反应时间任务,并且查看试验结果表明我的代码可能有问题(一致性效应比预期的大得多)。我怀疑我可能录错了RT,所以谁能帮我看看下面的设置是否可以?
在任何给定的试验中,都会发生两个事件(在注视交叉之后):首先,目标刺激最多呈现 3 秒(或直到响应),然后参与者必须按下按钮才能开始下一次审判。记录两次按钮按下(目标和试用启动按钮)的 RT。这是我的代码:
Screen('DrawTexture', mainwin, Target);
Screen('Flip', mainwin);
timeStart = GetSecs;keyIsDown=0; correct=0; rt=0;
while 1 & (GetSecs - timeStart) < 3
[keyIsDown, secs, keyCode] = KbCheck;
FlushEvents('keyDown');
if keyIsDown
nKeys = sum(keyCode);
if nKeys==1
if keyCode(Left)||keyCode(Right)||keyCode(Down)||keyCode(Up)
rt = 1000.*(GetSecs-timeStart);
keypressed=find(keyCode);
Screen('Flip', mainwin);
if ... [I removed some irrelevant ERROR feedback related code here]...
elseif keyCode(escKey)
ShowCursor; fclose(outfile); Screen('CloseAll'); return
end
keyIsDown=0; keyCode=0;
end
else
keypressed = 0; %the resp column in output is 0 if no button is pressed
end
end
if keypressed == 0 %indicates timeout errors
DrawFormattedText(mainwin, 'TOO SLOW', 'center', 'center', errorcol);
Screen('Flip', mainwin);
WaitSecs(1);
end
Screen('DrawTexture', mainwin, press5);
Screen('Flip', mainwin);
keyIsDown=0; timeSt = GetSecs;
while 1
[keyIsDown, secs, keyCode] = KbCheck;
if keyIsDown
if keyCode(MoveOn)
pause_rt = 1000.*(secs - timeSt);
break ;
elseif keyCode(escKey)
ShowCursor;
fclose(outfile);
Screen('CloseAll');
return;
end
end
end
我的问题:无论何时调用 GetSecs 命令都会获取时间,对吗?所以 GetSecs - timeStart 是一种计算 RT 的好方法 - 但 secs - timeSt 也是如此(如第二个刺激所见),因为 secs 是按下按钮的 KbCheck returns 时间。这两种方法在很大程度上是等效的(使用 GetSecs - timeStart 可能稍微高估了 RT),对吗?
我担心的是,NEXT 试验中目标的 RT 估计值可能会受到 PREVIOUS 试验中第二次按下按钮 RT 的影响。你看到任何证据了吗?
你说得对 GetSecs
returns 调用的时间。但是,虽然不是导致错误的原因,但在每次 window Flip 之后调用 GetSecs 是没有必要的,因为 Flip 函数 returns 刺激开始的估计,作为函数的第二个输出。因此,例如,而不是:
屏幕('Flip', mainwin);
timeStart = GetSecs;
你可以直接使用
[~, timeStart] = Screen('Flip', mainwin);
我没有注意到代码中有任何明显的错误,当你说 RT 似乎不正确时,它们看起来是太快了还是太慢了?我个人会在收集 RT 后使用 KbReleaseWait
等待密钥被释放,但也许 FlushEvents 正在做类似的事情。
我在 MATLAB 中创建了一个类似于 Stroop 的反应时间任务,并且查看试验结果表明我的代码可能有问题(一致性效应比预期的大得多)。我怀疑我可能录错了RT,所以谁能帮我看看下面的设置是否可以?
在任何给定的试验中,都会发生两个事件(在注视交叉之后):首先,目标刺激最多呈现 3 秒(或直到响应),然后参与者必须按下按钮才能开始下一次审判。记录两次按钮按下(目标和试用启动按钮)的 RT。这是我的代码:
Screen('DrawTexture', mainwin, Target);
Screen('Flip', mainwin);
timeStart = GetSecs;keyIsDown=0; correct=0; rt=0;
while 1 & (GetSecs - timeStart) < 3
[keyIsDown, secs, keyCode] = KbCheck;
FlushEvents('keyDown');
if keyIsDown
nKeys = sum(keyCode);
if nKeys==1
if keyCode(Left)||keyCode(Right)||keyCode(Down)||keyCode(Up)
rt = 1000.*(GetSecs-timeStart);
keypressed=find(keyCode);
Screen('Flip', mainwin);
if ... [I removed some irrelevant ERROR feedback related code here]...
elseif keyCode(escKey)
ShowCursor; fclose(outfile); Screen('CloseAll'); return
end
keyIsDown=0; keyCode=0;
end
else
keypressed = 0; %the resp column in output is 0 if no button is pressed
end
end
if keypressed == 0 %indicates timeout errors
DrawFormattedText(mainwin, 'TOO SLOW', 'center', 'center', errorcol);
Screen('Flip', mainwin);
WaitSecs(1);
end
Screen('DrawTexture', mainwin, press5);
Screen('Flip', mainwin);
keyIsDown=0; timeSt = GetSecs;
while 1
[keyIsDown, secs, keyCode] = KbCheck;
if keyIsDown
if keyCode(MoveOn)
pause_rt = 1000.*(secs - timeSt);
break ;
elseif keyCode(escKey)
ShowCursor;
fclose(outfile);
Screen('CloseAll');
return;
end
end
end
我的问题:无论何时调用 GetSecs 命令都会获取时间,对吗?所以 GetSecs - timeStart 是一种计算 RT 的好方法 - 但 secs - timeSt 也是如此(如第二个刺激所见),因为 secs 是按下按钮的 KbCheck returns 时间。这两种方法在很大程度上是等效的(使用 GetSecs - timeStart 可能稍微高估了 RT),对吗?
我担心的是,NEXT 试验中目标的 RT 估计值可能会受到 PREVIOUS 试验中第二次按下按钮 RT 的影响。你看到任何证据了吗?
你说得对 GetSecs
returns 调用的时间。但是,虽然不是导致错误的原因,但在每次 window Flip 之后调用 GetSecs 是没有必要的,因为 Flip 函数 returns 刺激开始的估计,作为函数的第二个输出。因此,例如,而不是:
屏幕('Flip', mainwin); timeStart = GetSecs;
你可以直接使用
[~, timeStart] = Screen('Flip', mainwin);
我没有注意到代码中有任何明显的错误,当你说 RT 似乎不正确时,它们看起来是太快了还是太慢了?我个人会在收集 RT 后使用 KbReleaseWait
等待密钥被释放,但也许 FlushEvents 正在做类似的事情。