【问题标题】:KbCheck (?) unreliable in Psychtoolbox RT paradigmKbCheck (?) 在 Psychtoolbox RT 范式中不可靠
【发布时间】:2017-05-12 23:26:19
【问题描述】:

我正在尝试使用 Psychtoolbox 在 MATLAB R2014b 中创建一个简单的 RT 实验。参与者必须对面孔进行分类,尽可能快地按下两个按钮之一。我在一台计算机上创建了范例,它运行良好,但是当我将它移到另一台(我想要测试的那个)时,出现了一个奇怪的错误:即使程序似乎正在记录按键大多数试验,有时它不会响应,我必须按几次键才能进行下一次试验。我不确定发生了什么,但我认为计算机本身可能有问题(可能是什么?),或者代码的这个特定位:

    Screen('Flip', mainwin);
    timeStart = GetSecs;keyIsDown=0; correct=0; rt=0;
    while 1
        bf = 0; %this variable is irrelevant here, I use it later to break 
        out of a loop 
        while (GetSecs - timeStart) < 0.2 %faces are presented briefly, but 
        %I'm recording responses here anyway, just in case there are some 
        %fast anticipatory responses - after this loop is over, I keep 
        %recording RT and button press the exact same way, but with no 
        %stimulus present
            [keyIsDown, secs, keyCode] = KbCheck;
            FlushEvents('keyDown');
            if keyIsDown
                nKeys = sum(keyCode);
                if nKeys==1
                    if keyCode(Key1)||keyCode(Key2)
                        rt = 1000.*(GetSecs-timeStart);
                        keypressed=find(keyCode);
                        Screen('Flip', mainwin);
                        type = 'T';
                        bf = 1;
                        if keyCode(Key1) & targ_pic == 1
                            correct = 1;
                        elseif keyCode(Key2) & targ_pic == 0
                            correct = 1;
                        end
                        break;
                    elseif keyCode(escKey)
                        ShowCursor; fclose(outfile);  Screen('CloseAll'); 
                        return
                    end
                    keyIsDown=0; keyCode=0;
                end
            else
                keypressed = 0; 
            end
        end

谁能发现这可能有问题?

顺便说一句:这是让 RT 退出 PTB 的正确方法吗?我在网上找到了那段代码,但我有点不确定为什么不使用“secs”变量。

两台电脑都运行 Windows 10。

【问题讨论】:

    标签: matlab keypress psychtoolbox


    【解决方案1】:

    一些建议:

    Flip 命令将返回刺激开始时间的估计值,目前您在 Flip 命令之后调用 GetSecs,这不是必需的,并且总是会返回一个比实际屏幕 Flip 稍晚的值。同样,您可以使用KbCheck返回的按键时间,而不是在识别按键后调用GetSecs

    我认为您不需要 FlushEvents 命令,它可能会导致一些时间变化。

    在 KbCheck 事件之间暂停一小段时间(例如 1 毫秒)有时也很有用。

    以下是您的代码 sn-p 的一个版本,其中包含一些更改。使用单个响应检查循环也可能更简洁,在该循环中,您在 200 毫秒后关闭刺激,而不是单独的 200 毫秒前和 200 毫秒后的响应检查循环,尽管我没有在这里进行更改。

    keyIsDown=0; correct=0; rt=0;
    [~, timeStart] = Screen('Flip', mainwin);
    while 1
        bf = 0; %this variable is irrelevant here, I use it later to break
        %out of a loop
        while (GetSecs - timeStart) < 0.2 %faces are presented briefly, but
            %I'm recording responses here anyway, just in case there are some
            %fast anticipatory responses - after this loop is over, I keep
            %recording RT and button press the exact same way, but with no
            %stimulus present
            [keyIsDown, secs, keyCode] = KbCheck;
            if keyIsDown
                nKeys = sum(keyCode);
                if nKeys==1
                    if keyCode(Key1)||keyCode(Key2)
                        rt = 1000.*(secs-timeStart);
                        keypressed=find(keyCode);
                        Screen('Flip', mainwin);
                        type = 'T';
                        bf = 1;
                        if keyCode(Key1) & targ_pic == 1
                            correct = 1;
                        elseif keyCode(Key2) & targ_pic == 0
                            correct = 1;
                        end
                        break;
                    elseif keyCode(escKey)
                        ShowCursor; fclose(outfile);  Screen('CloseAll');
                        return
                    end
                    keyIsDown=0; keyCode=0;
                end
            else
                keypressed = 0;
            end
            WaitSecs(.001);
        end
    end
    

    【讨论】:

    • 谢谢,这些都是非常有用的cmets。您是否认为这些问题之一可能是 KbCheck 在某些试验中未注册按键的原因? (不幸的是,我现在无法检查该问题是否在该计算机上以这种方式解决。)此外,我想让它更简洁,并且只有一个检查循环,刺激在 200 毫秒后消失,但无法弄清楚离开。这样做,两个连续的循环是错误的(即,可能会大量返回 - +/- 超过 20 毫秒? - 不正确的 RT 估计),或者只是不优雅?
    • 我认为这些更改可能会解决 KbCheck 未注册问题,但我不能 100% 确定。在使用一个 RT 循环与两个时,两个循环并没有错,也不应该在响应时间中增加错误,但是会更复杂,因为您包含了两次 RT 检查代码。要使用一个循环,您只需继续检查 RT 直到响应时间过去(而不是检查直到 200 毫秒过去)。然后,在该主循环中,还要检查是否已过 200 毫秒,以及刺激是否仍在屏幕上。如果是这样,请关闭刺激。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-07
    • 2016-05-20
    • 2014-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多