Sha*_*lgi 3 parallel-port python-2.7 psychopy
我是python和psychopy的新手,但是我在编程和设计实验方面有着丰富的经验(使用Matlab和EPrime).我正在运行RSVP(快速视觉序列演示)实验,每X ms显示不同的视觉刺激(X是实验变量,可以是100 ms到1000 ms).由于这是一个生理学实验,我需要在刺激开始时通过并行端口发送触发器.我使用示波器和光电传感器测试触发和视觉开始之间的同步.但是,当我在win.flip()之前或之后发送我的触发器时,即使使用窗口waitBlanking = False参数,我仍然会在刺激的开始和代码的开始之间产生差异.
附上我的代码:
im=[]
for pic in picnames:
im.append(visual.ImageStim(myWin,image=pic,pos=[0,0],autoLog=True))
myWin.flip() # to get to the next vertical blank
while tm < and t < len(codes):
im[tm].draw()
parallel.setData(codes[t]) # before
myWin.flip()
#parallel.setData(codes[t]) # after
ttime.append(myClock.getTime())
core.wait(0.01)
parallel.setData(0)
dur=(myClock.getTime()-ttime[t])*1000
while dur < stimDur-frameDurAvg+1:
dur=(myClock.getTime()-ttime[t])*1000
t=t+1
tm=tm+1
myWin.flip()
Run Code Online (Sandbox Code Playgroud)
如何将刺激开始与触发器同步?我不确定这是否是显卡问题(我正在使用带有板载Intel显卡的LCD ACER屏幕).非常感谢,
Shani
win.flip()等待下一次监视器更新.这意味着win.flip()当监视器开始绘制帧时,几乎完全执行下一行.这就是你想要发送你的触发器的地方.之前的线路win.flip()可能差不多提前一帧,例如60Hz监视器上的16.7 ms,因此您的触发器太早到达.
有两种几乎相同的方法可以做到这一点.让我们从最容易理解的开始:
win.flip()
parallel.setData(255)
core.wait(0.01)
parallel.setData(0)
Run Code Online (Sandbox Code Playgroud)
...所以在图像被推到显示器后立即发送信号.
准确度稍高的方法可以节省0.01毫秒(加上减去一个数量级).在脚本的早期某处定义
def sendTrigger(code):
parallel.setData(code)
core.wait(0.01)
parallel.setData(0)
Run Code Online (Sandbox Code Playgroud)
然后在循环中做
win.callOnFlip(sendTrigger, code=255)
win.flip()
Run Code Online (Sandbox Code Playgroud)
这将在翻转之后调用该功能,然后在心理上进行一些清理.同样,与其他因素相比,这种时间上的差异是微不足道的,这不是一个性能问题,而是风格偏好.
| 归档时间: |
|
| 查看次数: |
875 次 |
| 最近记录: |