关于使用event.getKeys存储反应时并结合sounddevice播放声音的实验问询
实现目标刺激反应时记录的方案
看起来你已经搭好了实验的基本框架——视觉刺激(100ms时长)和同步的100ms声音,要求被试看到目标刺激时按空格键。要准确计算反应时,核心就是同步记录两个关键的全局时间点:目标刺激开始呈现的时刻,以及被试按下空格键的时刻,两者的差值就是你要的反应时。
下面是具体的实现思路和代码示例(基于PsychoPy,因为你提到了event.getKeys):
1. 记录目标刺激的Onset全局时间
在你呈现目标视觉刺激的瞬间,立刻用core.getTime()获取当前的全局时间,把这个值存下来——这是反应时计算的起始点:
from psychopy import core, visual, event, sound # 初始化窗口、刺激等基础设置 win = visual.Window(size=(800,600), units='pix') target_stim = visual.TextStim(win, text='TARGET') sound_stim = sound.Sound('A', duration=0.1) # 100ms时长的声音 # 目标刺激试次流程 target_stim.draw() win.flip() # 这一步是视觉刺激真正呈现的时刻 target_onset = core.getTime() # 记录目标刺激onset的全局时间 sound_stim.play() # 同步播放声音
2. 获取按键的全局时间并计算反应时
用event.getKeys()的timeStamped=True参数,就能同时获取按键名称和按键发生的全局时间。然后用按键时间减去目标刺激的onset时间,就得到了反应时:
# 等待按键,设置超时为试次剩余时长(试次总时长500ms,已过100ms刺激时长,所以超时设为0.4s) keys = event.getKeys(keyList=['space'], timeStamped=True, maxWait=0.4) if keys: # keys返回的是[(按键名, 按键时间)]格式的列表 press_key, press_time = keys[0] reaction_time = press_time - target_onset print(f"被试反应时:{reaction_time:.3f}秒") # 可以把reaction_time存入结果列表或文件,用于后续分析 else: print("被试未在试次内按键")
几个关键注意点
- 确保
core.getTime()和event.getKeys使用的是同一个时间基准:PsychoPy里默认全局时间是从程序启动开始计时的,所以两者的时间差是准确的。 - 区分目标刺激和非目标刺激:只有在呈现目标刺激时才记录
target_onset,非目标刺激的试次不需要做这个操作,避免无效计算。 - 超时设置要匹配你的试次时长:比如试次总时长是500ms,那么从刺激onset开始,最多给被试500ms的时间按键,所以
maxWait可以设为0.5秒(根据你试次的起始点调整)。
内容的提问来源于stack exchange,提问作者Malina
相关产品推荐
相关产品推荐

