Psychtoolbox的时间戳技术---视听刺激的同步呈现

  一般我们从硬件与软件两方面来处理时间精度问题。硬件方面使用独立声卡以及高刷的显示器会得到更精良的时间参数,本文主要在软件方面通过时间戳技术对刺激呈现加以把控。
  本文将从听觉刺激呈现,视觉刺激呈现以及视听刺激呈现三个方面来讲解有关Psychtoolbox中的时间戳技术。
在这里插入图片描述
  本文讲解内容与冯成志《PSYCHTOOLBOX工具箱及MATLAB编程实例》、陈立翰《心理学研究方法–基于MATLAB和PSYCHTOOLBOX》 两本著作有很多理论一致部分,会直接抛出相应部分,不在本文赘述。

1 听觉刺激呈现

听觉刺激呈现流程

clear
%%声音制作
sr=44100;
durtion=0.01;
F=1000;
gatedurtion=0.005;
channel=2;
beep=sinbeep(sr,durtion,F,gatedurtion,channel);
InitializePsychSound;%音频播放初始化
pahandle=PsychPortAudio('Open',[],1,1,sr,2);%打开音频播放设备
PsychPortAudio('FillBuffer',pahandle,beep);%将音频加载至播放缓冲区
PsychPortAudio('Start',pahandle,1);%播放声音
PsychPortAudio('Stop',pahandle,1);%停止播放声音
PsychPortAudio('Close',pahandle);%关闭音频播放设备

  如程序所示,听觉刺激呈现流程:
  ①制作听觉刺激音频
  ②音频播放初始化
  ③打开音频播放设备
  ④将音频加载至播放缓冲区
  ⑤播放声音
  ⑥停止播放声音
  ⑦关闭音频播放设备

①制作听觉刺激音频

  两种听觉刺激制作方式,在Matlab中自行制作,或者使用SoundEngineFree等音频制作软件将所需音频制作好后用代码读取即可。在第二本书中讲解了很多种类的听觉刺激制作,可自行参考。由于我常用正弦音,所以这里将正弦音的制作封装为函数,主程序中可以直接调用函数。在主程序中我设置了声音时长为100ms,淡入淡出时间5ms,采样率44100,声音频率1000hz,双声道发出的听觉刺激。如此将常用音频封装函数在使用时会十分的方便,同理如果研究中有你常用的声音类型,也可以封装成独立的函数,方便修改以及随取随用。

function beep=sinbeep(sr,durtion,F,gatedurtion,channel)
%需要输入声音的几个值
%sr,采样率
%durtion,声音的时长
%F,声音的频率
%gatedurtion,淡入淡出的时间
%channel,声音从哪个声道发出
temp=linspace(0,durtion,sr*durtion);%用linspace生成temp
tone=sin(2*pi*F*temp);%用sin生成纯音的矩阵
gate=cos(linspace(pi,2*pi,sr*gatedurtion));%淡入淡出制作
gate=(gate+1)/2;%取一半为淡入
offsetgate=fliplr(gate);%向量反转为淡出
sustain=ones(1,(length(tone)-2*length(gate)));%生成去掉淡入淡出部分的矩阵
envelope=[gate,sustain,offsetgate];%生成淡入+上面一行的1矩阵+淡出
smoothed_tone=envelope.*tone;%乘以原来的纯音制作生成最终平滑的声音
%定义声音从哪个个通道发出
%2-双声道,1-左声道,0-右声道
if channel==2
    beep=repmat(smoothed_tone,2,1);
elseif channel==1
    beep=smoothed_tone;
    beep(2,:)=0;
elseif channel==0
    beep=repmat(smoothed_tone,2,1);
    beep(1,:)=0;
end
end

②音频播放初始化

InitializePsychSound;

  每次使用Psychtoolbox来播放音频都需要调用InitializePsychSound进行初始化,这里的重点在于如果你的硬件设备没有独立声卡,需要安装ASIO4ALL驱动程序来仿真ASIO接口以达到降低延迟的目的,换句话说在硬件上如果没有独立声卡,下载一个软件来充当这个独立声卡,从而达到降低延迟的目的,这一步骤对于降低延迟很重要,在第一本书中详细介绍了有关下载以及下载成功的介绍。

③打开音频播放设备

pahandle=PsychPortAudio('Open',[deviceid],[mode],[reqlatencyclass],[freq],[channels],......);

  打开音频设备函数中包含了9个参数,正常情况下基本使用前5个即可,返回供进一步操作的音频句柄。

参数(1)deviceid:如果安装了多个音频设备,该参数用于指定设备编号,默认为默认设备,一般设置为[]即可。

  这里我发现如果不使用默认值,而是通过具体值来指定播放设备就会增大播放延迟,具体对比如下图。
  默认值[]的输出延迟是:7.891156ms
在这里插入图片描述
  指定输出设备的输出延迟是:116.099773ms
在这里插入图片描述
  对比两组图片上的信息发现,默认值下使用了ASIO来降低延迟,而指定输出设备情况下并没有。所以这里应该将所使用的设备设为默认设备,然后使用默认[]就好。此外如果不使用ASIO降低延迟,也就意味着在第一步没有下载ASIO4ALL,会在命令行窗口中得到警告信息,即使使用默认值下的延迟也在39ms左右。

参数(2)mode:默认值为1,1=音频播放;2=音频捕获;3=捕获+播放(该值并非在所有的音频设备上稳定运行,有可能导致MATLAB崩溃)

  崩溃界面如图所示。
在这里插入图片描述
  具体什么样的设备会让Matlab崩溃还不得而知,据我测试发现,笔记本的外放,蓝牙设备的低音炮大概率会导致崩溃,而插耳机和双声道的扬声器会很稳定。

参数(3)reqlatencyclass:0=不关心延迟;1=尽量减小延迟;2=获取完全控制权,即使导致其他音频相关程序失败或者关闭;

  直接使用1即可,做实验的情况下也不应该还有其他音频相关的内容在工作。

参数(4)freq:采样率,设置播放器的采样率值即可

参数(5)channels:音频通道数,默认为2(立体声)。

  综上,将打开音频设备的参数如主程序所示设置:

pahandle=PsychPortAudio('Open',[],1,1,sr,2);

④将听觉刺激加载至播放缓冲区

PsychPortAudio('FillBuffer',pahandle,beep);

  参数1是音频设备的句柄,参数2是所要播放的音频变量。

⑤播放音频

  Matalb中的听觉刺激播放有很多种方式,比如Snd和sound函数都可以播放音频数据,但相比于Pcychtoolbox中的音频播放函数PsychPortAudio来说,Matlab自带的函数播放延迟都太大,所以涉及音频播放都应选择PsychPortAudio来处理。

PsychPortAudio('Start',pahandle,1);

  参数1是音频设备的句柄,参数2是播放次数。虽然播放声音也有一个时间的返回值,但是它返回的并不是距离系统运行的时间参数,这与视觉刺激呈现(Flip)中的返回值是不同的,所以我一般通过GetSecs来获取播放音频的时间参数。

⑥停止音频播放

PsychPortAudio('Stop',pahandle,1);

  参数1是音频设备的句柄,参数2播放完毕停止。

⑦ 关闭音频播放设备

PsychPortAudio('Close',pahandle);

  一般在试次循环结束后使用。

2 视觉刺激呈现

  我认为时间戳技术最大的应用在于怎样精确的呈现视觉刺激,在了解这种精确的呈现方法之前要确保你了解Psychtoolbox的视觉刺激呈现机制是怎样的,这两部分内容的相应原理都可以参考两本书中的内容。这里我们直接说方法:将视觉刺激提前半个刷新周期呈现

VBLTimestamp=Screen('Flip',[windowPtr],[when],[dontclear]);

参数(2)when:设置合适进行页面切换,默认值0,表示在下一个可能的回扫进行切换;
如果设置大于0,则表示系统将在指定时间(when)后的收割回扫进行切换。

  方法中的提前半个刷新周期呈现就在此参数中设置。

参数(3)dontclear:默认值为0,表示页面切换完毕后清除帧缓冲,1=不清楚帧缓冲,这样可以持续向缓冲区中累加绘制新的内容

返回值(1)VBLTimestamp:记录页面切换开始时刻的时间(距系统启动时的时间)

  了解参数后实施方法:

refreshtime=Screen('GetFlipInterval',w);
vbl=Screen('Flip',w);%vbl赋初试值
vbl=Screen('Flip',w,vbl+0.5*refreshtime);

3 视听刺激同时呈现

  结合上述两方面内容,由于刺激类型差异,所以视听刺激同时呈现时:将听觉刺激呈现代码放在前面,然后再是视觉刺激呈现的代码。
  我们通过一个实验来验证一下,实验示例如视频所示,在10次变化的圆盘中,某次变化会同步听觉刺激。实验代码较长就不展示了。具体操作:是在每个试次开始前设置一个初始时间点,同步呈现的听觉刺激和视觉刺激减初始时间即为本试次的听觉视觉刺激呈现时间。

示例

audiotime           visualtime          audiotime—visualtime
2.12939600000391	2.13705150003079	-0.00765550002688542
2.12574260000838	2.13317270000698	-0.00743009999860078
2.12536359997466	2.13230150000891	-0.00693790003424510
3.73695150000276	3.74385490000714	-0.00690340000437573
6.96116999996593	6.96839210001053	-0.00722210004460067
3.73920899996301	3.74603549996391	-0.00682650000089780
5.34758540004259	5.35440579999704	-0.00682039995444939
5.34795800002758	5.35504520003451	-0.00708720000693575
5.35043150000274	5.35727279999992	-0.00684129999717698
6.96192470000824	6.96901040000375	-0.00708569999551401
2.12275040004170	2.13011770002777	-0.00736729998607189
2.13396040000953	2.14002659998368	-0.00606619997415692
6.95896379998885	6.96633710002061	-0.00737330003175885
3.73806840000907	3.74499919998925	-0.00693079998018220
6.95869739999762	6.96584819996497	-0.00715079996734858
3.73733040003572	3.74426790000871	-0.00693749997299165
2.12431779998587	2.13126769999508	-0.00694990000920370
6.95726210001158	6.96469579997938	-0.00743369996780530
6.96130770002492	6.96884739998495	-0.00753969996003434
2.12488449999364	2.13192179996986	-0.00703729997621849
3.73777399997925	3.74486420000903	-0.00709020002977923
3.74026990000857	3.74674289999530	-0.00647299998672679
5.35005110001657	5.35694389999844	-0.00689279998186976
2.12676340003964	2.13340530003188	-0.00664189999224618
5.34771200001705	5.35473530000309	-0.00702329998603091
5.34590019995812	5.35287319996860	-0.00697300001047552
3.73295669996878	3.74027770000976	-0.00732100004097447
5.34612940001534	5.35307800001465	-0.00694859999930486
5.34603549999883	5.35297170002013	-0.00693620002130047
3.73322369996458	3.74012679996667	-0.00690310000209138

  二者的时间差异没有大于8ms

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值