2016-05-26 1 views
1

В настоящее время я создаю стимулы в Psychopy для моей диссертации в своем Uni, 4 стимула должны мерцать на 8,57 Гц, 10 Гц, 12 Гц и 15 Гц, используя частоту обновления монитора, мой вопрос: может ли это сделать психопат? а также какие функции я использую для мерцания у психопата? то, что я сделал до сих пор, создает формы, которые нужно мерцать. мерцающие эффекты должны зависеть от частоты и фазыГде я могу найти мерцающие функции для стимулов на психопатии? и как его использовать?

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() 

Я вроде знаю, из psychtoolbox в MATLAB можно использовать флип для мерцающего эффекта, но я не знаю, как сделать это в psychopy

ответ

1

У PsychoPy нет встроенной функции для мерцания. Его создатель, Джон Пирс, recommends реализации мерцающих по:

  • цикла над кадрами (с использованием переменной frameN)
  • Использования по модулю оператора (%), чтобы вывести логическое значение из числа кадров, соответствующего частоту, которую вы хотите (так, чтобы она переходила от 1 к одному блоку кадров, затем 0 на следующем блоке кадров, затем обратно в 1 и т. д.)
  • На каждом кадре, устанавливая непрозрачность вашего изображения на это булево (1 = полностью непрозрачный, 0 = прозрачный)

Итак, если ваш монитор 60 Гц, то ((frameN % 12) >= 6) будет 1 для 6 кадров (или 1/10 секунды), затем 0 для следующих 6 кадров, затем 1 снова, затем снова 0 и т. Д. Это даст вам 10 Гц мерцание; вам придется использовать разные делители в своей модульной функции для каждой частоты мерцания, которую вы хотите реализовать.

2

@ A_S00 опубликовал хороший концептуальный ответ. Чтобы быть очень конкретным, если вы используете монитор с частотой 60 Гц:

  1. 8,57 Гц соответствует 60/8.57 = 7 кадров и 7 кадров.
  2. 10 Гц -> 6 кадров
  3. 12 Гц -> 5 кадров
  4. 15 Гц -> 4 кадра

... вот если предположить, что частота частота смены (8,57 сдвиги в секунду), а не CYCLES (8.57 вкл. и выкл. в секунду), поскольку последнее невозможно было бы на мониторе с частотой 60 Гц, так как затем вы должны изменить изображение между кадрами 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. 
+0

Спасибо за отличный ответ. fyi Мне пришлось обернуть в круглые скобки '2 * flicker_frequency', чтобы сделать эту работу. – Jakub

Смежные вопросы