2017-05-12 8 views
0

J'essaie de créer une expérience RT simple dans MATLAB R2014b, en utilisant Psychtoolbox. Les participants devront catégoriser les visages en appuyant sur l'un des deux boutons le plus rapidement possible. J'ai créé le paradigme sur un ordinateur, et ça marche bien, mais quand je l'ai déplacé vers un autre (celui sur lequel je veux tester), il y a eu une erreur bizarre: même si le programme semblait enregistrer des pressions sur la plupart des procès, parfois il ne répondrait pas, et j'ai dû appuyer sur la touche un certain nombre de fois avant de passer au procès suivant. Je ne suis pas sûr ce qui se passe, mais je suppose qu'il pourrait y avoir quelque chose de mal avec l'ordinateur lui-même (ce pourrait-il être?), Ou avec ce bit particulier du code:KbCheck (?) Peu fiable dans le paradigme Psychtoolbox 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 

Quelqu'un peut-il place peut-être quelque chose qui peut avoir tort avec ça? Incidemment: est-ce la bonne façon d'obtenir RT à partir de PTB? J'ai trouvé ce morceau de code en ligne, mais je ne sais pas très bien pourquoi la variable "secs" n'est pas utilisée.

Les deux ordinateurs équipés de Windows 10.

Répondre

1

Quelques suggestions:

La commande Flip retournera l'estimation du temps de début de relance, actuellement vous appelez GetSecs après la commande Flip, qui n'est pas nécessaire et la volonté renvoie toujours une valeur qui est légèrement plus tard que l'écran réel Flip. De même, vous pouvez utiliser l'heure de la touche, retournée par KbCheck, plutôt que d'appeler GetSecs après avoir identifié une touche.

Je ne pense pas que vous ayez besoin de la commande FlushEvents, et cela peut provoquer une certaine variabilité de synchronisation.

Il est également parfois utile de faire une pause pendant un court laps de temps (par exemple 1 milliseconde) entre les événements KbCheck.

Vous trouverez ci-dessous une version de votre extrait de code avec quelques-unes de ces modifications. Il peut également être plus concis d'avoir une seule boucle de vérification de réponse, dans laquelle vous désactivez le stimulus après 200 ms, plutôt que de séparer les boucles de contrôle de réponse pré 200 ms et 200 ms, mais je n'ai pas fait de changement ici.

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

Merci, ce sont des commentaires très utiles. Pensez-vous que l'un de ces problèmes pourrait être à l'origine de l'échec de KbCheck à enregistrer des pressions sur certains essais? (Malheureusement, je suis incapable de vérifier maintenant si ce problème est résolu de cette façon sur cet ordinateur.) En outre, je voulais le rendre plus concis et avoir une seule boucle de vérification avec le stimulus disparaissant après 200 ms, mais ne pouvait pas comprendre un moyen. Le faire de cette façon, avec deux boucles consécutives est faux (c'est-à-dire, pourrait revenir en grande partie - +/- plus de 20 ms - estimations RT incorrectes), ou tout simplement pas élégant? – MGy

+0

Je pense que les changements peuvent corriger le problème de ne pas enregistrer de KbCheck, mais je ne suis pas sûr à 100%. En utilisant une boucle RT contre deux, deux boucles ne sont pas fausses, et ne devraient pas ajouter d'erreur aux temps de réponse, mais c'est plus compliqué parce que vous incluez le code de vérification RT deux fois. Pour utiliser une boucle, il suffit de continuer à vérifier RT jusqu'à ce que la période de réponse se soit écoulée (au lieu de vérifier jusqu'à ce que 200 ms se soient écoulés). Ensuite, dans cette boucle principale, vérifiez également si 200 ms se sont écoulés et si le stimulus est toujours à l'écran. Si c'est le cas, désactivez le stimulus. – DMR