我在哪里可以找到用于刺激精神病的闪烁功能?我该如何使用它?

Where can i find flickering functions for stimuli on psychopy? and how do i use it?

目前我正在为我的 Uni 论文构建一个 Psychopy 刺激,这 4 个刺激需要使用显示器刷新率以 8.57 Hz、10 Hz、12Hz 和 15 Hz 闪烁,我的问题是,psychopy 可以吗那?还有我使用什么功能来闪烁 psychopy?到目前为止我所做的是创建需要闪烁的形状。闪烁效果必须取决于频率和相位

    from psychopy import visual, event, core,gui ,data,  logging #import c
    from numpy import sin, pi

    cyclepersecond=8.57142
    #Penentuan pergeseran fasa efek grating 
    phase=0
    phase1=0
    phase2=0
    phase3=0
    phase4=0
    #Penentuan Frekuensi temporal dari penampilan efek grating
    #phaseincrement = (cyclepersecond*360)
    #gratingtex=visual.GratingStim(win, res(1), res(2), [0 0 0 0])

    win = visual.Window([1366,768], color='black', units='pix',fullscr=False,) #membuat Window
    #pembuatan stimulus
    kotak1=visual.Rect(win, width= 150,height =150,pos=(10,250),)
    segitiga1=visual.Polygon(win, edges=3, radius=40,pos=(10,250))
    #segitiga1.setColor([-1,1,-1], colorSpace='rgb')
    kotak2=visual.Rect(win, width= 150, height=150,pos=(400,-200))
    segitiga2=visual.Polygon(win, edges=3, ori=90,radius=40, pos=(400,-200))
    kotak3=visual.Rect(win,width=150, height= 150, pos=(-400,-200))
    segitiga3=visual.Polygon(win,edges=3,radius=40,ori=-90,pos=(-400,-200))
    kotak4=visual.Rect(win,width= 150, height=150,pos=(0,-200))
    lingkaran1=visual.Circle(win,radius=40, edges=32,pos=(0,-200))

    trialClock=core.Clock()
    t=0
    while True:
         t=trialClock.getTime()
         kotak1.contrast=sin(t*pi*2)
         kotak1.draw()
         segitiga1.draw()
         kotak2.draw()
         segitiga2.draw()
         kotak3.draw()
         segitiga3.draw()
         kotak4.draw()
         lingkaran1.draw()
         win.flip()
         #core.wait(5.0)


    for key in event.getKeys():
      if key in ['escape','q']:
         core.quit()

我从 matlab 中的 psychtoolbox 知道你可以使用翻转来实现闪烁效果,但我真的不知道如何在 psychopy 中做到这一点

PsychoPy 似乎没有内置闪烁功能。它的创建者 Jon Pierce recommends 通过以下方式实现闪烁:

  • 循环帧(使用变量frameN
  • 使用 modulo 运算符 (%) 从帧数中导出布尔值,对应于您想要的频率(因此它从 1 开始一个帧块,然后在下一个帧块上为 0,然后返回 1,等等)
  • 在每一帧上,将图像的不透明度设置为该布尔值(1 = 完全不透明,0 = 透明)

因此,如果您的显示器是 60Hz,((frameN % 12) >= 6) 将在 6 帧(或 1/10 秒)内为 1,然后在接下来的 6 帧内为 0,然后再次为 1,然后再次为 0,等等。那会让你得到 10Hz 的闪烁;对于要实现的每个闪烁频率,您必须在模函数中使用不同的除数。

@A_S00 发布了一个很好的概念性答案。非常具体,假设您使用 60 Hz 显示器:

  1. 8.57 Hz 对应于 60/8.57 = 7 帧开启和 7 帧关闭。
  2. 10 赫兹 --> 6 帧
  3. 12 赫兹 --> 5 帧
  4. 15 赫兹 --> 4 帧

...这里假设频率是 SHIFTS(每秒 8.57 次转换)而不是 CYCLES(每秒 8.57 次开关)的频率,因为后者在 60 Hz 显示器上是不可能的,因为你应该在第 3 帧和第 4 帧之间更改图像。

例如12 赫兹你会做:

flicker_frequency = 12
current_frame = 0
while True:
     # When to draw stimuli
     if current_frame % (2*flicker_frequency) < flicker_frequency:
         kotak1.contrast = sin(t*pi*2)
         kotak1.draw()
         segitiga1.draw()
         kotak2.draw()
         segitiga2.draw()
         kotak3.draw()
         segitiga3.draw()
         kotak4.draw()
         lingkaran1.draw()

     # Show whatever has been drawn. Sometimes the stimuli, other times a blank screen. flip() waits for the next monitor update so the loop is time-locked to the screen here.
     win.flip()
     current_frame += 1  # increment by 1.