2017-05-12 3 views
0

Ich versuche, ein einfaches RT-Experiment in MATLAB R2014b, mit Psychtoolbox zu erstellen. Die Teilnehmer müssen die Gesichter kategorisieren und einen der beiden Knöpfe so schnell wie möglich drücken. Ich habe das Paradigma auf einem Computer erstellt, und es funktioniert gut, aber als ich es zu einem anderen verschoben habe (dem, auf dem ich testen möchte), gab es einen seltsamen Fehler: obwohl das Programm Tastenanschläge zu protokollieren schien die Mehrheit der Versuche, manchmal antwortete es nicht, und ich musste den Schlüssel einige Male drücken, bevor es zum folgenden Versuch fortfuhr. Ich bin nicht sicher, was in sich geht, aber ich nehme an, es ist etwas falsch mit dem Computer sein könnte selbst (was könnte das sein?), Oder mit diesem speziellen Bit des Codes:KbCheck (?) Unzuverlässig in Psychtoolbox RT Paradigma

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 

Kann jemand vielleicht Stelle etwas, das kann damit falsch liegen?

Übrigens: Ist das der richtige Weg RT aus PTB zu bekommen? Ich habe diesen Codecode online gefunden, aber ich bin ein wenig unsicher, warum die Variable "secs" nicht verwendet wird.

Beide Computer 10.

Antwort

1

Einige Vorschläge Windows ausführen:

Der Flip Befehl wird die Schätzung von Beginn des Stimulus Zeit zurückkehren, zur Zeit sind Sie GetSecs nach dem Flip-Befehl aufrufen, die nicht notwendig ist und wird immer einen Wert zurückgeben, der etwas später als der tatsächliche Bildschirm Flip ist. Ebenso können Sie die Zeit des Tastendrucks verwenden, die von KbCheck zurückgegeben wird, anstatt GetSecs nach dem Identifizieren eines Tastendrucks aufzurufen.

Ich glaube nicht, dass Sie den FlushEvents-Befehl benötigen, und es könnte einige Zeitvariabilität verursachen.

Manchmal ist es auch sinnvoll, zwischen KbCheck-Ereignissen eine kurze Zeit (z. B. 1 Millisekunde) anzuhalten.

Im Folgenden finden Sie eine Version Ihres Codeausschnitts mit einigen dieser Änderungen. Es kann auch prägnanter sein, eine einzelne Antwortprüfschleife zu verwenden, in der Sie den Stimulus nach 200 ms abschalten, anstatt 200 ms vor 200 ms zu trennen und Rückantwortschleifen zu posten, obwohl ich diese Änderung hier nicht vorgenommen habe.

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 
+0

Vielen Dank, das sind sehr nützliche Kommentare. Denkst du, dass eines dieser Probleme hinter KbChecks liegt, wenn man bei manchen Versuchen keine Tasten drückt? (Leider kann ich jetzt nicht überprüfen, ob dieses Problem auf diesem Computer gelöst wurde.) Außerdem wollte ich es übersichtlicher machen und habe nur eine Prüfschleife mit dem Stimulus, der nach 200 ms verschwindet, konnte aber nicht sehen einen Weg. Wenn Sie dies mit zwei aufeinander folgenden Schleifen tun, ist das falsch (d. H., Sie können größtenteils zurückkehren - +/- mehr als 20 ms - falsche RT-Schätzungen) oder einfach nicht elegant? – MGy

+0

Ich denke, die Änderungen können das KbCheck-Problem nicht beheben, aber ich bin mir nicht 100% sicher. Wenn Sie eine RT-Schleife im Vergleich zu zwei verwenden, sind zwei Schleifen nicht falsch und sollten keinen Fehler bei den Antwortzeiten verursachen, sondern sind nur komplizierter, weil Sie den RT-Prüfcode zweimal einbeziehen. Um eine Schleife zu verwenden, würden Sie einfach RT überprüfen, bis die Antwortzeit abgelaufen ist (anstatt zu prüfen, ob 200 ms verstrichen sind). Überprüfen Sie dann innerhalb dieser Hauptschleife auch, ob 200 ms verstrichen sind und ob der Stimulus noch auf dem Bildschirm ist. Wenn dies der Fall ist, schalten Sie den Stimulus aus. – DMR