2015-03-11 1 views
3

Я новичок в python и psychopy, однако у меня есть большой опыт программирования и проектирования экспериментов (с использованием Matlab и EPrime). Я запускаю эксперимент RSVP (быстрая визуальная последовательная презентация) с отображением различных визуальных стимулов каждые X ms (X - экспериментальная переменная, может составлять от 100 мс до 1000 мс). Поскольку это физиологический эксперимент, мне нужно отправить триггеры по параллельному порту точно на начало стимула. Я тестирую синхронизацию между триггерами и визуальным началом с помощью осциллографа и фотодатчика. Однако, когда я отправляю свой триггер до или после win.flip(), даже с параметром waitBlanking = False окна, я все равно получаю разницу между началом стимулов и началом кода.Как отправить код на параллельный порт в точную синхронизацию с визуальным стимулом в Psychopy

Прикрепленный мой код:


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

Как я могу синхронизировать мой стимул начало с триггером? Я не уверен, что это проблема с видеокартой (я использую экран LCD ACER с встроенной графической картой Intel). Большое спасибо,
Шани

+0

ли вы установили фотодатчик в верхней части экрана и какие задержки вы видите? Фотодатчик в середине экрана часто дает задержку на стороне монитора 5-8 мс. –

+0

Кстати, поскольку вопросы синхронизации важны, не контролируйте время, используя секунды и время. Используйте win.flip(), так как визуальное время дискретно заблокировано для кадров в любом случае. Таким образом, в течение 0,5 сек перерыв на мониторе 60 Гц, петля 0,5 * 60 раз по win.flip(). –

+0

Привет, Йонас, я проверил фотодатчик в верхней части экрана, но также и в центре, это дает аналогичные задержки. Задержки, о которых я говорю, являются большими - больше, чем обновление экрана -20-40 мс. Что касается времени с использованием флип, так как у меня есть код между дисплеями (отправка триггеров, проверка ответов), я обнаружил, что использование только флип обычно приводит к одному дополнительному фрейму. Время, которое я получаю, если измерять внутри психопата (не используя осциллограф) при программировании, как я сделал выше (ttime [t] -ttime [t-1] идеально, потому что я жду один кадр меньше, затем выполняю свой код, а затем жду следующий флип. –

ответ

5

win.flip() ждет следующего обновления монитора. Это означает, что следующая строка после win.flip() выполняется почти точно, когда монитор начинает рисовать кадр. Вот где вы хотите отправить свой триггер. Линия, расположенная непосредственно перед win.flip(), является потенциально почти одним кадром ранее, например. 16,7 мс на мониторе с частотой 60 Гц, чтобы ваш триггер появился слишком рано.

Есть два почти одинаковых способа сделать это. Давайте начнем с самого простого, чтобы понять:

win.flip() 
parallel.setData(255) 
core.wait(0.01) 
parallel.setData(0) 

... поэтому сигнал посылается только после того, как изображение вытеснены на мониторе.

Несколько более точный способ сделать это позволит вам сэкономить 0,01 мс (плюс минус порядок). Где-то в начале сценария определяет

def sendTrigger(code): 
    parallel.setData(code) 
    core.wait(0.01) 
    parallel.setData(0) 

Затем в цикле сделать

win.callOnFlip(sendTrigger, code=255) 
win.flip() 

Это будет вызывать функцию только после того, как флипа, прежде, чем psychopy делает немного уборки. Опять же, эта разница во времени настолько незначительна по сравнению с другими факторами, что это не вопрос производительности, а скорее предпочтений стиля.

+0

Спасибо. Я изменил свой код, как вы предлагали, однако это не меняет ситуацию - задержки все те же. что команда flip() сначала выполняет код, а затем ждет вертикальной пустоты экрана и не выполняется на вертикальной заготовке. Интересно, может ли это быть изменено. Я понятия не имею, почему длительная задержка при использовании EPrime я не получаю такие задержки, так что это не результат монитора или видеокарты. –

+0

PsychoPy обычно идеально подходит для этого, поэтому я все еще подозреваю, что что-то в коде вызывает это. Пробовали ли вы минимальный пример, где вы просто представляете белый timulus на черном фоне, а затем сделать '' stim.draw() '', а затем отправить триггер, как указано выше? Без всякого времени. Просто чтобы проверить, что-то еще глубже в системе/PsychoPy, или если это что-то о том, как вы скрепили свой сценарий. –

+0

Да Я использовал простой тестовый код, а также использовал контрольный код, описанный в https://gist.github.com/jeremygray/9062586, изменив его для отправки кода. Когда вы говорите, что психопатия идеальна в этом, вы имеете в виду при тестировании с помощью осциллографа? Потому что тестирование внутри кода (getTime [t] -getTime [t-1]) идеально, но экран говорит разные. –

0

Существует скрытая временная переменная, которая обычно игнорируется - входной лаг монитора, и я думаю, что это причина задержки. Проще говоря, монитору требуется некоторое время для отображения изображения даже после получения ввода с видеокарты. Эта задержка не имеет ничего общего с частотой обновления (сколько раз буфер экрана переключается) или временем отклика монитора.

На моем мониторе, я нахожу задержку в 23 мс, когда посылаю триггер с помощью callOnFlip(). Как я исправлю это: floor (23/16.667) = 1 и 23% 16.667 = 6.333. Поэтому я вызываю callOnFlip во втором кадре, жду 6.3 мс и запускаю порт. Это работает. Я не пробовал с WaitBlanking = True, который ждет начала гашения с графической карты, так как это дает мне еще немного времени для подготовки следующего буфера. Тем не менее, я думаю, что даже с WaitBlanking = True эффект будет там. (Больше после тестирования!)

Best, Шуддха

+0

Большое спасибо, я попробует это.Однако это не то, о чем должен заботиться Psychopy? При использовании EPrime такого запаздывания нет. –

+0

Задержка входа монитора зависит только от монитора, и если вы его не получите с EPrime Я думаю, что здесь происходит что-то еще ... – sus