Matlab键盘鼠标输入学习及PsychToolBox对刺激反应结果的保存

这篇具有很好参考价值的文章主要介绍了Matlab键盘鼠标输入学习及PsychToolBox对刺激反应结果的保存。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.Matlab键盘鼠标输入学习

包括键盘监听KbWait KbCheck、鼠标监听GetMouse

%反应录入
%Mouse & Keyboard
ListenChar(1);
%设置0将不能监听键盘输入
%设置1或者不设置任何值则可以监听键盘输入
%设置2可以监听键盘输入但是抑制命令行输出

%电脑中键盘的编码
edit KbName %kbNameResult = KbName(arg) 
KbName('UnifyKeyNames');
space = KbName('space');    %键位与数字一一对应
a = KbName(40);

							%使用while监听键盘
while(1)
    format long;
    disp(GetSecs);          %使用每个操作系统上最高精度的实时时钟。
end

%KbWait KbCheck
help KbWait
%[secs, keyCode, deltaSecs] = KbWait([deviceNumber][, forWhat=0][, untilTime=inf])
%等待直到任何键按下,并选择性地返回时间(以秒为单位)和键盘状态的 keyCode向量
a = GetSecs;
[secs,keyCode,deltaSecs] = KbWait();
%显示输入的键位
KbName(find(keyCode==1));

help KbCheck
KbCheck
[keylsDown,secs,keyCode,deltaSecs] = KbCheck;
%      keyIsDown      1 if any key, including modifiers such as <shift>,
%                     <control> or <caps lock> is down.
%      secs           Time of keypress as returned by GetSecs.
%      keyCode        A 256-element logical array.  Each bit
%                     within the logical array represents one keyboard key. 
%                     If a key is pressed, its bit is set, othewise the bit 
%                     is clear. To convert a keyCode to a vector of key  
%                     numbers use FIND(keyCode). To find a key's keyNumber 
%                     use KbName or KbDemo
ListenChar(1); %1对应命令行显示 2对应命令行不显示
while(1)
    [K_down,secs,K_code] = KbCheck;
    if(K_down)
        disp(KbName(find(K_code==1)));
        if(K_code(space))
            break;
        end
    end
end 
%获取鼠标
help GetMouse
%[x,y,buttons,focus,valuators,valinfo] = GetMouse([windowPtrOrScreenNumber][, mouseDev])
%x y为鼠标当前向量值 button为鼠标上按钮数量 
figure
x = [];
y = [];
while(1)
    [x(end+1),y(end+1),buttons] = GetMouse;%获取鼠标现在位置
    plot(x,1000-y);                        %由于屏幕中位置0在上方 与matlab绘制y轴相反 用1000减去y得到反转值
    if(find(buttons==1))                   %左键退出
        break;
    end
    WaitSecs(0.1);                         %每隔0.1秒绘制一下
end

如图为鼠标绘制的图像:
kbcheck device number,Matlab,脑机,matlab,PsychToolBox

2.PsychToolBox设置反应收集

之前的代码参考上一篇文章:Psychtoolbox使用Screen时间控制以帧随机播放图片
在反应收集部分添加键盘输入项,对应保存结果。被试者对图片刺激进行判断给出反应结果。
被试者反应结果(键位、匹配结果、反应时间)呈现如图:
kbcheck device number,Matlab,脑机,matlab,PsychToolBox

代码:文章来源地址https://www.toymoban.com/news/detail-571276.html

 global screens screenNumber win wsize flipIntv cx cy time_stamp
 
 try
     ListenChar(1);
     KbName('UnifyKeyNames');
     space = KbName('space');
     keyq = KbName('q');
     keyw = KbName('w');
     keye = KbName('e');
     
     HideCursor;
     InitializeMatlabOpenGL;
     Screen('Preference','SkipSyncTests',1);
     screens = Screen('Screens');
     screenNumber = max(screens);
     [win,wsize] = Screen('OpenWindow',screenNumber);
     cx = wsize(3)/2;
     cy = wsize(4)/2;
                                                       
     flipIntv = Screen('GetFlipInterval',win);         %我电脑屏幕刷新率为165Hz 1/165 = 0.0061 即flipIntv的值为0.0061
     Screen('FillRect',win,128);
     time_stamp = Screen('Flip',win);
     
     % 呈现一个视角5度的图片
     pixs = deg2pix(5,15.5,wsize(3),50);               %计算该条件下对应视角在屏幕中的像素数
     
     %画图
     %首先加载图片
     cd Screen_tutorial/images
     files = dir('*tif*');
     for i = 1:length(files)
         Image_pool{i} = imread(files(i).name);
     end
     
     %进行一一组合一共有多少条件
     %设定SOA条件 SOA为启动刺激(Prime)呈现起到目标刺激(Probe)呈现之间的时间
     %可理解为图片呈现的时间
     %由于1秒、0.5秒这样表示不能整除每帧0.0061s的时间,为保证实验的准确性,不采用秒的方式来呈现图片
     %更改采用帧数来展示图片,这里设置了一个存储时间的元胞数组SOA_pool 为了好计算 间隔专门设置成每帧所用时间
     SOA_pool = [6.1:6.1:24.4000]/1000;
     SOA_pool = time2frame(flipIntv,SOA_pool);          %调用time2frame函数 该函数将时间四舍五入取整求帧数 
     Mask_pool = 1:2;                                   %Mask_pool用来表示实验过程中是否有mask图片
     
     %计算共有多少次数 遍历所有条件
     Total_trial = length(Image_pool)*length(SOA_pool)*length(Mask_pool);
     
     %分配图像在这么多试次的分布(随机)
     %由于matlab从1开始 取模后要加1
     Image_order = mod(randperm(Total_trial),length(Image_pool))+1;
     SOA_order = mod(randperm(Total_trial),length(SOA_pool))+1;
     Mask_order = randi(2,[1,Total_trial])-1;
     
     %秒转化为帧
     trial_interval = 1;                                  %试次之间的间隔,单位是秒
     trial_interval = time2frame(flipIntv,trial_interval);
     fix_onset = 0.5;
     fix_onset = time2frame(flipIntv,fix_onset);
     mask_onset = 0.5;
     mask_onset = time2frame(flipIntv,mask_onset);
     word_onset = 3;
     word_onset = time2frame(flipIntv,word_onset);
     
     %预分配内存给反应矩阵
     response_pool = [];                                  %反应键位
     RT_pool = [];                                        %反应时间
     response_ture = [];                                  %反应正确/错误
     
     n_trial = 12;%测试使用12个对象 Total_trial太多这里不使用

     %for i = 1:Total_trial
     for i = 1:n_trial
         Screen('FillRect',win,128);%背景与注视点
         Screen('FillOval',win,255, [cx-5,cy-5,cx+5,cy+5]);
         time_stamp = Screen('Flip',win,time_stamp+(trial_interval-0.5)*flipIntv);
         %展示图片
         Screen('FillRect',win,128);
         Image_Index = Screen('MakeTexture',win,Image_pool{Image_order(i)});
         Screen('DrawTexture',win,Image_Index,[],[cx-pixs,cy-pixs,cx+pixs,cy+pixs]);
         time_stamp = Screen('Flip',win,time_stamp+(fix_onset-0.5)*flipIntv);
         if(Mask_order(i))
             %呈现mask
             Screen('FillRect',win,128);
             masks = im2uint8(rand(50));
             Image_Index = Screen('MakeTexture',win,masks);
             Screen('DrawTexture',win,Image_Index,[],[cx-pixs,cy-pixs,cx+pixs,cy+pixs]);
             time_stamp = Screen('Flip',win,time_stamp+(SOA_pool(SOA_order(i))-0.5)*flipIntv);
         else
             %不呈现Mask
             Screen('FillRect',win,128);
             time_stamp = Screen('Flip',win,time_stamp+(SOA_pool(SOA_order(i))-0.5)*flipIntv);
         end
         
         %呈现指导语,提取设置好指导语与键位对应
         Screen('FillRect',win,128);
         txt = '2 Animal';                                %对应w键位
         bRect = Screen('TextBounds',win,txt);
         Screen('DrawText',win,txt,cx-bRect(3)/2,cy,255);
         txt = '1 Object';                                %对应q键位
         bRect = Screen('TextBounds',win,txt);
         Screen('DrawText',win,txt,cx-bRect(3)/2,cy-bRect(4),255);
         txt = '3 Scene';                                 %对应e键位
         bRect = Screen('TextBounds',win,txt);
         Screen('DrawText',win,txt,cx-bRect(3)/2,cy+bRect(4),255);
         time_stamp = Screen('Flip',win,time_stamp+(mask_onset-0.5)*flipIntv);
         
         %要求被试反应
         start_time = GetSecs;                            %获取最新时间
         response_pool(i) = nan;
         RT_pool(i) = nan;
         while(GetSecs-start_time<word_onset*flipIntv)    %最多等待时间 
             %被试者要在指导语显示的范围内给出反应,在这个范围内获取键位反应
             [K_down,~,K_code] = KbCheck;
             if(K_down)
                 RT_pool(i) = GetSecs-start_time;         %计算并保存反应时间
                 %Response True?
                 file_nm = (files(Image_order(i)).name);
                 response_pool(i) = find(K_code==1);      %保存键位
                 if(K_code(space))%space is [out]
                     sca;
                     stats.subinfo={'WZY','Male','21yrs'}; 
                     stats.trial_num=Total_trial;
                     stats.Image_order=Image_order;
                     stats.image_shown=Image_pool;
                     stats.SOAs=SOA_pool(SOA_order);
                     stats.Masks=Mask_pool(Mask_order+1);
                     stats.response={RT_pool,response_true,response_pool}; 
                     stats.docs='Masks = 1 is unmask,Masks = 2 is masked';
                     save mask_result.mat stats
                     return
                 elseif(K_code(keyq))
                     if(strcmp(file_nm(1:3),'obj'))       %取当前图片的前三个字母判断是否匹配obj
                         %response true
                         response_ture(i) = 1;
                     else
                         response_ture(i) = 0;
                     end
                 elseif(K_code(keyw))
                     if(strcmp(file_nm(1:3),'ani'))        %取当前图片的前三个字母判断是否匹配ani
                         response_ture(i) = 1;
                     else
                         response_ture(i) = 0;
                     end
                 elseif(K_code(keye))
                     if(strcmp(file_nm(1:3),'sce'))       %取当前图片的前三个字母判断是否匹配sce
                         response_ture(i) = 1;
                     else
                         response_ture(i) = 0;
                     end
                 else
                     response_ture(i) = 0;
                 end
                 break
             end
         end
                         
         Screen('FillRect',win,128);
         time_stamp = Screen('Flip',win,time_stamp+(word_onset-0.5)*flipIntv);
     end
     time_stamp = Screen('Flip',win,time_stamp+1);
     stats.subinfo={'WZY','Male','21yrs'}; % cell记录
     stats.trial_num=Total_trial;
     stats.Image_order=Image_order;
     stats.image_shown=Image_pool;
     stats.SOAs=SOA_pool(SOA_order);
     stats.Masks=Mask_pool(Mask_order+1);
     stats.response={RT_pool,response_ture,response_pool};
     stats.docs='Masks = 1 is unmask,Masks = 2 is masked';
     save mask_result.mat stats
     
     Screen('CloseAll');
     ListenChar(0);
 catch
     ListenChar(0);
     sca;
 end
 
 function pixs=deg2pix(degree,inch,pwidth,vdist)
    screenWidth = inch*2.54/sqrt(1+9/16);
    pix = screenWidth/pwidth;
    pixs = round(2*tan((degree/2)*pi/180)*vdist/pix);
 end
 
 function nframe = time2frame(flipIntv,duration)
    nframe = round(duration/flipIntv);
 end

到了这里,关于Matlab键盘鼠标输入学习及PsychToolBox对刺激反应结果的保存的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 搬家后台式电脑开机无信号、进不去系统,键盘鼠标没反应

    最近搬家遇到一个奇怪的事情。 现象:开机屏幕显示无信号,使用笔记本测试显示器和线材是正常的。键盘鼠标都点不亮,按大小写切换无反应。 尝试过的方法: 1、取出显卡,使用橡皮擦擦拭金手指。 结果:未解决,仍然开机无信号。 2、取出内存条重新插拔。 结果: 未

    2024年02月11日
    浏览(139)
  • 笔记本电脑开机后,屏幕无反应,插入的鼠标和键盘无灯亮起

    笔者今天的笔记本电脑突然开机后磁盘有反应,但是显示屏和鼠标都是未接入电源的情况。 一开始想进入安全模式检查一番,即开机连续按F12。第一次尝试可以进图安全模式,随后又键盘灯光和显示屏亮起,显示屏上显示进入安全模式,随后一两秒又再次再次黑屏。重复几次

    2024年02月14日
    浏览(87)
  • 【Unity入门】鼠标输入和键盘输入

    一、监听鼠标输入 GetMouseButtonUp 、GetMouseButtonDown、GetMouseButton input.GetMouseButtonDown和 input.GetMouseButtonUp 能够分别监听鼠标的按下和松开事件,GetMouseButton长按响应,值得注意的是,这三个方法需要传入参数,0表示左键,1表示右键,2表示中间键 比如我们可以在代码中这样写,来

    2024年02月03日
    浏览(40)
  • 【Unity入门】15.鼠标输入和键盘输入

        大家好,我是Lampard~~     欢迎来到Unity入门系列博客,所学知识来自B站阿发老师~感谢   (1) Input类     Unity的 Input类提供了许多监听用户输入的方法 ,比如我们常见的鼠标,键盘,手柄等。我们可以用Input类的接口来获取用户的输入信息     下面我们会调用几个常用的

    2024年02月09日
    浏览(40)
  • JAVA 鼠标控制与键盘输入控制

    该类是JDK定义的电脑系统的抽象类,可以用来模拟实现鼠标点击与键盘输入等信息 简单实现一个自动抢票代码: InputEvent.BUTTON1_MASK 左键 (食指点击) InputEvent.BUTTON2_MASK 中键 (滚轮) InputEvent.BUTTON3_MASK 右键(中指点击) 得到的信息需要根据屏幕--显示设置--缩放与布局的百分

    2024年02月13日
    浏览(39)
  • 34_输入设备键盘鼠标你得会

    键盘和鼠标是个人计算机中常用的输入设备。通过键盘可以将字母、数字、标点符号等输入计算机中,从而向计算机发出命今;鼠标可以对屏幕上的光标进行定位,并通过鼠标按钮和滚轮对光标所处位置的屏幕元素进行操作。一个应用程序应该响应用户的键盘和鼠标输入事件。

    2024年01月22日
    浏览(37)
  • Unity Input输入类-鼠标键盘检测

    当你开发Unity游戏时,与用户的输入交互是非常重要的。Unity提供了丰富的输入类来帮助你获取用户的输入,并做出相应的响应。在本文中,我将会向你介绍Unity中的输入类,包括Input、KeyCode、MouseButton和Touch等。 Input类 Input类是Unity中最基础的输入类,它可以获取各种类型的输

    2024年02月11日
    浏览(55)
  • unity3D 鼠标键盘输入

    一、鼠标键盘输入 游戏的输入可以来自于鼠标,键盘,触摸屏,游戏手柄 显示一个Vector3类型的xyz的鼠标位置。 Input.GetButtonDown(0):0代表鼠标左键,1代表鼠标右键,如果鼠标左键按下返回true。 Input.GetKeyDown(\\\"space\\\"): 检测空格是否按下。 更多操作可以查看Unity Script API( UnityE

    2024年02月10日
    浏览(81)
  • c++ 键盘/鼠标交互+特殊输入/输出+窗口常用函数

    需要头文件: 或: 函数: 使用方法: 1.if(KEY_DOWN(某个键))或if(KEY_UP(某个键)) 检测该键是否按下/未按下 2.keybd_event(某个键,0,0,0);或keybd_event(某个键,0,KEYEVENTF_KEYUP,0); 使该键是否按下/弹起(实际使用可参照下文鼠标函数click_left()) 键码表(替换“某个键”): 函数: 使用方法: gx()或

    2024年02月09日
    浏览(59)
  • 【Unity】Input——检测鼠标、键盘、手柄输入、鼠标在屏幕上的位置等等

    Unity提供的 更方便的 控制对象的 位移和旋转的解决方案 这个Axis是可以自定义的:

    2024年02月11日
    浏览(90)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包