我在哪里可以找到用于刺激精神病的闪烁功能?我该如何使用它?
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 显示器:
- 8.57 Hz 对应于 60/8.57 = 7 帧开启和 7 帧关闭。
- 10 赫兹 --> 6 帧
- 12 赫兹 --> 5 帧
- 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.
目前我正在为我的 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 显示器:
- 8.57 Hz 对应于 60/8.57 = 7 帧开启和 7 帧关闭。
- 10 赫兹 --> 6 帧
- 12 赫兹 --> 5 帧
- 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.