<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="pl">
	<id>http://brain.fuw.edu.pl/edu/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Aduszyk</id>
	<title>Brain-wiki - Wkład użytkownika [pl]</title>
	<link rel="self" type="application/atom+xml" href="http://brain.fuw.edu.pl/edu/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Aduszyk"/>
	<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php/Specjalna:Wk%C5%82ad/Aduszyk"/>
	<updated>2026-04-07T21:05:48Z</updated>
	<subtitle>Wkład użytkownika</subtitle>
	<generator>MediaWiki 1.34.1</generator>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=Pracownia_EEG/ERDS&amp;diff=9047</id>
		<title>Pracownia EEG/ERDS</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=Pracownia_EEG/ERDS&amp;diff=9047"/>
		<updated>2023-01-10T11:55:17Z</updated>

		<summary type="html">&lt;p&gt;Aduszyk: /* Wyznaczenie pasma &amp;amp;mu; i &amp;amp;beta; */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Pracownia EEG|Pracownia EEG]] / ERD/S&lt;br /&gt;
&lt;br /&gt;
=Wstęp=&lt;br /&gt;
Wśród badań wykonywanych z wykorzystaniem rejestracji EEG czy MEG można wyróżnić badania spoczynkowe, gdzie rejestrowana jest spontaniczna aktywność mózgu oraz badania zmian aktywności pod wpływem różnych bodźców, przy czym bodźce te mogą być pochodzenia egzo- lub endogennego. Reakcja na bodziec może wykazywać stały związek fazowy z momentem wystąpienia bodźca &amp;amp;mdash; w takiej sytuacji mówimy o potencjałach lub polach wywołanych (ang. ''event related potential'', ''ERP'' i ''event related field'', ''ERF'') &amp;amp;mdash; lub też może nie być fazowo związana z bodźcem.&lt;br /&gt;
&lt;br /&gt;
Niniejsza część pracowni poświęcona jest metodologii badania reakcji mózgu na bodźce, które są czasowo ale niekoniecznie fazowo związane z bodźcem.&lt;br /&gt;
&lt;br /&gt;
=Zmiany pasmowej mocy sygnału EEG=&lt;br /&gt;
Pierwsze rezultaty opisujące zmiany w mocy pasmowej sygnału EEG (spadek mocy rytmu alfa) związane z reakcją na bodziec zostały opisane w pracy doktorskiej Adolf Becka zatytułowanej &amp;amp;bdquo;Oznaczenie lokalizacyi w mózgu i rdzeniu za pomocą zjawisk elektrycznych&amp;amp;rdquo; (Beck,  1891). &lt;br /&gt;
Ilościowe badania zjawisk modulacji mocy sygnału EEG w reakcji na bodźce rozpoczęto stosunkowo niedawno. Począwszy od pracy (Pfurtscheller, 1979) zjawiska te zaczęto nazywać ''Event Related Desynchronization'' (ERD) &amp;amp;mdash; czyli desynchronizacja związana z bodźcem. Termin ERD dotyczy spadku mocy. Przez analogię w późniejszych pracach terminem ''Event Related Synchronization'' (ERS) opisywane są efekty polegające na wzroście mocy. W większości paradygmatów eksperymentalnych zjawiska ERD i ERS są małe w porównaniu ze zmiennością mocy sygnału EEG związanej ze spontaniczną aktywnością mózgu. W celu ich ilościowego badania wymagane jest zarejestrowanie wielu realizacji reakcji na bodziec i poddanie ich analizie statystycznej. &lt;br /&gt;
&lt;br /&gt;
[[Plik:Paradygmat erds.gif|thumb|800px|center]]&lt;br /&gt;
==Interpretacja fizjologiczna==&lt;br /&gt;
[[Plik:EEG_synchronicznosc.png|600px|thumb|right|Synchronicznie pobudzana grupa neuronów piramidalnych kory tworzy warstwę dipolową.]]&lt;br /&gt;
[[Plik:Mapka_tf_erds.png|600px|thumb|right|Przykładowa mapa zjawiska synchronizacji i desynchronizacji sygnału EEG w przestrzeni czas-częstość dla sygnału zearejestrowanego przez elektrodę C3. Osoba badana wykonywała szybki ruch palcem w momencie oznaczonym 0. Kolory odpowiadają procentowej zmianie mocy względem poprzedzającego okresu 2s, zgodnie ze skalą barw umieszczoną po prawej stronie.  Na poziomej osi - czas w s, na pionowej częstość w Hz.]]&lt;br /&gt;
Terminy ERD i ERS mają swoje źródło w fizjologicznej interpretacji zmian mocy sygnału w określonych pasmach częstości.  Źródłem mierzalnego na powierzchni głowy sygnału elektrycznego lub magnetycznego jest synchroniczna aktywność wielu neuronów (głównie piramidalnych kory). Szacuje się, że wpływ na wielkość sygnału EEG lub MEG ma głównie stopień synchronizacji neuronów wytwarzających ten sygnał, a w drugiej kolejności ich ilość (Nunez, 1981). Tak więc wzrost mocy w pewnym paśmie (np. alfa ERS) interpretowany jest jako wzrost synchronizacji aktywności neuronów generujących aktywność EEG w tym paśmie, zaś spadek mocy (np. alfa ERD) interpretowany jest jako spadek synchronizacji neuronów generujących aktywność EEG w tym paśmie częstości. Przy takiej interpretacji należy pamiętać o skali w jakiej dokonywany jest pomiar. Zarówno elektrody EEG jak i cewki MEG mierzą sygnały średnie pochodzące od olbrzymich ilości neuronów. Zatem zmiana mocy w tym sygnale odpowiada desynchronizacji lub synchronizacji w skali makroskopowej (rzędu &amp;lt;math&amp;gt;10^6&amp;lt;/math&amp;gt;-&amp;lt;math&amp;gt;10^8&amp;lt;/math&amp;gt; neuronów). &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Zjawiska ERD i ERS badane były zarówno w eksperymentach motorycznych (Pfurtscheller, 1994, Pfurtscheller, 1996a, Pfurtscheller1, 996b , Pfurtscheller1999) jak i kognitywistycznych  (Tallon Baudry, 1996, Tallon, 1999, Kaiser2003).&lt;br /&gt;
Wnioski płynące z tych prac są takie, że znaczenie zjawisk ERD i ERS zależy od pasma częstości, w którym one występują. Aktywność w paśmie alfa wiązana jest ze stanem spoczynkowym, ERD w paśmie alfa i beta wiązane jest z pobudzeniem danego rejonu kory mózgowej, w którym zjawisko to zachodzi. ERS w paśmie alfa i beta następujący po ERD w tym samym paśmie częstości interpretowany jest najczęściej jako przejaw inhibicji lub kasowania poprzedniego stanu. Z kolei zwiększona aktywność w paśmie gamma jest interpretowana jako przejaw funkcjonalnej aktywacji danego fragmentu kory. Nowe wyniki pojawiają się na bieżąco i stawiane są nowe pytania co do możliwych interpretacji poszczególnych zjawisk  np. (Crone, 2010).&lt;br /&gt;
&lt;br /&gt;
Oprócz motywacji czysto poznawczych, badania zjawisk ERD i ERS stymulowane są przez praktyczne możliwości ich wykorzystania w diagnostyce epilepsji, gdzie są nadzieje na zastosowanie tej techniki w miejsce bardziej inwazyjnej metody mapowania mózgu przez elektrostymulację (Crone 1998a, Crone, 1998b, Crone, 2006) oraz w konstrukcji interfejsów mózg-komputer (Pfurtscheller, 2006).&lt;br /&gt;
[[Plik:Mapowanie.png|thumb|600px|center|Mapowanie kory czuciowo-ruchowej za pomocą stymulacji: dwie falki – bezwolne reakcje ruchowe, trzy falki – kloniczny skurcz mięśni, za Crone, 1998]]&lt;br /&gt;
[[Plik:Mapki_ECoG.jpg|thumb|600px|center|Mapowanie kory czuciowo-ruchowej za pomocą ERD/ERS.Pacjent z przyczyn medycznych miał umieszczoną na korze motorycznej siatkę elektrod (6x8, odstęp 1cm). Pacjent miał zaciskać pięść w odpowiedzi na bodziec wzrokowy przez cały czas trwania bodźca (3s)&lt;br /&gt;
Prezentowane mapy istotnych statystycznie zmian uzyskano na podstawie 49 wolnych od artefaktów realizacji.]]&lt;br /&gt;
&lt;br /&gt;
==Estymacja zmian mocy sygnału EEG w dziedzinie czasu==&lt;br /&gt;
Przebieg czasowy zjawiska ERD i ERS jest specyficzny dla pasm częstości.&lt;br /&gt;
[[Grafika:ERDS klasycznie_1.png|right|thumb|768px|&amp;lt;figure id=&amp;quot;fig:erds_klasycznie&amp;quot;&amp;gt;&amp;lt;/figure&amp;gt; Klasyczne obliczanie ERD/ERS. &amp;lt;br&amp;gt; a) Przykładowy zapis EEG jednej z &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; realizacji  &amp;lt;br&amp;gt; b) przefiltrowany sygnał EEG w wybranym paśmie (tutaj: [15 25] Hz)&amp;lt;br&amp;gt;  c) przefiltrowany sygnał podniesiony do kwadratu &amp;amp;mdash; w ten sposób uzyskujemy przebieg mocy pasmowej w czasie &amp;lt;br&amp;gt; d) uśredniony po realizacjach przebieg mocy pasmowej w czasie &amp;lt;br&amp;gt; e) wygładzony przebieg z d) za pomocą średniej biegnącej (tutaj okienko 0.25 s) czerwone pionowe linie wyznaczają okres referencyjny &amp;lt;br&amp;gt; f) ERD/ERS - względna zmiana sygnału e) w odniesieniu do okresu referencyjnego.]]&lt;br /&gt;
Klasyczny sposób estymowania  ERD i ERS (Pfurtscheller, 1979) polega na (patrz ilustracja): &lt;br /&gt;
*filtrowaniu pasmowym,&lt;br /&gt;
*wyrównaniu realizacji względem momentu wystąpienia bodźca, &lt;br /&gt;
*obliczaniu mocy chwilowej (podniesienie do kwadratu wartości każdej próbki sygnału), &lt;br /&gt;
*uśrednieniu mocy chwilowej po realizacjach, wygładzeniu przebiegu czasowego uśrednionej mocy chwilowej filtrem dolnoprzepustowym.&lt;br /&gt;
*Następnie względna zmiana mocy obliczana jest jako:&lt;br /&gt;
: &amp;lt;math&amp;gt;\mathrm{ERD/ERS}_f(t) = \frac{P_f(t) - R_f}{R_f}  &amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie:&lt;br /&gt;
&amp;lt;math&amp;gt;P_f(t)&amp;lt;/math&amp;gt; &amp;amp;mdash; średnia moc chwilowa w paśmie częstości ''f''; uśrednianie przebiega po realizacjach.&lt;br /&gt;
&amp;lt;math&amp;gt;R_f&amp;lt;/math&amp;gt; &amp;amp;mdash; średnia moc w paśmie ''f'' w okresie referencyjnym; uśrednianie przebiega po realizacjach i po czasie trwania okresu referencyjnego.&lt;br /&gt;
Klasycznym metodom obliczania ERD/ERS poświęcona jest praca (Pfurtscheller, 1999).&lt;br /&gt;
Całościowy obraz zmian mocy sygnału EEG związanych z bodźcem można dogodnie analizować w dziedzinie czas-częstość.&lt;br /&gt;
&lt;br /&gt;
=Cwiczenia=&lt;br /&gt;
&lt;br /&gt;
==Paradygmat ==&lt;br /&gt;
&lt;br /&gt;
===wersja 1===&lt;br /&gt;
Osoba badana siedzi wygodnie i trzyma przycisk podłączony do triggera.&lt;br /&gt;
Na ekranie w odstępach 13&amp;lt;math&amp;gt;\pm&amp;lt;/math&amp;gt;1 sekund wyświetlany jest krzyżyk. Krzyżyk wyświetlany jest przez 2 sekundy. W przeciągu 2 sekund po zniknięciu krzyżyka osoba badana w wybranym przez siebie momencie wciska przycisk. Proszę zarejestrować 60 realizacji.&lt;br /&gt;
&lt;br /&gt;
Przygotuj program implementujący powyższy paradygmat.&lt;br /&gt;
&lt;br /&gt;
===wersja 2===&lt;br /&gt;
Próba rozróżnienia ruchów lewą i prawą ręką &amp;amp;mdash; jak w BCI; na podstawie artykułu [[file:ERDS.BCI.TNSRE2012.pdf]], oczywiście w uproszczonej wersji :-)&lt;br /&gt;
&lt;br /&gt;
Procedura:&lt;br /&gt;
&lt;br /&gt;
Osoba badana ma za zadanie poruszać palcami (wskazującym oraz środkowym) prawej lub lewej ręki. Na ekranie monitora pojawia się strzałka, która widoczna jest przez okres 3 sek. i wskazuje rękę, którą będzie wykonywany ruch. Osoba badana ma ruszyć wskazaną ręką w wybranym przez siebie momencie PO zniknięciu strzałki. &lt;br /&gt;
Dla każdej ręki przewidziane jest 100 powtórzeń. W celu synchronizacji sygnału EEG ze wskazówkami pojawiającymi się na ekranie monitora, w lewym dolnym rogu (gdzie pojawia się biały kwadrat) powinna zostać umieszczona fotodioda. &lt;br /&gt;
&lt;br /&gt;
Rejestracja sygnału:&lt;br /&gt;
&lt;br /&gt;
Wykorzystujemy następujące elektrody umieszczone zgodnie z systemem 10--10: FC3, FC1, FCz, FC2, FC4, C5, C3, C1, Cz, C2, C4, C6, CP5, CP3, CP1, CPz, CP2, CP4, CP6, P1, P2, A1, A1. Dodatkowo wykonujemy pomiar z mięśnia extensor digitorum. W tym celu na obu rękach umieszczamy elektrody bipolarne do EMG (patrz Fig. 1 (elektroda ED3): http://jn.physiology.org/content/100/6/3225.long). Sygnał rejestrujemy z częstością 512 Hz.&lt;br /&gt;
&lt;br /&gt;
Procedura może zostać pobrana ze stony: https://github.com/mroja/signal_utils/tree/master/erds/arrows.&lt;br /&gt;
&lt;br /&gt;
===wersja 3=== &lt;br /&gt;
Osoba ma za zadanie ruszać palcem lub wyobrażać sobie ruch palcem. Polecenia te podawane są losowo (nie więcej niż 3 te same próby powinny być pod rząd). Na ekranie powinna zostać wyświetlona instrukcja, w której opisany jest cel badania. Następnie rozpoczyna się blok prób, w trakcie poszczególnej próby wyświetlane jest polecenie: &amp;quot;Rusz palcem&amp;quot;/ &amp;quot;Wyobraź sobie ruch palcem&amp;quot; na 4s, następnie 3 s przerwy (pusty ekran). Każde polecenie powinno być powtórzone 100 razy. &lt;br /&gt;
&lt;br /&gt;
W trakcie procedury powinien być zbierany sygnał EEG oraz EMG palca. Wykorzystujemy następujące elektrody EEG umieszczone zgodnie z systemem 10--10: FC3, FC1, FCz, FC2, FC4, C5, C3, C1, Cz, C2, C4, C6, CP5, CP3, CP1, CPz, CP2, CP4, CP6, P1, P2, A1, A1. częstość próbkowania: min. 1024 Hz. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--Analiza:&lt;br /&gt;
# ERD/S w pasmach&lt;br /&gt;
# uśrednione mapy czas-częstość osobno dla ruchu lewą i prawą ręką&lt;br /&gt;
# analiza możliwości rozróżnienia ruchu na podstawie EEG&lt;br /&gt;
&lt;br /&gt;
Uśrednianie spektrogramów wykonujemy samodzielnie w Pythonie, a na deser liczymy estymatę średnich rozkładów czas-częstość z MP:&lt;br /&gt;
&lt;br /&gt;
# eksportujemy tagi znalezione na podstawie EMG https://brain.fuw.edu.pl/edu/EEG:Pracownia_EEG/SSVEP_1#.C4.86wiczenie_dla_ch.C4.99tnych i oglądamy w Svarogu wyniki na tle sygnału&lt;br /&gt;
# ściągamy najnowszą wersję Svaroga z http://braintech.pl/svarog, umożliwiającą uśrednianie map&lt;br /&gt;
# Otwieramy w Svarogu plik sygnału wraz z tagami.&lt;br /&gt;
# Ustalamy odpowiedni montaż i filtrowanie sygnału.&lt;br /&gt;
# Uruchamiamy dekompozycję MP (Tools → MP decomposition) wybierając w ustawieniach (zakładka „Signal selection” → zakładka „Marked”)&lt;br /&gt;
## rodzaj taga oznaczającego kolejne powtórzenia&lt;br /&gt;
## początek i długość trwania analizowanego interwału czasu (w sekundach, względem wystąpienia taga)&lt;br /&gt;
&lt;br /&gt;
Po zakończeniu obliczeń otwieramy rezultat w nowym oknie („Get result”). Obliczona w ten sposób „książka” składa się z dekompozycji MP kolejnych powtórzeń eksperymentu, przedstawionych w postaci map czas-częstość. Otrzymane mapy możemy następnie uśrednić (Tools → Average books) i zapisać do pliku graficznego o ustalonej rozdzielczości.--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--==Rejestracja sygnału==&lt;br /&gt;
[[Plik:10_20zAFz.png|thumb| 600px|right]]&lt;br /&gt;
# Zakładamy czepek i elektrody w systemie 10-20, dbamy o to by opory pomiędzy elektrodami były poniżej 5 k&amp;lt;math&amp;gt;\Omega&amp;lt;/math&amp;gt; i różnice pomiędzy oporami różnych elektrod nie przekraczały 20%.&lt;br /&gt;
# Elektrody referencyjne A1 i A2.&lt;br /&gt;
# Elektrodę GND mocujemy w otworze czepka odpowiadającym pozycji AFz (na linii centralnej 10% w stronę nosa od elektrody Fz).&lt;br /&gt;
# Sygnał rejestrujemy z częstością 256 Hz.--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Analiza==&lt;br /&gt;
Czas wciśnięcia przycisku (wersja 1 i 2)/ wzorst EMG (wersja 3) oznaczymy jako 0.&lt;br /&gt;
Poniższą analizę zastosuj dla sygnałów w referencji do uśrednionych odprowadzeń usznych A1 i A2.&lt;br /&gt;
&lt;br /&gt;
===Wyznaczenie pasma &amp;amp;mu; i &amp;amp;beta;===&lt;br /&gt;
# Z sygnału wycinamy fragmenty od &amp;amp;minus;3 do &amp;amp;minus;1 sek. dla elektrod C3 i C4 (elektrody położone nad korą ruchową dłoni). &lt;br /&gt;
# Dla każdej realizacji obliczamy widma metodą Welcha.&lt;br /&gt;
# Otrzymane widma uśredniamy po realizacjach.&lt;br /&gt;
# Z sygnału wycinamy fragmenty od +0.5 do +2.5 sek. dla elektrod C3 i C4 (elektrody położone nad korą ruchową dłoni). &lt;br /&gt;
# Dla każdej realizacji obliczamy widma metodą Welcha.&lt;br /&gt;
# Otrzymane widma uśredniamy po realizacjach.&lt;br /&gt;
# Wykreśl widma z okresu poprzedzającego ruch i z okresu po ruchu nałożone na siebie, a także względną zmianę widma. Zaobserwuj w jakich zakresach częstości &amp;amp;mu; (pasmo około 10 Hz) i &amp;amp;beta; (około 23 Hz) występują największe zmiany.&lt;br /&gt;
#Dla wersji 3 - te same operacje wykonaj dla warunku wyobrażonego ruchu - w pierwszym kroku należy ocenić na podstawie sygnału EMG, czy został wykonany ruch - jeśli tak - próbę taką należy usunąć z analiz. Jako punkt 0 będziemy brać początek polecenia na podstawie tagów.&lt;br /&gt;
&lt;br /&gt;
===Wyznaczenie przebiegu czasowego ERD i ERS ===&lt;br /&gt;
# Zaprojektuj filtry pasmowo przepustowe (Chebyszewa 2 rodzaju) zgodne z wyznaczonymi pasmami. Zbadaj funkcje przenoszenia i odpowiedzi impulsowej.&lt;br /&gt;
# Powycinaj sygnały od &amp;amp;minus;3 do +3 sekund (wszystkie kanały). Przefiltruj każdą realizację. &lt;br /&gt;
# Oblicz moc chwilową za pomocą transformaty Hilberta (kwadrat amplitudy chwilowej).&lt;br /&gt;
# Uśrednij moc chwilową po realizacjach.&lt;br /&gt;
# Oblicz względną zmianę mocy chwilowej względem czasu &amp;amp;minus;3 do &amp;amp;minus;1. W ten sposób otrzymasz przebieg ERD i ERS w czasie.&lt;br /&gt;
# Wykreśl ERD i ERS w układzie topograficznym. (Rozmieść subploty tak, aby z w przybliżeniu odpowiadały pozycjom elektrod).&lt;br /&gt;
&lt;br /&gt;
===Transformacja Hjortha===&lt;br /&gt;
Transformacja Hjortha jest przybliżeniem numerycznym transformacji Laplace'a, czyli drugiej pochodnej przestrzennej.&lt;br /&gt;
Obliczamy ją jako różnicę potencjału pomiędzy daną elektrodą i średnią z czterech sąsiednich elektrod.&lt;br /&gt;
&lt;br /&gt;
Proszę przeliczyć potencjały C3, Cz i C4 na montaż Hjortha oraz powtórzyć analizę ERD/ERS opisaną powyżej.&lt;br /&gt;
Przykładowo dla elektrody C3 montaż Hjortha &amp;lt;math&amp;gt;\mathrm{C3_H}&amp;lt;/math&amp;gt; otrzymuje się w następujący sposób:&lt;br /&gt;
&amp;lt;math&amp;gt;\mathrm{C3_H = C3 - \frac{1}{4}(T3+F3+Cz+P3)}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Literatura=&lt;br /&gt;
* Beck, A., 1891. Oznaczenie lokalizacyi w mózgu i rdzeniu za pomoca zjawisk elektrycznych. Ph.D. thesis, Polska Akademia Umiejętności, Kraków, seria II.&lt;br /&gt;
* Crone, N. E., Miglioretti, D. L., Gordon, B., Lesser, R. P., 1998a. Functional mapping of human sensorimotor cortex with electrocorticigraphic spectral analysis II. Event-related synchronization in the gamma band. Brain 121, 2301–15.&lt;br /&gt;
* Crone, N. E., Miglioretti, D. L., Gordon, B., Sieracki, J. M., Wilson, M. T., Uematsu, S., 1998b. Functional mapping of human sensorimotor cortex with electrocorticographic spectral analysis I. Alpha and beta event-related desynchronization. Brain 121, 2271–99.&lt;br /&gt;
* Crone, N. E., Korzeniewska, A., Franaszczuk, P. J., 2010. Cortical gamma responses: Searching high and low. International Journal of Psychophysiology.&lt;br /&gt;
*Crone, N. E., Sinai, A., Korzeniewska, A., 2006. High-frequency gamma oscilla- tions and human brain mapping with electrocorticography. Progress in Brain Research 159, 275–295.&lt;br /&gt;
* Kaiser, J., Lutzenberger, W., 2003. Induced gamma-band activity and human brain function. Neuroscientist 9, 475–84.&lt;br /&gt;
* Nunez, P. L., 1981. Electric Fields of the Brain. The Neurophysics of EEG. Oxford University Press, New York.&lt;br /&gt;
* Pfurtscheller, G., Aranibar, A., 1979. Evaluation of event-related desyn- chronization (ERD) preceding and following voluntary self-paced movement. Electroencephalography and Clinical Neurophysiology 46, 138–146.&lt;br /&gt;
* Pfurtscheller, G., Flotzinger, D., Neuper, C., 1994. Differentiation between finger, toe and tongue movement in man based on 40 Hz EEG. Electroencephalography and Clinical Neurophysiology 90, 456–60.&lt;br /&gt;
* Pfurtscheller, G., Lopes da Silva, F. H., 1999. Event-related EEG/MEG synchronization and desynchronization: basic principles. Clinical Neurophysiology 110, 1842–57.&lt;br /&gt;
* Pfurtscheller, G., 1999. Quantification of ERD and ERS in the time domain. In: W Pfurtscheller, G., Lopes da Silva, F. H. (Eds.), Event-related desynchroni- zation. Vol. 6. Elsevier, p. 89–105.&lt;br /&gt;
* Pfurtscheller, G., Neuper, C., 2006. Future prospects of ERD/ERS in the context of brain-computer interface (BCI) developments. Progress in Brain Research 159, 433–437.&lt;br /&gt;
* Pfurtscheller, G., Stancak Jr, A., C., N., 1996a. Post-movement beta synchronization. A correlate of an idling motor area? Electroencephalography and Clinical Neurophysiology 98, 281–93.&lt;br /&gt;
* Pfurtscheller, G., Stancak Jr, A., Neuper, C., 1996b. Event-related synchronization (ERS) in the alpha band—an electrophysiological correlate of cortical idling: a review. International Journal of Psychophysiology 24, 39–46.&lt;br /&gt;
*Tallon-Baudry, C., Bertrand, O., 1999. Oscillatory gamma activity in humans and its role in object representation. Trends Cogn. Sci. 3, 151–62.&lt;br /&gt;
* Tallon-Baudry, C., Bertrand, O., Delpuech, C., Pernier, J., 1996. Stimulus specificity of phase-locked and non-phase-locked 40 Hz visual responses in human. The Journal of Neuroscience 16, 4240–4249.&lt;/div&gt;</summary>
		<author><name>Aduszyk</name></author>
		
	</entry>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=Pracownia_EEG/ERDS&amp;diff=9046</id>
		<title>Pracownia EEG/ERDS</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=Pracownia_EEG/ERDS&amp;diff=9046"/>
		<updated>2023-01-10T11:52:15Z</updated>

		<summary type="html">&lt;p&gt;Aduszyk: /* Analiza */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Pracownia EEG|Pracownia EEG]] / ERD/S&lt;br /&gt;
&lt;br /&gt;
=Wstęp=&lt;br /&gt;
Wśród badań wykonywanych z wykorzystaniem rejestracji EEG czy MEG można wyróżnić badania spoczynkowe, gdzie rejestrowana jest spontaniczna aktywność mózgu oraz badania zmian aktywności pod wpływem różnych bodźców, przy czym bodźce te mogą być pochodzenia egzo- lub endogennego. Reakcja na bodziec może wykazywać stały związek fazowy z momentem wystąpienia bodźca &amp;amp;mdash; w takiej sytuacji mówimy o potencjałach lub polach wywołanych (ang. ''event related potential'', ''ERP'' i ''event related field'', ''ERF'') &amp;amp;mdash; lub też może nie być fazowo związana z bodźcem.&lt;br /&gt;
&lt;br /&gt;
Niniejsza część pracowni poświęcona jest metodologii badania reakcji mózgu na bodźce, które są czasowo ale niekoniecznie fazowo związane z bodźcem.&lt;br /&gt;
&lt;br /&gt;
=Zmiany pasmowej mocy sygnału EEG=&lt;br /&gt;
Pierwsze rezultaty opisujące zmiany w mocy pasmowej sygnału EEG (spadek mocy rytmu alfa) związane z reakcją na bodziec zostały opisane w pracy doktorskiej Adolf Becka zatytułowanej &amp;amp;bdquo;Oznaczenie lokalizacyi w mózgu i rdzeniu za pomocą zjawisk elektrycznych&amp;amp;rdquo; (Beck,  1891). &lt;br /&gt;
Ilościowe badania zjawisk modulacji mocy sygnału EEG w reakcji na bodźce rozpoczęto stosunkowo niedawno. Począwszy od pracy (Pfurtscheller, 1979) zjawiska te zaczęto nazywać ''Event Related Desynchronization'' (ERD) &amp;amp;mdash; czyli desynchronizacja związana z bodźcem. Termin ERD dotyczy spadku mocy. Przez analogię w późniejszych pracach terminem ''Event Related Synchronization'' (ERS) opisywane są efekty polegające na wzroście mocy. W większości paradygmatów eksperymentalnych zjawiska ERD i ERS są małe w porównaniu ze zmiennością mocy sygnału EEG związanej ze spontaniczną aktywnością mózgu. W celu ich ilościowego badania wymagane jest zarejestrowanie wielu realizacji reakcji na bodziec i poddanie ich analizie statystycznej. &lt;br /&gt;
&lt;br /&gt;
[[Plik:Paradygmat erds.gif|thumb|800px|center]]&lt;br /&gt;
==Interpretacja fizjologiczna==&lt;br /&gt;
[[Plik:EEG_synchronicznosc.png|600px|thumb|right|Synchronicznie pobudzana grupa neuronów piramidalnych kory tworzy warstwę dipolową.]]&lt;br /&gt;
[[Plik:Mapka_tf_erds.png|600px|thumb|right|Przykładowa mapa zjawiska synchronizacji i desynchronizacji sygnału EEG w przestrzeni czas-częstość dla sygnału zearejestrowanego przez elektrodę C3. Osoba badana wykonywała szybki ruch palcem w momencie oznaczonym 0. Kolory odpowiadają procentowej zmianie mocy względem poprzedzającego okresu 2s, zgodnie ze skalą barw umieszczoną po prawej stronie.  Na poziomej osi - czas w s, na pionowej częstość w Hz.]]&lt;br /&gt;
Terminy ERD i ERS mają swoje źródło w fizjologicznej interpretacji zmian mocy sygnału w określonych pasmach częstości.  Źródłem mierzalnego na powierzchni głowy sygnału elektrycznego lub magnetycznego jest synchroniczna aktywność wielu neuronów (głównie piramidalnych kory). Szacuje się, że wpływ na wielkość sygnału EEG lub MEG ma głównie stopień synchronizacji neuronów wytwarzających ten sygnał, a w drugiej kolejności ich ilość (Nunez, 1981). Tak więc wzrost mocy w pewnym paśmie (np. alfa ERS) interpretowany jest jako wzrost synchronizacji aktywności neuronów generujących aktywność EEG w tym paśmie, zaś spadek mocy (np. alfa ERD) interpretowany jest jako spadek synchronizacji neuronów generujących aktywność EEG w tym paśmie częstości. Przy takiej interpretacji należy pamiętać o skali w jakiej dokonywany jest pomiar. Zarówno elektrody EEG jak i cewki MEG mierzą sygnały średnie pochodzące od olbrzymich ilości neuronów. Zatem zmiana mocy w tym sygnale odpowiada desynchronizacji lub synchronizacji w skali makroskopowej (rzędu &amp;lt;math&amp;gt;10^6&amp;lt;/math&amp;gt;-&amp;lt;math&amp;gt;10^8&amp;lt;/math&amp;gt; neuronów). &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Zjawiska ERD i ERS badane były zarówno w eksperymentach motorycznych (Pfurtscheller, 1994, Pfurtscheller, 1996a, Pfurtscheller1, 996b , Pfurtscheller1999) jak i kognitywistycznych  (Tallon Baudry, 1996, Tallon, 1999, Kaiser2003).&lt;br /&gt;
Wnioski płynące z tych prac są takie, że znaczenie zjawisk ERD i ERS zależy od pasma częstości, w którym one występują. Aktywność w paśmie alfa wiązana jest ze stanem spoczynkowym, ERD w paśmie alfa i beta wiązane jest z pobudzeniem danego rejonu kory mózgowej, w którym zjawisko to zachodzi. ERS w paśmie alfa i beta następujący po ERD w tym samym paśmie częstości interpretowany jest najczęściej jako przejaw inhibicji lub kasowania poprzedniego stanu. Z kolei zwiększona aktywność w paśmie gamma jest interpretowana jako przejaw funkcjonalnej aktywacji danego fragmentu kory. Nowe wyniki pojawiają się na bieżąco i stawiane są nowe pytania co do możliwych interpretacji poszczególnych zjawisk  np. (Crone, 2010).&lt;br /&gt;
&lt;br /&gt;
Oprócz motywacji czysto poznawczych, badania zjawisk ERD i ERS stymulowane są przez praktyczne możliwości ich wykorzystania w diagnostyce epilepsji, gdzie są nadzieje na zastosowanie tej techniki w miejsce bardziej inwazyjnej metody mapowania mózgu przez elektrostymulację (Crone 1998a, Crone, 1998b, Crone, 2006) oraz w konstrukcji interfejsów mózg-komputer (Pfurtscheller, 2006).&lt;br /&gt;
[[Plik:Mapowanie.png|thumb|600px|center|Mapowanie kory czuciowo-ruchowej za pomocą stymulacji: dwie falki – bezwolne reakcje ruchowe, trzy falki – kloniczny skurcz mięśni, za Crone, 1998]]&lt;br /&gt;
[[Plik:Mapki_ECoG.jpg|thumb|600px|center|Mapowanie kory czuciowo-ruchowej za pomocą ERD/ERS.Pacjent z przyczyn medycznych miał umieszczoną na korze motorycznej siatkę elektrod (6x8, odstęp 1cm). Pacjent miał zaciskać pięść w odpowiedzi na bodziec wzrokowy przez cały czas trwania bodźca (3s)&lt;br /&gt;
Prezentowane mapy istotnych statystycznie zmian uzyskano na podstawie 49 wolnych od artefaktów realizacji.]]&lt;br /&gt;
&lt;br /&gt;
==Estymacja zmian mocy sygnału EEG w dziedzinie czasu==&lt;br /&gt;
Przebieg czasowy zjawiska ERD i ERS jest specyficzny dla pasm częstości.&lt;br /&gt;
[[Grafika:ERDS klasycznie_1.png|right|thumb|768px|&amp;lt;figure id=&amp;quot;fig:erds_klasycznie&amp;quot;&amp;gt;&amp;lt;/figure&amp;gt; Klasyczne obliczanie ERD/ERS. &amp;lt;br&amp;gt; a) Przykładowy zapis EEG jednej z &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; realizacji  &amp;lt;br&amp;gt; b) przefiltrowany sygnał EEG w wybranym paśmie (tutaj: [15 25] Hz)&amp;lt;br&amp;gt;  c) przefiltrowany sygnał podniesiony do kwadratu &amp;amp;mdash; w ten sposób uzyskujemy przebieg mocy pasmowej w czasie &amp;lt;br&amp;gt; d) uśredniony po realizacjach przebieg mocy pasmowej w czasie &amp;lt;br&amp;gt; e) wygładzony przebieg z d) za pomocą średniej biegnącej (tutaj okienko 0.25 s) czerwone pionowe linie wyznaczają okres referencyjny &amp;lt;br&amp;gt; f) ERD/ERS - względna zmiana sygnału e) w odniesieniu do okresu referencyjnego.]]&lt;br /&gt;
Klasyczny sposób estymowania  ERD i ERS (Pfurtscheller, 1979) polega na (patrz ilustracja): &lt;br /&gt;
*filtrowaniu pasmowym,&lt;br /&gt;
*wyrównaniu realizacji względem momentu wystąpienia bodźca, &lt;br /&gt;
*obliczaniu mocy chwilowej (podniesienie do kwadratu wartości każdej próbki sygnału), &lt;br /&gt;
*uśrednieniu mocy chwilowej po realizacjach, wygładzeniu przebiegu czasowego uśrednionej mocy chwilowej filtrem dolnoprzepustowym.&lt;br /&gt;
*Następnie względna zmiana mocy obliczana jest jako:&lt;br /&gt;
: &amp;lt;math&amp;gt;\mathrm{ERD/ERS}_f(t) = \frac{P_f(t) - R_f}{R_f}  &amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie:&lt;br /&gt;
&amp;lt;math&amp;gt;P_f(t)&amp;lt;/math&amp;gt; &amp;amp;mdash; średnia moc chwilowa w paśmie częstości ''f''; uśrednianie przebiega po realizacjach.&lt;br /&gt;
&amp;lt;math&amp;gt;R_f&amp;lt;/math&amp;gt; &amp;amp;mdash; średnia moc w paśmie ''f'' w okresie referencyjnym; uśrednianie przebiega po realizacjach i po czasie trwania okresu referencyjnego.&lt;br /&gt;
Klasycznym metodom obliczania ERD/ERS poświęcona jest praca (Pfurtscheller, 1999).&lt;br /&gt;
Całościowy obraz zmian mocy sygnału EEG związanych z bodźcem można dogodnie analizować w dziedzinie czas-częstość.&lt;br /&gt;
&lt;br /&gt;
=Cwiczenia=&lt;br /&gt;
&lt;br /&gt;
==Paradygmat ==&lt;br /&gt;
&lt;br /&gt;
===wersja 1===&lt;br /&gt;
Osoba badana siedzi wygodnie i trzyma przycisk podłączony do triggera.&lt;br /&gt;
Na ekranie w odstępach 13&amp;lt;math&amp;gt;\pm&amp;lt;/math&amp;gt;1 sekund wyświetlany jest krzyżyk. Krzyżyk wyświetlany jest przez 2 sekundy. W przeciągu 2 sekund po zniknięciu krzyżyka osoba badana w wybranym przez siebie momencie wciska przycisk. Proszę zarejestrować 60 realizacji.&lt;br /&gt;
&lt;br /&gt;
Przygotuj program implementujący powyższy paradygmat.&lt;br /&gt;
&lt;br /&gt;
===wersja 2===&lt;br /&gt;
Próba rozróżnienia ruchów lewą i prawą ręką &amp;amp;mdash; jak w BCI; na podstawie artykułu [[file:ERDS.BCI.TNSRE2012.pdf]], oczywiście w uproszczonej wersji :-)&lt;br /&gt;
&lt;br /&gt;
Procedura:&lt;br /&gt;
&lt;br /&gt;
Osoba badana ma za zadanie poruszać palcami (wskazującym oraz środkowym) prawej lub lewej ręki. Na ekranie monitora pojawia się strzałka, która widoczna jest przez okres 3 sek. i wskazuje rękę, którą będzie wykonywany ruch. Osoba badana ma ruszyć wskazaną ręką w wybranym przez siebie momencie PO zniknięciu strzałki. &lt;br /&gt;
Dla każdej ręki przewidziane jest 100 powtórzeń. W celu synchronizacji sygnału EEG ze wskazówkami pojawiającymi się na ekranie monitora, w lewym dolnym rogu (gdzie pojawia się biały kwadrat) powinna zostać umieszczona fotodioda. &lt;br /&gt;
&lt;br /&gt;
Rejestracja sygnału:&lt;br /&gt;
&lt;br /&gt;
Wykorzystujemy następujące elektrody umieszczone zgodnie z systemem 10--10: FC3, FC1, FCz, FC2, FC4, C5, C3, C1, Cz, C2, C4, C6, CP5, CP3, CP1, CPz, CP2, CP4, CP6, P1, P2, A1, A1. Dodatkowo wykonujemy pomiar z mięśnia extensor digitorum. W tym celu na obu rękach umieszczamy elektrody bipolarne do EMG (patrz Fig. 1 (elektroda ED3): http://jn.physiology.org/content/100/6/3225.long). Sygnał rejestrujemy z częstością 512 Hz.&lt;br /&gt;
&lt;br /&gt;
Procedura może zostać pobrana ze stony: https://github.com/mroja/signal_utils/tree/master/erds/arrows.&lt;br /&gt;
&lt;br /&gt;
===wersja 3=== &lt;br /&gt;
Osoba ma za zadanie ruszać palcem lub wyobrażać sobie ruch palcem. Polecenia te podawane są losowo (nie więcej niż 3 te same próby powinny być pod rząd). Na ekranie powinna zostać wyświetlona instrukcja, w której opisany jest cel badania. Następnie rozpoczyna się blok prób, w trakcie poszczególnej próby wyświetlane jest polecenie: &amp;quot;Rusz palcem&amp;quot;/ &amp;quot;Wyobraź sobie ruch palcem&amp;quot; na 4s, następnie 3 s przerwy (pusty ekran). Każde polecenie powinno być powtórzone 100 razy. &lt;br /&gt;
&lt;br /&gt;
W trakcie procedury powinien być zbierany sygnał EEG oraz EMG palca. Wykorzystujemy następujące elektrody EEG umieszczone zgodnie z systemem 10--10: FC3, FC1, FCz, FC2, FC4, C5, C3, C1, Cz, C2, C4, C6, CP5, CP3, CP1, CPz, CP2, CP4, CP6, P1, P2, A1, A1. częstość próbkowania: min. 1024 Hz. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--Analiza:&lt;br /&gt;
# ERD/S w pasmach&lt;br /&gt;
# uśrednione mapy czas-częstość osobno dla ruchu lewą i prawą ręką&lt;br /&gt;
# analiza możliwości rozróżnienia ruchu na podstawie EEG&lt;br /&gt;
&lt;br /&gt;
Uśrednianie spektrogramów wykonujemy samodzielnie w Pythonie, a na deser liczymy estymatę średnich rozkładów czas-częstość z MP:&lt;br /&gt;
&lt;br /&gt;
# eksportujemy tagi znalezione na podstawie EMG https://brain.fuw.edu.pl/edu/EEG:Pracownia_EEG/SSVEP_1#.C4.86wiczenie_dla_ch.C4.99tnych i oglądamy w Svarogu wyniki na tle sygnału&lt;br /&gt;
# ściągamy najnowszą wersję Svaroga z http://braintech.pl/svarog, umożliwiającą uśrednianie map&lt;br /&gt;
# Otwieramy w Svarogu plik sygnału wraz z tagami.&lt;br /&gt;
# Ustalamy odpowiedni montaż i filtrowanie sygnału.&lt;br /&gt;
# Uruchamiamy dekompozycję MP (Tools → MP decomposition) wybierając w ustawieniach (zakładka „Signal selection” → zakładka „Marked”)&lt;br /&gt;
## rodzaj taga oznaczającego kolejne powtórzenia&lt;br /&gt;
## początek i długość trwania analizowanego interwału czasu (w sekundach, względem wystąpienia taga)&lt;br /&gt;
&lt;br /&gt;
Po zakończeniu obliczeń otwieramy rezultat w nowym oknie („Get result”). Obliczona w ten sposób „książka” składa się z dekompozycji MP kolejnych powtórzeń eksperymentu, przedstawionych w postaci map czas-częstość. Otrzymane mapy możemy następnie uśrednić (Tools → Average books) i zapisać do pliku graficznego o ustalonej rozdzielczości.--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--==Rejestracja sygnału==&lt;br /&gt;
[[Plik:10_20zAFz.png|thumb| 600px|right]]&lt;br /&gt;
# Zakładamy czepek i elektrody w systemie 10-20, dbamy o to by opory pomiędzy elektrodami były poniżej 5 k&amp;lt;math&amp;gt;\Omega&amp;lt;/math&amp;gt; i różnice pomiędzy oporami różnych elektrod nie przekraczały 20%.&lt;br /&gt;
# Elektrody referencyjne A1 i A2.&lt;br /&gt;
# Elektrodę GND mocujemy w otworze czepka odpowiadającym pozycji AFz (na linii centralnej 10% w stronę nosa od elektrody Fz).&lt;br /&gt;
# Sygnał rejestrujemy z częstością 256 Hz.--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Analiza==&lt;br /&gt;
Czas wciśnięcia przycisku (wersja 1 i 2)/ wzorst EMG (wersja 3) oznaczymy jako 0.&lt;br /&gt;
Poniższą analizę zastosuj dla sygnałów w referencji do uśrednionych odprowadzeń usznych A1 i A2.&lt;br /&gt;
&lt;br /&gt;
===Wyznaczenie pasma &amp;amp;mu; i &amp;amp;beta;===&lt;br /&gt;
# Z sygnału wycinamy fragmenty od &amp;amp;minus;3 do &amp;amp;minus;1 sek. dla elektrod C3 i C4 (elektrody położone nad korą ruchową dłoni). &lt;br /&gt;
# Dla każdej realizacji obliczamy widma metodą Welcha.&lt;br /&gt;
# Otrzymane widma uśredniamy po realizacjach.&lt;br /&gt;
# Z sygnału wycinamy fragmenty od +0.5 do +2.5 sek. dla elektrod C3 i C4 (elektrody położone nad korą ruchową dłoni). &lt;br /&gt;
# Dla każdej realizacji obliczamy widma metodą Welcha.&lt;br /&gt;
# Otrzymane widma uśredniamy po realizacjach.&lt;br /&gt;
# Wykreśl widma z okresu poprzedzającego ruch i z okresu po ruchu nałożone na siebie, a także względną zmianę widma. Zaobserwuj w jakich zakresach częstości &amp;amp;mu; (pasmo około 10 Hz) i &amp;amp;beta; (około 23 Hz) występują największe zmiany.&lt;br /&gt;
&lt;br /&gt;
===Wyznaczenie przebiegu czasowego ERD i ERS ===&lt;br /&gt;
# Zaprojektuj filtry pasmowo przepustowe (Chebyszewa 2 rodzaju) zgodne z wyznaczonymi pasmami. Zbadaj funkcje przenoszenia i odpowiedzi impulsowej.&lt;br /&gt;
# Powycinaj sygnały od &amp;amp;minus;3 do +3 sekund (wszystkie kanały). Przefiltruj każdą realizację. &lt;br /&gt;
# Oblicz moc chwilową za pomocą transformaty Hilberta (kwadrat amplitudy chwilowej).&lt;br /&gt;
# Uśrednij moc chwilową po realizacjach.&lt;br /&gt;
# Oblicz względną zmianę mocy chwilowej względem czasu &amp;amp;minus;3 do &amp;amp;minus;1. W ten sposób otrzymasz przebieg ERD i ERS w czasie.&lt;br /&gt;
# Wykreśl ERD i ERS w układzie topograficznym. (Rozmieść subploty tak, aby z w przybliżeniu odpowiadały pozycjom elektrod).&lt;br /&gt;
&lt;br /&gt;
===Transformacja Hjortha===&lt;br /&gt;
Transformacja Hjortha jest przybliżeniem numerycznym transformacji Laplace'a, czyli drugiej pochodnej przestrzennej.&lt;br /&gt;
Obliczamy ją jako różnicę potencjału pomiędzy daną elektrodą i średnią z czterech sąsiednich elektrod.&lt;br /&gt;
&lt;br /&gt;
Proszę przeliczyć potencjały C3, Cz i C4 na montaż Hjortha oraz powtórzyć analizę ERD/ERS opisaną powyżej.&lt;br /&gt;
Przykładowo dla elektrody C3 montaż Hjortha &amp;lt;math&amp;gt;\mathrm{C3_H}&amp;lt;/math&amp;gt; otrzymuje się w następujący sposób:&lt;br /&gt;
&amp;lt;math&amp;gt;\mathrm{C3_H = C3 - \frac{1}{4}(T3+F3+Cz+P3)}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Literatura=&lt;br /&gt;
* Beck, A., 1891. Oznaczenie lokalizacyi w mózgu i rdzeniu za pomoca zjawisk elektrycznych. Ph.D. thesis, Polska Akademia Umiejętności, Kraków, seria II.&lt;br /&gt;
* Crone, N. E., Miglioretti, D. L., Gordon, B., Lesser, R. P., 1998a. Functional mapping of human sensorimotor cortex with electrocorticigraphic spectral analysis II. Event-related synchronization in the gamma band. Brain 121, 2301–15.&lt;br /&gt;
* Crone, N. E., Miglioretti, D. L., Gordon, B., Sieracki, J. M., Wilson, M. T., Uematsu, S., 1998b. Functional mapping of human sensorimotor cortex with electrocorticographic spectral analysis I. Alpha and beta event-related desynchronization. Brain 121, 2271–99.&lt;br /&gt;
* Crone, N. E., Korzeniewska, A., Franaszczuk, P. J., 2010. Cortical gamma responses: Searching high and low. International Journal of Psychophysiology.&lt;br /&gt;
*Crone, N. E., Sinai, A., Korzeniewska, A., 2006. High-frequency gamma oscilla- tions and human brain mapping with electrocorticography. Progress in Brain Research 159, 275–295.&lt;br /&gt;
* Kaiser, J., Lutzenberger, W., 2003. Induced gamma-band activity and human brain function. Neuroscientist 9, 475–84.&lt;br /&gt;
* Nunez, P. L., 1981. Electric Fields of the Brain. The Neurophysics of EEG. Oxford University Press, New York.&lt;br /&gt;
* Pfurtscheller, G., Aranibar, A., 1979. Evaluation of event-related desyn- chronization (ERD) preceding and following voluntary self-paced movement. Electroencephalography and Clinical Neurophysiology 46, 138–146.&lt;br /&gt;
* Pfurtscheller, G., Flotzinger, D., Neuper, C., 1994. Differentiation between finger, toe and tongue movement in man based on 40 Hz EEG. Electroencephalography and Clinical Neurophysiology 90, 456–60.&lt;br /&gt;
* Pfurtscheller, G., Lopes da Silva, F. H., 1999. Event-related EEG/MEG synchronization and desynchronization: basic principles. Clinical Neurophysiology 110, 1842–57.&lt;br /&gt;
* Pfurtscheller, G., 1999. Quantification of ERD and ERS in the time domain. In: W Pfurtscheller, G., Lopes da Silva, F. H. (Eds.), Event-related desynchroni- zation. Vol. 6. Elsevier, p. 89–105.&lt;br /&gt;
* Pfurtscheller, G., Neuper, C., 2006. Future prospects of ERD/ERS in the context of brain-computer interface (BCI) developments. Progress in Brain Research 159, 433–437.&lt;br /&gt;
* Pfurtscheller, G., Stancak Jr, A., C., N., 1996a. Post-movement beta synchronization. A correlate of an idling motor area? Electroencephalography and Clinical Neurophysiology 98, 281–93.&lt;br /&gt;
* Pfurtscheller, G., Stancak Jr, A., Neuper, C., 1996b. Event-related synchronization (ERS) in the alpha band—an electrophysiological correlate of cortical idling: a review. International Journal of Psychophysiology 24, 39–46.&lt;br /&gt;
*Tallon-Baudry, C., Bertrand, O., 1999. Oscillatory gamma activity in humans and its role in object representation. Trends Cogn. Sci. 3, 151–62.&lt;br /&gt;
* Tallon-Baudry, C., Bertrand, O., Delpuech, C., Pernier, J., 1996. Stimulus specificity of phase-locked and non-phase-locked 40 Hz visual responses in human. The Journal of Neuroscience 16, 4240–4249.&lt;/div&gt;</summary>
		<author><name>Aduszyk</name></author>
		
	</entry>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=Pracownia_EEG/ERDS&amp;diff=9045</id>
		<title>Pracownia EEG/ERDS</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=Pracownia_EEG/ERDS&amp;diff=9045"/>
		<updated>2023-01-10T11:49:56Z</updated>

		<summary type="html">&lt;p&gt;Aduszyk: /* Rejestracja sygnału */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Pracownia EEG|Pracownia EEG]] / ERD/S&lt;br /&gt;
&lt;br /&gt;
=Wstęp=&lt;br /&gt;
Wśród badań wykonywanych z wykorzystaniem rejestracji EEG czy MEG można wyróżnić badania spoczynkowe, gdzie rejestrowana jest spontaniczna aktywność mózgu oraz badania zmian aktywności pod wpływem różnych bodźców, przy czym bodźce te mogą być pochodzenia egzo- lub endogennego. Reakcja na bodziec może wykazywać stały związek fazowy z momentem wystąpienia bodźca &amp;amp;mdash; w takiej sytuacji mówimy o potencjałach lub polach wywołanych (ang. ''event related potential'', ''ERP'' i ''event related field'', ''ERF'') &amp;amp;mdash; lub też może nie być fazowo związana z bodźcem.&lt;br /&gt;
&lt;br /&gt;
Niniejsza część pracowni poświęcona jest metodologii badania reakcji mózgu na bodźce, które są czasowo ale niekoniecznie fazowo związane z bodźcem.&lt;br /&gt;
&lt;br /&gt;
=Zmiany pasmowej mocy sygnału EEG=&lt;br /&gt;
Pierwsze rezultaty opisujące zmiany w mocy pasmowej sygnału EEG (spadek mocy rytmu alfa) związane z reakcją na bodziec zostały opisane w pracy doktorskiej Adolf Becka zatytułowanej &amp;amp;bdquo;Oznaczenie lokalizacyi w mózgu i rdzeniu za pomocą zjawisk elektrycznych&amp;amp;rdquo; (Beck,  1891). &lt;br /&gt;
Ilościowe badania zjawisk modulacji mocy sygnału EEG w reakcji na bodźce rozpoczęto stosunkowo niedawno. Począwszy od pracy (Pfurtscheller, 1979) zjawiska te zaczęto nazywać ''Event Related Desynchronization'' (ERD) &amp;amp;mdash; czyli desynchronizacja związana z bodźcem. Termin ERD dotyczy spadku mocy. Przez analogię w późniejszych pracach terminem ''Event Related Synchronization'' (ERS) opisywane są efekty polegające na wzroście mocy. W większości paradygmatów eksperymentalnych zjawiska ERD i ERS są małe w porównaniu ze zmiennością mocy sygnału EEG związanej ze spontaniczną aktywnością mózgu. W celu ich ilościowego badania wymagane jest zarejestrowanie wielu realizacji reakcji na bodziec i poddanie ich analizie statystycznej. &lt;br /&gt;
&lt;br /&gt;
[[Plik:Paradygmat erds.gif|thumb|800px|center]]&lt;br /&gt;
==Interpretacja fizjologiczna==&lt;br /&gt;
[[Plik:EEG_synchronicznosc.png|600px|thumb|right|Synchronicznie pobudzana grupa neuronów piramidalnych kory tworzy warstwę dipolową.]]&lt;br /&gt;
[[Plik:Mapka_tf_erds.png|600px|thumb|right|Przykładowa mapa zjawiska synchronizacji i desynchronizacji sygnału EEG w przestrzeni czas-częstość dla sygnału zearejestrowanego przez elektrodę C3. Osoba badana wykonywała szybki ruch palcem w momencie oznaczonym 0. Kolory odpowiadają procentowej zmianie mocy względem poprzedzającego okresu 2s, zgodnie ze skalą barw umieszczoną po prawej stronie.  Na poziomej osi - czas w s, na pionowej częstość w Hz.]]&lt;br /&gt;
Terminy ERD i ERS mają swoje źródło w fizjologicznej interpretacji zmian mocy sygnału w określonych pasmach częstości.  Źródłem mierzalnego na powierzchni głowy sygnału elektrycznego lub magnetycznego jest synchroniczna aktywność wielu neuronów (głównie piramidalnych kory). Szacuje się, że wpływ na wielkość sygnału EEG lub MEG ma głównie stopień synchronizacji neuronów wytwarzających ten sygnał, a w drugiej kolejności ich ilość (Nunez, 1981). Tak więc wzrost mocy w pewnym paśmie (np. alfa ERS) interpretowany jest jako wzrost synchronizacji aktywności neuronów generujących aktywność EEG w tym paśmie, zaś spadek mocy (np. alfa ERD) interpretowany jest jako spadek synchronizacji neuronów generujących aktywność EEG w tym paśmie częstości. Przy takiej interpretacji należy pamiętać o skali w jakiej dokonywany jest pomiar. Zarówno elektrody EEG jak i cewki MEG mierzą sygnały średnie pochodzące od olbrzymich ilości neuronów. Zatem zmiana mocy w tym sygnale odpowiada desynchronizacji lub synchronizacji w skali makroskopowej (rzędu &amp;lt;math&amp;gt;10^6&amp;lt;/math&amp;gt;-&amp;lt;math&amp;gt;10^8&amp;lt;/math&amp;gt; neuronów). &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Zjawiska ERD i ERS badane były zarówno w eksperymentach motorycznych (Pfurtscheller, 1994, Pfurtscheller, 1996a, Pfurtscheller1, 996b , Pfurtscheller1999) jak i kognitywistycznych  (Tallon Baudry, 1996, Tallon, 1999, Kaiser2003).&lt;br /&gt;
Wnioski płynące z tych prac są takie, że znaczenie zjawisk ERD i ERS zależy od pasma częstości, w którym one występują. Aktywność w paśmie alfa wiązana jest ze stanem spoczynkowym, ERD w paśmie alfa i beta wiązane jest z pobudzeniem danego rejonu kory mózgowej, w którym zjawisko to zachodzi. ERS w paśmie alfa i beta następujący po ERD w tym samym paśmie częstości interpretowany jest najczęściej jako przejaw inhibicji lub kasowania poprzedniego stanu. Z kolei zwiększona aktywność w paśmie gamma jest interpretowana jako przejaw funkcjonalnej aktywacji danego fragmentu kory. Nowe wyniki pojawiają się na bieżąco i stawiane są nowe pytania co do możliwych interpretacji poszczególnych zjawisk  np. (Crone, 2010).&lt;br /&gt;
&lt;br /&gt;
Oprócz motywacji czysto poznawczych, badania zjawisk ERD i ERS stymulowane są przez praktyczne możliwości ich wykorzystania w diagnostyce epilepsji, gdzie są nadzieje na zastosowanie tej techniki w miejsce bardziej inwazyjnej metody mapowania mózgu przez elektrostymulację (Crone 1998a, Crone, 1998b, Crone, 2006) oraz w konstrukcji interfejsów mózg-komputer (Pfurtscheller, 2006).&lt;br /&gt;
[[Plik:Mapowanie.png|thumb|600px|center|Mapowanie kory czuciowo-ruchowej za pomocą stymulacji: dwie falki – bezwolne reakcje ruchowe, trzy falki – kloniczny skurcz mięśni, za Crone, 1998]]&lt;br /&gt;
[[Plik:Mapki_ECoG.jpg|thumb|600px|center|Mapowanie kory czuciowo-ruchowej za pomocą ERD/ERS.Pacjent z przyczyn medycznych miał umieszczoną na korze motorycznej siatkę elektrod (6x8, odstęp 1cm). Pacjent miał zaciskać pięść w odpowiedzi na bodziec wzrokowy przez cały czas trwania bodźca (3s)&lt;br /&gt;
Prezentowane mapy istotnych statystycznie zmian uzyskano na podstawie 49 wolnych od artefaktów realizacji.]]&lt;br /&gt;
&lt;br /&gt;
==Estymacja zmian mocy sygnału EEG w dziedzinie czasu==&lt;br /&gt;
Przebieg czasowy zjawiska ERD i ERS jest specyficzny dla pasm częstości.&lt;br /&gt;
[[Grafika:ERDS klasycznie_1.png|right|thumb|768px|&amp;lt;figure id=&amp;quot;fig:erds_klasycznie&amp;quot;&amp;gt;&amp;lt;/figure&amp;gt; Klasyczne obliczanie ERD/ERS. &amp;lt;br&amp;gt; a) Przykładowy zapis EEG jednej z &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; realizacji  &amp;lt;br&amp;gt; b) przefiltrowany sygnał EEG w wybranym paśmie (tutaj: [15 25] Hz)&amp;lt;br&amp;gt;  c) przefiltrowany sygnał podniesiony do kwadratu &amp;amp;mdash; w ten sposób uzyskujemy przebieg mocy pasmowej w czasie &amp;lt;br&amp;gt; d) uśredniony po realizacjach przebieg mocy pasmowej w czasie &amp;lt;br&amp;gt; e) wygładzony przebieg z d) za pomocą średniej biegnącej (tutaj okienko 0.25 s) czerwone pionowe linie wyznaczają okres referencyjny &amp;lt;br&amp;gt; f) ERD/ERS - względna zmiana sygnału e) w odniesieniu do okresu referencyjnego.]]&lt;br /&gt;
Klasyczny sposób estymowania  ERD i ERS (Pfurtscheller, 1979) polega na (patrz ilustracja): &lt;br /&gt;
*filtrowaniu pasmowym,&lt;br /&gt;
*wyrównaniu realizacji względem momentu wystąpienia bodźca, &lt;br /&gt;
*obliczaniu mocy chwilowej (podniesienie do kwadratu wartości każdej próbki sygnału), &lt;br /&gt;
*uśrednieniu mocy chwilowej po realizacjach, wygładzeniu przebiegu czasowego uśrednionej mocy chwilowej filtrem dolnoprzepustowym.&lt;br /&gt;
*Następnie względna zmiana mocy obliczana jest jako:&lt;br /&gt;
: &amp;lt;math&amp;gt;\mathrm{ERD/ERS}_f(t) = \frac{P_f(t) - R_f}{R_f}  &amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie:&lt;br /&gt;
&amp;lt;math&amp;gt;P_f(t)&amp;lt;/math&amp;gt; &amp;amp;mdash; średnia moc chwilowa w paśmie częstości ''f''; uśrednianie przebiega po realizacjach.&lt;br /&gt;
&amp;lt;math&amp;gt;R_f&amp;lt;/math&amp;gt; &amp;amp;mdash; średnia moc w paśmie ''f'' w okresie referencyjnym; uśrednianie przebiega po realizacjach i po czasie trwania okresu referencyjnego.&lt;br /&gt;
Klasycznym metodom obliczania ERD/ERS poświęcona jest praca (Pfurtscheller, 1999).&lt;br /&gt;
Całościowy obraz zmian mocy sygnału EEG związanych z bodźcem można dogodnie analizować w dziedzinie czas-częstość.&lt;br /&gt;
&lt;br /&gt;
=Cwiczenia=&lt;br /&gt;
&lt;br /&gt;
==Paradygmat ==&lt;br /&gt;
&lt;br /&gt;
===wersja 1===&lt;br /&gt;
Osoba badana siedzi wygodnie i trzyma przycisk podłączony do triggera.&lt;br /&gt;
Na ekranie w odstępach 13&amp;lt;math&amp;gt;\pm&amp;lt;/math&amp;gt;1 sekund wyświetlany jest krzyżyk. Krzyżyk wyświetlany jest przez 2 sekundy. W przeciągu 2 sekund po zniknięciu krzyżyka osoba badana w wybranym przez siebie momencie wciska przycisk. Proszę zarejestrować 60 realizacji.&lt;br /&gt;
&lt;br /&gt;
Przygotuj program implementujący powyższy paradygmat.&lt;br /&gt;
&lt;br /&gt;
===wersja 2===&lt;br /&gt;
Próba rozróżnienia ruchów lewą i prawą ręką &amp;amp;mdash; jak w BCI; na podstawie artykułu [[file:ERDS.BCI.TNSRE2012.pdf]], oczywiście w uproszczonej wersji :-)&lt;br /&gt;
&lt;br /&gt;
Procedura:&lt;br /&gt;
&lt;br /&gt;
Osoba badana ma za zadanie poruszać palcami (wskazującym oraz środkowym) prawej lub lewej ręki. Na ekranie monitora pojawia się strzałka, która widoczna jest przez okres 3 sek. i wskazuje rękę, którą będzie wykonywany ruch. Osoba badana ma ruszyć wskazaną ręką w wybranym przez siebie momencie PO zniknięciu strzałki. &lt;br /&gt;
Dla każdej ręki przewidziane jest 100 powtórzeń. W celu synchronizacji sygnału EEG ze wskazówkami pojawiającymi się na ekranie monitora, w lewym dolnym rogu (gdzie pojawia się biały kwadrat) powinna zostać umieszczona fotodioda. &lt;br /&gt;
&lt;br /&gt;
Rejestracja sygnału:&lt;br /&gt;
&lt;br /&gt;
Wykorzystujemy następujące elektrody umieszczone zgodnie z systemem 10--10: FC3, FC1, FCz, FC2, FC4, C5, C3, C1, Cz, C2, C4, C6, CP5, CP3, CP1, CPz, CP2, CP4, CP6, P1, P2, A1, A1. Dodatkowo wykonujemy pomiar z mięśnia extensor digitorum. W tym celu na obu rękach umieszczamy elektrody bipolarne do EMG (patrz Fig. 1 (elektroda ED3): http://jn.physiology.org/content/100/6/3225.long). Sygnał rejestrujemy z częstością 512 Hz.&lt;br /&gt;
&lt;br /&gt;
Procedura może zostać pobrana ze stony: https://github.com/mroja/signal_utils/tree/master/erds/arrows.&lt;br /&gt;
&lt;br /&gt;
===wersja 3=== &lt;br /&gt;
Osoba ma za zadanie ruszać palcem lub wyobrażać sobie ruch palcem. Polecenia te podawane są losowo (nie więcej niż 3 te same próby powinny być pod rząd). Na ekranie powinna zostać wyświetlona instrukcja, w której opisany jest cel badania. Następnie rozpoczyna się blok prób, w trakcie poszczególnej próby wyświetlane jest polecenie: &amp;quot;Rusz palcem&amp;quot;/ &amp;quot;Wyobraź sobie ruch palcem&amp;quot; na 4s, następnie 3 s przerwy (pusty ekran). Każde polecenie powinno być powtórzone 100 razy. &lt;br /&gt;
&lt;br /&gt;
W trakcie procedury powinien być zbierany sygnał EEG oraz EMG palca. Wykorzystujemy następujące elektrody EEG umieszczone zgodnie z systemem 10--10: FC3, FC1, FCz, FC2, FC4, C5, C3, C1, Cz, C2, C4, C6, CP5, CP3, CP1, CPz, CP2, CP4, CP6, P1, P2, A1, A1. częstość próbkowania: min. 1024 Hz. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--Analiza:&lt;br /&gt;
# ERD/S w pasmach&lt;br /&gt;
# uśrednione mapy czas-częstość osobno dla ruchu lewą i prawą ręką&lt;br /&gt;
# analiza możliwości rozróżnienia ruchu na podstawie EEG&lt;br /&gt;
&lt;br /&gt;
Uśrednianie spektrogramów wykonujemy samodzielnie w Pythonie, a na deser liczymy estymatę średnich rozkładów czas-częstość z MP:&lt;br /&gt;
&lt;br /&gt;
# eksportujemy tagi znalezione na podstawie EMG https://brain.fuw.edu.pl/edu/EEG:Pracownia_EEG/SSVEP_1#.C4.86wiczenie_dla_ch.C4.99tnych i oglądamy w Svarogu wyniki na tle sygnału&lt;br /&gt;
# ściągamy najnowszą wersję Svaroga z http://braintech.pl/svarog, umożliwiającą uśrednianie map&lt;br /&gt;
# Otwieramy w Svarogu plik sygnału wraz z tagami.&lt;br /&gt;
# Ustalamy odpowiedni montaż i filtrowanie sygnału.&lt;br /&gt;
# Uruchamiamy dekompozycję MP (Tools → MP decomposition) wybierając w ustawieniach (zakładka „Signal selection” → zakładka „Marked”)&lt;br /&gt;
## rodzaj taga oznaczającego kolejne powtórzenia&lt;br /&gt;
## początek i długość trwania analizowanego interwału czasu (w sekundach, względem wystąpienia taga)&lt;br /&gt;
&lt;br /&gt;
Po zakończeniu obliczeń otwieramy rezultat w nowym oknie („Get result”). Obliczona w ten sposób „książka” składa się z dekompozycji MP kolejnych powtórzeń eksperymentu, przedstawionych w postaci map czas-częstość. Otrzymane mapy możemy następnie uśrednić (Tools → Average books) i zapisać do pliku graficznego o ustalonej rozdzielczości.--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--==Rejestracja sygnału==&lt;br /&gt;
[[Plik:10_20zAFz.png|thumb| 600px|right]]&lt;br /&gt;
# Zakładamy czepek i elektrody w systemie 10-20, dbamy o to by opory pomiędzy elektrodami były poniżej 5 k&amp;lt;math&amp;gt;\Omega&amp;lt;/math&amp;gt; i różnice pomiędzy oporami różnych elektrod nie przekraczały 20%.&lt;br /&gt;
# Elektrody referencyjne A1 i A2.&lt;br /&gt;
# Elektrodę GND mocujemy w otworze czepka odpowiadającym pozycji AFz (na linii centralnej 10% w stronę nosa od elektrody Fz).&lt;br /&gt;
# Sygnał rejestrujemy z częstością 256 Hz.--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Analiza==&lt;br /&gt;
Czas wciśnięcia przycisku oznaczymy jako 0.&lt;br /&gt;
Poniższą analizę zastosuj dla sygnałów w referencji do uśrednionych odprowadzeń usznych A1 i A2.&lt;br /&gt;
&lt;br /&gt;
===Wyznaczenie pasma &amp;amp;mu; i &amp;amp;beta;===&lt;br /&gt;
# Z sygnału wycinamy fragmenty od &amp;amp;minus;4 do &amp;amp;minus;2 sek. dla elektrod C3 i C4 (elektrody położone nad korą ruchową dłoni). &lt;br /&gt;
# Dla każdej realizacji obliczamy widma metodą Welcha.&lt;br /&gt;
# Otrzymane widma uśredniamy po realizacjach.&lt;br /&gt;
# Z sygnału wycinamy fragmenty od +0.5 do +2.5 sek. dla elektrod C3 i C4 (elektrody położone nad korą ruchową dłoni). &lt;br /&gt;
# Dla każdej realizacji obliczamy widma metodą Welcha.&lt;br /&gt;
# Otrzymane widma uśredniamy po realizacjach.&lt;br /&gt;
# Wykreśl widma z okresu poprzedzającego ruch i z okresu po ruchu nałożone na siebie, a także względną zmianę widma. Zaobserwuj w jakich zakresach częstości &amp;amp;mu; (pasmo około 10 Hz) i &amp;amp;beta; (około 23 Hz) występują największe zmiany.&lt;br /&gt;
&lt;br /&gt;
===Wyznaczenie przebiegu czasowego ERD i ERS ===&lt;br /&gt;
# Zaprojektuj filtry pasmowo przepustowe (Chebyszewa 2 rodzaju) zgodne z wyznaczonymi pasmami. Zbadaj funkcje przenoszenia i odpowiedzi impulsowej.&lt;br /&gt;
# Powycinaj sygnały od &amp;amp;minus;5 do +5 sekund (wszystkie kanały). Przefiltruj każdą realizację. &lt;br /&gt;
# Oblicz moc chwilową za pomocą transformaty Hilberta (kwadrat amplitudy chwilowej).&lt;br /&gt;
# Uśrednij moc chwilową po realizacjach.&lt;br /&gt;
# Oblicz względną zmianę mocy chwilowej względem czasu &amp;amp;minus;4 do &amp;amp;minus;2. W ten sposób otrzymasz przebieg ERD i ERS w czasie.&lt;br /&gt;
# Wykreśl ERD i ERS w układzie topograficznym. (Rozmieść subploty tak, aby z w przybliżeniu odpowiadały pozycjom elektrod).&lt;br /&gt;
&lt;br /&gt;
===Transformacja Hjortha===&lt;br /&gt;
Transformacja Hjortha jest przybliżeniem numerycznym transformacji Laplace'a, czyli drugiej pochodnej przestrzennej.&lt;br /&gt;
Obliczamy ją jako różnicę potencjału pomiędzy daną elektrodą i średnią z czterech sąsiednich elektrod.&lt;br /&gt;
&lt;br /&gt;
Proszę przeliczyć potencjały C3, Cz i C4 na montaż Hjortha oraz powtórzyć analizę ERD/ERS opisaną powyżej.&lt;br /&gt;
Przykładowo dla elektrody C3 montaż Hjortha &amp;lt;math&amp;gt;\mathrm{C3_H}&amp;lt;/math&amp;gt; otrzymuje się w następujący sposób:&lt;br /&gt;
&amp;lt;math&amp;gt;\mathrm{C3_H = C3 - \frac{1}{4}(T3+F3+Cz+P3)}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Literatura=&lt;br /&gt;
* Beck, A., 1891. Oznaczenie lokalizacyi w mózgu i rdzeniu za pomoca zjawisk elektrycznych. Ph.D. thesis, Polska Akademia Umiejętności, Kraków, seria II.&lt;br /&gt;
* Crone, N. E., Miglioretti, D. L., Gordon, B., Lesser, R. P., 1998a. Functional mapping of human sensorimotor cortex with electrocorticigraphic spectral analysis II. Event-related synchronization in the gamma band. Brain 121, 2301–15.&lt;br /&gt;
* Crone, N. E., Miglioretti, D. L., Gordon, B., Sieracki, J. M., Wilson, M. T., Uematsu, S., 1998b. Functional mapping of human sensorimotor cortex with electrocorticographic spectral analysis I. Alpha and beta event-related desynchronization. Brain 121, 2271–99.&lt;br /&gt;
* Crone, N. E., Korzeniewska, A., Franaszczuk, P. J., 2010. Cortical gamma responses: Searching high and low. International Journal of Psychophysiology.&lt;br /&gt;
*Crone, N. E., Sinai, A., Korzeniewska, A., 2006. High-frequency gamma oscilla- tions and human brain mapping with electrocorticography. Progress in Brain Research 159, 275–295.&lt;br /&gt;
* Kaiser, J., Lutzenberger, W., 2003. Induced gamma-band activity and human brain function. Neuroscientist 9, 475–84.&lt;br /&gt;
* Nunez, P. L., 1981. Electric Fields of the Brain. The Neurophysics of EEG. Oxford University Press, New York.&lt;br /&gt;
* Pfurtscheller, G., Aranibar, A., 1979. Evaluation of event-related desyn- chronization (ERD) preceding and following voluntary self-paced movement. Electroencephalography and Clinical Neurophysiology 46, 138–146.&lt;br /&gt;
* Pfurtscheller, G., Flotzinger, D., Neuper, C., 1994. Differentiation between finger, toe and tongue movement in man based on 40 Hz EEG. Electroencephalography and Clinical Neurophysiology 90, 456–60.&lt;br /&gt;
* Pfurtscheller, G., Lopes da Silva, F. H., 1999. Event-related EEG/MEG synchronization and desynchronization: basic principles. Clinical Neurophysiology 110, 1842–57.&lt;br /&gt;
* Pfurtscheller, G., 1999. Quantification of ERD and ERS in the time domain. In: W Pfurtscheller, G., Lopes da Silva, F. H. (Eds.), Event-related desynchroni- zation. Vol. 6. Elsevier, p. 89–105.&lt;br /&gt;
* Pfurtscheller, G., Neuper, C., 2006. Future prospects of ERD/ERS in the context of brain-computer interface (BCI) developments. Progress in Brain Research 159, 433–437.&lt;br /&gt;
* Pfurtscheller, G., Stancak Jr, A., C., N., 1996a. Post-movement beta synchronization. A correlate of an idling motor area? Electroencephalography and Clinical Neurophysiology 98, 281–93.&lt;br /&gt;
* Pfurtscheller, G., Stancak Jr, A., Neuper, C., 1996b. Event-related synchronization (ERS) in the alpha band—an electrophysiological correlate of cortical idling: a review. International Journal of Psychophysiology 24, 39–46.&lt;br /&gt;
*Tallon-Baudry, C., Bertrand, O., 1999. Oscillatory gamma activity in humans and its role in object representation. Trends Cogn. Sci. 3, 151–62.&lt;br /&gt;
* Tallon-Baudry, C., Bertrand, O., Delpuech, C., Pernier, J., 1996. Stimulus specificity of phase-locked and non-phase-locked 40 Hz visual responses in human. The Journal of Neuroscience 16, 4240–4249.&lt;/div&gt;</summary>
		<author><name>Aduszyk</name></author>
		
	</entry>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=Pracownia_EEG/ERDS&amp;diff=9044</id>
		<title>Pracownia EEG/ERDS</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=Pracownia_EEG/ERDS&amp;diff=9044"/>
		<updated>2023-01-10T11:49:24Z</updated>

		<summary type="html">&lt;p&gt;Aduszyk: /* wersja 3 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Pracownia EEG|Pracownia EEG]] / ERD/S&lt;br /&gt;
&lt;br /&gt;
=Wstęp=&lt;br /&gt;
Wśród badań wykonywanych z wykorzystaniem rejestracji EEG czy MEG można wyróżnić badania spoczynkowe, gdzie rejestrowana jest spontaniczna aktywność mózgu oraz badania zmian aktywności pod wpływem różnych bodźców, przy czym bodźce te mogą być pochodzenia egzo- lub endogennego. Reakcja na bodziec może wykazywać stały związek fazowy z momentem wystąpienia bodźca &amp;amp;mdash; w takiej sytuacji mówimy o potencjałach lub polach wywołanych (ang. ''event related potential'', ''ERP'' i ''event related field'', ''ERF'') &amp;amp;mdash; lub też może nie być fazowo związana z bodźcem.&lt;br /&gt;
&lt;br /&gt;
Niniejsza część pracowni poświęcona jest metodologii badania reakcji mózgu na bodźce, które są czasowo ale niekoniecznie fazowo związane z bodźcem.&lt;br /&gt;
&lt;br /&gt;
=Zmiany pasmowej mocy sygnału EEG=&lt;br /&gt;
Pierwsze rezultaty opisujące zmiany w mocy pasmowej sygnału EEG (spadek mocy rytmu alfa) związane z reakcją na bodziec zostały opisane w pracy doktorskiej Adolf Becka zatytułowanej &amp;amp;bdquo;Oznaczenie lokalizacyi w mózgu i rdzeniu za pomocą zjawisk elektrycznych&amp;amp;rdquo; (Beck,  1891). &lt;br /&gt;
Ilościowe badania zjawisk modulacji mocy sygnału EEG w reakcji na bodźce rozpoczęto stosunkowo niedawno. Począwszy od pracy (Pfurtscheller, 1979) zjawiska te zaczęto nazywać ''Event Related Desynchronization'' (ERD) &amp;amp;mdash; czyli desynchronizacja związana z bodźcem. Termin ERD dotyczy spadku mocy. Przez analogię w późniejszych pracach terminem ''Event Related Synchronization'' (ERS) opisywane są efekty polegające na wzroście mocy. W większości paradygmatów eksperymentalnych zjawiska ERD i ERS są małe w porównaniu ze zmiennością mocy sygnału EEG związanej ze spontaniczną aktywnością mózgu. W celu ich ilościowego badania wymagane jest zarejestrowanie wielu realizacji reakcji na bodziec i poddanie ich analizie statystycznej. &lt;br /&gt;
&lt;br /&gt;
[[Plik:Paradygmat erds.gif|thumb|800px|center]]&lt;br /&gt;
==Interpretacja fizjologiczna==&lt;br /&gt;
[[Plik:EEG_synchronicznosc.png|600px|thumb|right|Synchronicznie pobudzana grupa neuronów piramidalnych kory tworzy warstwę dipolową.]]&lt;br /&gt;
[[Plik:Mapka_tf_erds.png|600px|thumb|right|Przykładowa mapa zjawiska synchronizacji i desynchronizacji sygnału EEG w przestrzeni czas-częstość dla sygnału zearejestrowanego przez elektrodę C3. Osoba badana wykonywała szybki ruch palcem w momencie oznaczonym 0. Kolory odpowiadają procentowej zmianie mocy względem poprzedzającego okresu 2s, zgodnie ze skalą barw umieszczoną po prawej stronie.  Na poziomej osi - czas w s, na pionowej częstość w Hz.]]&lt;br /&gt;
Terminy ERD i ERS mają swoje źródło w fizjologicznej interpretacji zmian mocy sygnału w określonych pasmach częstości.  Źródłem mierzalnego na powierzchni głowy sygnału elektrycznego lub magnetycznego jest synchroniczna aktywność wielu neuronów (głównie piramidalnych kory). Szacuje się, że wpływ na wielkość sygnału EEG lub MEG ma głównie stopień synchronizacji neuronów wytwarzających ten sygnał, a w drugiej kolejności ich ilość (Nunez, 1981). Tak więc wzrost mocy w pewnym paśmie (np. alfa ERS) interpretowany jest jako wzrost synchronizacji aktywności neuronów generujących aktywność EEG w tym paśmie, zaś spadek mocy (np. alfa ERD) interpretowany jest jako spadek synchronizacji neuronów generujących aktywność EEG w tym paśmie częstości. Przy takiej interpretacji należy pamiętać o skali w jakiej dokonywany jest pomiar. Zarówno elektrody EEG jak i cewki MEG mierzą sygnały średnie pochodzące od olbrzymich ilości neuronów. Zatem zmiana mocy w tym sygnale odpowiada desynchronizacji lub synchronizacji w skali makroskopowej (rzędu &amp;lt;math&amp;gt;10^6&amp;lt;/math&amp;gt;-&amp;lt;math&amp;gt;10^8&amp;lt;/math&amp;gt; neuronów). &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Zjawiska ERD i ERS badane były zarówno w eksperymentach motorycznych (Pfurtscheller, 1994, Pfurtscheller, 1996a, Pfurtscheller1, 996b , Pfurtscheller1999) jak i kognitywistycznych  (Tallon Baudry, 1996, Tallon, 1999, Kaiser2003).&lt;br /&gt;
Wnioski płynące z tych prac są takie, że znaczenie zjawisk ERD i ERS zależy od pasma częstości, w którym one występują. Aktywność w paśmie alfa wiązana jest ze stanem spoczynkowym, ERD w paśmie alfa i beta wiązane jest z pobudzeniem danego rejonu kory mózgowej, w którym zjawisko to zachodzi. ERS w paśmie alfa i beta następujący po ERD w tym samym paśmie częstości interpretowany jest najczęściej jako przejaw inhibicji lub kasowania poprzedniego stanu. Z kolei zwiększona aktywność w paśmie gamma jest interpretowana jako przejaw funkcjonalnej aktywacji danego fragmentu kory. Nowe wyniki pojawiają się na bieżąco i stawiane są nowe pytania co do możliwych interpretacji poszczególnych zjawisk  np. (Crone, 2010).&lt;br /&gt;
&lt;br /&gt;
Oprócz motywacji czysto poznawczych, badania zjawisk ERD i ERS stymulowane są przez praktyczne możliwości ich wykorzystania w diagnostyce epilepsji, gdzie są nadzieje na zastosowanie tej techniki w miejsce bardziej inwazyjnej metody mapowania mózgu przez elektrostymulację (Crone 1998a, Crone, 1998b, Crone, 2006) oraz w konstrukcji interfejsów mózg-komputer (Pfurtscheller, 2006).&lt;br /&gt;
[[Plik:Mapowanie.png|thumb|600px|center|Mapowanie kory czuciowo-ruchowej za pomocą stymulacji: dwie falki – bezwolne reakcje ruchowe, trzy falki – kloniczny skurcz mięśni, za Crone, 1998]]&lt;br /&gt;
[[Plik:Mapki_ECoG.jpg|thumb|600px|center|Mapowanie kory czuciowo-ruchowej za pomocą ERD/ERS.Pacjent z przyczyn medycznych miał umieszczoną na korze motorycznej siatkę elektrod (6x8, odstęp 1cm). Pacjent miał zaciskać pięść w odpowiedzi na bodziec wzrokowy przez cały czas trwania bodźca (3s)&lt;br /&gt;
Prezentowane mapy istotnych statystycznie zmian uzyskano na podstawie 49 wolnych od artefaktów realizacji.]]&lt;br /&gt;
&lt;br /&gt;
==Estymacja zmian mocy sygnału EEG w dziedzinie czasu==&lt;br /&gt;
Przebieg czasowy zjawiska ERD i ERS jest specyficzny dla pasm częstości.&lt;br /&gt;
[[Grafika:ERDS klasycznie_1.png|right|thumb|768px|&amp;lt;figure id=&amp;quot;fig:erds_klasycznie&amp;quot;&amp;gt;&amp;lt;/figure&amp;gt; Klasyczne obliczanie ERD/ERS. &amp;lt;br&amp;gt; a) Przykładowy zapis EEG jednej z &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; realizacji  &amp;lt;br&amp;gt; b) przefiltrowany sygnał EEG w wybranym paśmie (tutaj: [15 25] Hz)&amp;lt;br&amp;gt;  c) przefiltrowany sygnał podniesiony do kwadratu &amp;amp;mdash; w ten sposób uzyskujemy przebieg mocy pasmowej w czasie &amp;lt;br&amp;gt; d) uśredniony po realizacjach przebieg mocy pasmowej w czasie &amp;lt;br&amp;gt; e) wygładzony przebieg z d) za pomocą średniej biegnącej (tutaj okienko 0.25 s) czerwone pionowe linie wyznaczają okres referencyjny &amp;lt;br&amp;gt; f) ERD/ERS - względna zmiana sygnału e) w odniesieniu do okresu referencyjnego.]]&lt;br /&gt;
Klasyczny sposób estymowania  ERD i ERS (Pfurtscheller, 1979) polega na (patrz ilustracja): &lt;br /&gt;
*filtrowaniu pasmowym,&lt;br /&gt;
*wyrównaniu realizacji względem momentu wystąpienia bodźca, &lt;br /&gt;
*obliczaniu mocy chwilowej (podniesienie do kwadratu wartości każdej próbki sygnału), &lt;br /&gt;
*uśrednieniu mocy chwilowej po realizacjach, wygładzeniu przebiegu czasowego uśrednionej mocy chwilowej filtrem dolnoprzepustowym.&lt;br /&gt;
*Następnie względna zmiana mocy obliczana jest jako:&lt;br /&gt;
: &amp;lt;math&amp;gt;\mathrm{ERD/ERS}_f(t) = \frac{P_f(t) - R_f}{R_f}  &amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie:&lt;br /&gt;
&amp;lt;math&amp;gt;P_f(t)&amp;lt;/math&amp;gt; &amp;amp;mdash; średnia moc chwilowa w paśmie częstości ''f''; uśrednianie przebiega po realizacjach.&lt;br /&gt;
&amp;lt;math&amp;gt;R_f&amp;lt;/math&amp;gt; &amp;amp;mdash; średnia moc w paśmie ''f'' w okresie referencyjnym; uśrednianie przebiega po realizacjach i po czasie trwania okresu referencyjnego.&lt;br /&gt;
Klasycznym metodom obliczania ERD/ERS poświęcona jest praca (Pfurtscheller, 1999).&lt;br /&gt;
Całościowy obraz zmian mocy sygnału EEG związanych z bodźcem można dogodnie analizować w dziedzinie czas-częstość.&lt;br /&gt;
&lt;br /&gt;
=Cwiczenia=&lt;br /&gt;
&lt;br /&gt;
==Paradygmat ==&lt;br /&gt;
&lt;br /&gt;
===wersja 1===&lt;br /&gt;
Osoba badana siedzi wygodnie i trzyma przycisk podłączony do triggera.&lt;br /&gt;
Na ekranie w odstępach 13&amp;lt;math&amp;gt;\pm&amp;lt;/math&amp;gt;1 sekund wyświetlany jest krzyżyk. Krzyżyk wyświetlany jest przez 2 sekundy. W przeciągu 2 sekund po zniknięciu krzyżyka osoba badana w wybranym przez siebie momencie wciska przycisk. Proszę zarejestrować 60 realizacji.&lt;br /&gt;
&lt;br /&gt;
Przygotuj program implementujący powyższy paradygmat.&lt;br /&gt;
&lt;br /&gt;
===wersja 2===&lt;br /&gt;
Próba rozróżnienia ruchów lewą i prawą ręką &amp;amp;mdash; jak w BCI; na podstawie artykułu [[file:ERDS.BCI.TNSRE2012.pdf]], oczywiście w uproszczonej wersji :-)&lt;br /&gt;
&lt;br /&gt;
Procedura:&lt;br /&gt;
&lt;br /&gt;
Osoba badana ma za zadanie poruszać palcami (wskazującym oraz środkowym) prawej lub lewej ręki. Na ekranie monitora pojawia się strzałka, która widoczna jest przez okres 3 sek. i wskazuje rękę, którą będzie wykonywany ruch. Osoba badana ma ruszyć wskazaną ręką w wybranym przez siebie momencie PO zniknięciu strzałki. &lt;br /&gt;
Dla każdej ręki przewidziane jest 100 powtórzeń. W celu synchronizacji sygnału EEG ze wskazówkami pojawiającymi się na ekranie monitora, w lewym dolnym rogu (gdzie pojawia się biały kwadrat) powinna zostać umieszczona fotodioda. &lt;br /&gt;
&lt;br /&gt;
Rejestracja sygnału:&lt;br /&gt;
&lt;br /&gt;
Wykorzystujemy następujące elektrody umieszczone zgodnie z systemem 10--10: FC3, FC1, FCz, FC2, FC4, C5, C3, C1, Cz, C2, C4, C6, CP5, CP3, CP1, CPz, CP2, CP4, CP6, P1, P2, A1, A1. Dodatkowo wykonujemy pomiar z mięśnia extensor digitorum. W tym celu na obu rękach umieszczamy elektrody bipolarne do EMG (patrz Fig. 1 (elektroda ED3): http://jn.physiology.org/content/100/6/3225.long). Sygnał rejestrujemy z częstością 512 Hz.&lt;br /&gt;
&lt;br /&gt;
Procedura może zostać pobrana ze stony: https://github.com/mroja/signal_utils/tree/master/erds/arrows.&lt;br /&gt;
&lt;br /&gt;
===wersja 3=== &lt;br /&gt;
Osoba ma za zadanie ruszać palcem lub wyobrażać sobie ruch palcem. Polecenia te podawane są losowo (nie więcej niż 3 te same próby powinny być pod rząd). Na ekranie powinna zostać wyświetlona instrukcja, w której opisany jest cel badania. Następnie rozpoczyna się blok prób, w trakcie poszczególnej próby wyświetlane jest polecenie: &amp;quot;Rusz palcem&amp;quot;/ &amp;quot;Wyobraź sobie ruch palcem&amp;quot; na 4s, następnie 3 s przerwy (pusty ekran). Każde polecenie powinno być powtórzone 100 razy. &lt;br /&gt;
&lt;br /&gt;
W trakcie procedury powinien być zbierany sygnał EEG oraz EMG palca. Wykorzystujemy następujące elektrody EEG umieszczone zgodnie z systemem 10--10: FC3, FC1, FCz, FC2, FC4, C5, C3, C1, Cz, C2, C4, C6, CP5, CP3, CP1, CPz, CP2, CP4, CP6, P1, P2, A1, A1. częstość próbkowania: min. 1024 Hz. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--Analiza:&lt;br /&gt;
# ERD/S w pasmach&lt;br /&gt;
# uśrednione mapy czas-częstość osobno dla ruchu lewą i prawą ręką&lt;br /&gt;
# analiza możliwości rozróżnienia ruchu na podstawie EEG&lt;br /&gt;
&lt;br /&gt;
Uśrednianie spektrogramów wykonujemy samodzielnie w Pythonie, a na deser liczymy estymatę średnich rozkładów czas-częstość z MP:&lt;br /&gt;
&lt;br /&gt;
# eksportujemy tagi znalezione na podstawie EMG https://brain.fuw.edu.pl/edu/EEG:Pracownia_EEG/SSVEP_1#.C4.86wiczenie_dla_ch.C4.99tnych i oglądamy w Svarogu wyniki na tle sygnału&lt;br /&gt;
# ściągamy najnowszą wersję Svaroga z http://braintech.pl/svarog, umożliwiającą uśrednianie map&lt;br /&gt;
# Otwieramy w Svarogu plik sygnału wraz z tagami.&lt;br /&gt;
# Ustalamy odpowiedni montaż i filtrowanie sygnału.&lt;br /&gt;
# Uruchamiamy dekompozycję MP (Tools → MP decomposition) wybierając w ustawieniach (zakładka „Signal selection” → zakładka „Marked”)&lt;br /&gt;
## rodzaj taga oznaczającego kolejne powtórzenia&lt;br /&gt;
## początek i długość trwania analizowanego interwału czasu (w sekundach, względem wystąpienia taga)&lt;br /&gt;
&lt;br /&gt;
Po zakończeniu obliczeń otwieramy rezultat w nowym oknie („Get result”). Obliczona w ten sposób „książka” składa się z dekompozycji MP kolejnych powtórzeń eksperymentu, przedstawionych w postaci map czas-częstość. Otrzymane mapy możemy następnie uśrednić (Tools → Average books) i zapisać do pliku graficznego o ustalonej rozdzielczości.--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Rejestracja sygnału==&lt;br /&gt;
[[Plik:10_20zAFz.png|thumb| 600px|right]]&lt;br /&gt;
# Zakładamy czepek i elektrody w systemie 10-20, dbamy o to by opory pomiędzy elektrodami były poniżej 5 k&amp;lt;math&amp;gt;\Omega&amp;lt;/math&amp;gt; i różnice pomiędzy oporami różnych elektrod nie przekraczały 20%.&lt;br /&gt;
# Elektrody referencyjne A1 i A2.&lt;br /&gt;
# Elektrodę GND mocujemy w otworze czepka odpowiadającym pozycji AFz (na linii centralnej 10% w stronę nosa od elektrody Fz).&lt;br /&gt;
# Sygnał rejestrujemy z częstością 256 Hz.&lt;br /&gt;
&lt;br /&gt;
==Analiza==&lt;br /&gt;
Czas wciśnięcia przycisku oznaczymy jako 0.&lt;br /&gt;
Poniższą analizę zastosuj dla sygnałów w referencji do uśrednionych odprowadzeń usznych A1 i A2.&lt;br /&gt;
&lt;br /&gt;
===Wyznaczenie pasma &amp;amp;mu; i &amp;amp;beta;===&lt;br /&gt;
# Z sygnału wycinamy fragmenty od &amp;amp;minus;4 do &amp;amp;minus;2 sek. dla elektrod C3 i C4 (elektrody położone nad korą ruchową dłoni). &lt;br /&gt;
# Dla każdej realizacji obliczamy widma metodą Welcha.&lt;br /&gt;
# Otrzymane widma uśredniamy po realizacjach.&lt;br /&gt;
# Z sygnału wycinamy fragmenty od +0.5 do +2.5 sek. dla elektrod C3 i C4 (elektrody położone nad korą ruchową dłoni). &lt;br /&gt;
# Dla każdej realizacji obliczamy widma metodą Welcha.&lt;br /&gt;
# Otrzymane widma uśredniamy po realizacjach.&lt;br /&gt;
# Wykreśl widma z okresu poprzedzającego ruch i z okresu po ruchu nałożone na siebie, a także względną zmianę widma. Zaobserwuj w jakich zakresach częstości &amp;amp;mu; (pasmo około 10 Hz) i &amp;amp;beta; (około 23 Hz) występują największe zmiany.&lt;br /&gt;
&lt;br /&gt;
===Wyznaczenie przebiegu czasowego ERD i ERS ===&lt;br /&gt;
# Zaprojektuj filtry pasmowo przepustowe (Chebyszewa 2 rodzaju) zgodne z wyznaczonymi pasmami. Zbadaj funkcje przenoszenia i odpowiedzi impulsowej.&lt;br /&gt;
# Powycinaj sygnały od &amp;amp;minus;5 do +5 sekund (wszystkie kanały). Przefiltruj każdą realizację. &lt;br /&gt;
# Oblicz moc chwilową za pomocą transformaty Hilberta (kwadrat amplitudy chwilowej).&lt;br /&gt;
# Uśrednij moc chwilową po realizacjach.&lt;br /&gt;
# Oblicz względną zmianę mocy chwilowej względem czasu &amp;amp;minus;4 do &amp;amp;minus;2. W ten sposób otrzymasz przebieg ERD i ERS w czasie.&lt;br /&gt;
# Wykreśl ERD i ERS w układzie topograficznym. (Rozmieść subploty tak, aby z w przybliżeniu odpowiadały pozycjom elektrod).&lt;br /&gt;
&lt;br /&gt;
===Transformacja Hjortha===&lt;br /&gt;
Transformacja Hjortha jest przybliżeniem numerycznym transformacji Laplace'a, czyli drugiej pochodnej przestrzennej.&lt;br /&gt;
Obliczamy ją jako różnicę potencjału pomiędzy daną elektrodą i średnią z czterech sąsiednich elektrod.&lt;br /&gt;
&lt;br /&gt;
Proszę przeliczyć potencjały C3, Cz i C4 na montaż Hjortha oraz powtórzyć analizę ERD/ERS opisaną powyżej.&lt;br /&gt;
Przykładowo dla elektrody C3 montaż Hjortha &amp;lt;math&amp;gt;\mathrm{C3_H}&amp;lt;/math&amp;gt; otrzymuje się w następujący sposób:&lt;br /&gt;
&amp;lt;math&amp;gt;\mathrm{C3_H = C3 - \frac{1}{4}(T3+F3+Cz+P3)}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Literatura=&lt;br /&gt;
* Beck, A., 1891. Oznaczenie lokalizacyi w mózgu i rdzeniu za pomoca zjawisk elektrycznych. Ph.D. thesis, Polska Akademia Umiejętności, Kraków, seria II.&lt;br /&gt;
* Crone, N. E., Miglioretti, D. L., Gordon, B., Lesser, R. P., 1998a. Functional mapping of human sensorimotor cortex with electrocorticigraphic spectral analysis II. Event-related synchronization in the gamma band. Brain 121, 2301–15.&lt;br /&gt;
* Crone, N. E., Miglioretti, D. L., Gordon, B., Sieracki, J. M., Wilson, M. T., Uematsu, S., 1998b. Functional mapping of human sensorimotor cortex with electrocorticographic spectral analysis I. Alpha and beta event-related desynchronization. Brain 121, 2271–99.&lt;br /&gt;
* Crone, N. E., Korzeniewska, A., Franaszczuk, P. J., 2010. Cortical gamma responses: Searching high and low. International Journal of Psychophysiology.&lt;br /&gt;
*Crone, N. E., Sinai, A., Korzeniewska, A., 2006. High-frequency gamma oscilla- tions and human brain mapping with electrocorticography. Progress in Brain Research 159, 275–295.&lt;br /&gt;
* Kaiser, J., Lutzenberger, W., 2003. Induced gamma-band activity and human brain function. Neuroscientist 9, 475–84.&lt;br /&gt;
* Nunez, P. L., 1981. Electric Fields of the Brain. The Neurophysics of EEG. Oxford University Press, New York.&lt;br /&gt;
* Pfurtscheller, G., Aranibar, A., 1979. Evaluation of event-related desyn- chronization (ERD) preceding and following voluntary self-paced movement. Electroencephalography and Clinical Neurophysiology 46, 138–146.&lt;br /&gt;
* Pfurtscheller, G., Flotzinger, D., Neuper, C., 1994. Differentiation between finger, toe and tongue movement in man based on 40 Hz EEG. Electroencephalography and Clinical Neurophysiology 90, 456–60.&lt;br /&gt;
* Pfurtscheller, G., Lopes da Silva, F. H., 1999. Event-related EEG/MEG synchronization and desynchronization: basic principles. Clinical Neurophysiology 110, 1842–57.&lt;br /&gt;
* Pfurtscheller, G., 1999. Quantification of ERD and ERS in the time domain. In: W Pfurtscheller, G., Lopes da Silva, F. H. (Eds.), Event-related desynchroni- zation. Vol. 6. Elsevier, p. 89–105.&lt;br /&gt;
* Pfurtscheller, G., Neuper, C., 2006. Future prospects of ERD/ERS in the context of brain-computer interface (BCI) developments. Progress in Brain Research 159, 433–437.&lt;br /&gt;
* Pfurtscheller, G., Stancak Jr, A., C., N., 1996a. Post-movement beta synchronization. A correlate of an idling motor area? Electroencephalography and Clinical Neurophysiology 98, 281–93.&lt;br /&gt;
* Pfurtscheller, G., Stancak Jr, A., Neuper, C., 1996b. Event-related synchronization (ERS) in the alpha band—an electrophysiological correlate of cortical idling: a review. International Journal of Psychophysiology 24, 39–46.&lt;br /&gt;
*Tallon-Baudry, C., Bertrand, O., 1999. Oscillatory gamma activity in humans and its role in object representation. Trends Cogn. Sci. 3, 151–62.&lt;br /&gt;
* Tallon-Baudry, C., Bertrand, O., Delpuech, C., Pernier, J., 1996. Stimulus specificity of phase-locked and non-phase-locked 40 Hz visual responses in human. The Journal of Neuroscience 16, 4240–4249.&lt;/div&gt;</summary>
		<author><name>Aduszyk</name></author>
		
	</entry>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=Pracownia_EEG/ERDS&amp;diff=9043</id>
		<title>Pracownia EEG/ERDS</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=Pracownia_EEG/ERDS&amp;diff=9043"/>
		<updated>2023-01-10T11:46:52Z</updated>

		<summary type="html">&lt;p&gt;Aduszyk: /* Paradygmat */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Pracownia EEG|Pracownia EEG]] / ERD/S&lt;br /&gt;
&lt;br /&gt;
=Wstęp=&lt;br /&gt;
Wśród badań wykonywanych z wykorzystaniem rejestracji EEG czy MEG można wyróżnić badania spoczynkowe, gdzie rejestrowana jest spontaniczna aktywność mózgu oraz badania zmian aktywności pod wpływem różnych bodźców, przy czym bodźce te mogą być pochodzenia egzo- lub endogennego. Reakcja na bodziec może wykazywać stały związek fazowy z momentem wystąpienia bodźca &amp;amp;mdash; w takiej sytuacji mówimy o potencjałach lub polach wywołanych (ang. ''event related potential'', ''ERP'' i ''event related field'', ''ERF'') &amp;amp;mdash; lub też może nie być fazowo związana z bodźcem.&lt;br /&gt;
&lt;br /&gt;
Niniejsza część pracowni poświęcona jest metodologii badania reakcji mózgu na bodźce, które są czasowo ale niekoniecznie fazowo związane z bodźcem.&lt;br /&gt;
&lt;br /&gt;
=Zmiany pasmowej mocy sygnału EEG=&lt;br /&gt;
Pierwsze rezultaty opisujące zmiany w mocy pasmowej sygnału EEG (spadek mocy rytmu alfa) związane z reakcją na bodziec zostały opisane w pracy doktorskiej Adolf Becka zatytułowanej &amp;amp;bdquo;Oznaczenie lokalizacyi w mózgu i rdzeniu za pomocą zjawisk elektrycznych&amp;amp;rdquo; (Beck,  1891). &lt;br /&gt;
Ilościowe badania zjawisk modulacji mocy sygnału EEG w reakcji na bodźce rozpoczęto stosunkowo niedawno. Począwszy od pracy (Pfurtscheller, 1979) zjawiska te zaczęto nazywać ''Event Related Desynchronization'' (ERD) &amp;amp;mdash; czyli desynchronizacja związana z bodźcem. Termin ERD dotyczy spadku mocy. Przez analogię w późniejszych pracach terminem ''Event Related Synchronization'' (ERS) opisywane są efekty polegające na wzroście mocy. W większości paradygmatów eksperymentalnych zjawiska ERD i ERS są małe w porównaniu ze zmiennością mocy sygnału EEG związanej ze spontaniczną aktywnością mózgu. W celu ich ilościowego badania wymagane jest zarejestrowanie wielu realizacji reakcji na bodziec i poddanie ich analizie statystycznej. &lt;br /&gt;
&lt;br /&gt;
[[Plik:Paradygmat erds.gif|thumb|800px|center]]&lt;br /&gt;
==Interpretacja fizjologiczna==&lt;br /&gt;
[[Plik:EEG_synchronicznosc.png|600px|thumb|right|Synchronicznie pobudzana grupa neuronów piramidalnych kory tworzy warstwę dipolową.]]&lt;br /&gt;
[[Plik:Mapka_tf_erds.png|600px|thumb|right|Przykładowa mapa zjawiska synchronizacji i desynchronizacji sygnału EEG w przestrzeni czas-częstość dla sygnału zearejestrowanego przez elektrodę C3. Osoba badana wykonywała szybki ruch palcem w momencie oznaczonym 0. Kolory odpowiadają procentowej zmianie mocy względem poprzedzającego okresu 2s, zgodnie ze skalą barw umieszczoną po prawej stronie.  Na poziomej osi - czas w s, na pionowej częstość w Hz.]]&lt;br /&gt;
Terminy ERD i ERS mają swoje źródło w fizjologicznej interpretacji zmian mocy sygnału w określonych pasmach częstości.  Źródłem mierzalnego na powierzchni głowy sygnału elektrycznego lub magnetycznego jest synchroniczna aktywność wielu neuronów (głównie piramidalnych kory). Szacuje się, że wpływ na wielkość sygnału EEG lub MEG ma głównie stopień synchronizacji neuronów wytwarzających ten sygnał, a w drugiej kolejności ich ilość (Nunez, 1981). Tak więc wzrost mocy w pewnym paśmie (np. alfa ERS) interpretowany jest jako wzrost synchronizacji aktywności neuronów generujących aktywność EEG w tym paśmie, zaś spadek mocy (np. alfa ERD) interpretowany jest jako spadek synchronizacji neuronów generujących aktywność EEG w tym paśmie częstości. Przy takiej interpretacji należy pamiętać o skali w jakiej dokonywany jest pomiar. Zarówno elektrody EEG jak i cewki MEG mierzą sygnały średnie pochodzące od olbrzymich ilości neuronów. Zatem zmiana mocy w tym sygnale odpowiada desynchronizacji lub synchronizacji w skali makroskopowej (rzędu &amp;lt;math&amp;gt;10^6&amp;lt;/math&amp;gt;-&amp;lt;math&amp;gt;10^8&amp;lt;/math&amp;gt; neuronów). &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Zjawiska ERD i ERS badane były zarówno w eksperymentach motorycznych (Pfurtscheller, 1994, Pfurtscheller, 1996a, Pfurtscheller1, 996b , Pfurtscheller1999) jak i kognitywistycznych  (Tallon Baudry, 1996, Tallon, 1999, Kaiser2003).&lt;br /&gt;
Wnioski płynące z tych prac są takie, że znaczenie zjawisk ERD i ERS zależy od pasma częstości, w którym one występują. Aktywność w paśmie alfa wiązana jest ze stanem spoczynkowym, ERD w paśmie alfa i beta wiązane jest z pobudzeniem danego rejonu kory mózgowej, w którym zjawisko to zachodzi. ERS w paśmie alfa i beta następujący po ERD w tym samym paśmie częstości interpretowany jest najczęściej jako przejaw inhibicji lub kasowania poprzedniego stanu. Z kolei zwiększona aktywność w paśmie gamma jest interpretowana jako przejaw funkcjonalnej aktywacji danego fragmentu kory. Nowe wyniki pojawiają się na bieżąco i stawiane są nowe pytania co do możliwych interpretacji poszczególnych zjawisk  np. (Crone, 2010).&lt;br /&gt;
&lt;br /&gt;
Oprócz motywacji czysto poznawczych, badania zjawisk ERD i ERS stymulowane są przez praktyczne możliwości ich wykorzystania w diagnostyce epilepsji, gdzie są nadzieje na zastosowanie tej techniki w miejsce bardziej inwazyjnej metody mapowania mózgu przez elektrostymulację (Crone 1998a, Crone, 1998b, Crone, 2006) oraz w konstrukcji interfejsów mózg-komputer (Pfurtscheller, 2006).&lt;br /&gt;
[[Plik:Mapowanie.png|thumb|600px|center|Mapowanie kory czuciowo-ruchowej za pomocą stymulacji: dwie falki – bezwolne reakcje ruchowe, trzy falki – kloniczny skurcz mięśni, za Crone, 1998]]&lt;br /&gt;
[[Plik:Mapki_ECoG.jpg|thumb|600px|center|Mapowanie kory czuciowo-ruchowej za pomocą ERD/ERS.Pacjent z przyczyn medycznych miał umieszczoną na korze motorycznej siatkę elektrod (6x8, odstęp 1cm). Pacjent miał zaciskać pięść w odpowiedzi na bodziec wzrokowy przez cały czas trwania bodźca (3s)&lt;br /&gt;
Prezentowane mapy istotnych statystycznie zmian uzyskano na podstawie 49 wolnych od artefaktów realizacji.]]&lt;br /&gt;
&lt;br /&gt;
==Estymacja zmian mocy sygnału EEG w dziedzinie czasu==&lt;br /&gt;
Przebieg czasowy zjawiska ERD i ERS jest specyficzny dla pasm częstości.&lt;br /&gt;
[[Grafika:ERDS klasycznie_1.png|right|thumb|768px|&amp;lt;figure id=&amp;quot;fig:erds_klasycznie&amp;quot;&amp;gt;&amp;lt;/figure&amp;gt; Klasyczne obliczanie ERD/ERS. &amp;lt;br&amp;gt; a) Przykładowy zapis EEG jednej z &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; realizacji  &amp;lt;br&amp;gt; b) przefiltrowany sygnał EEG w wybranym paśmie (tutaj: [15 25] Hz)&amp;lt;br&amp;gt;  c) przefiltrowany sygnał podniesiony do kwadratu &amp;amp;mdash; w ten sposób uzyskujemy przebieg mocy pasmowej w czasie &amp;lt;br&amp;gt; d) uśredniony po realizacjach przebieg mocy pasmowej w czasie &amp;lt;br&amp;gt; e) wygładzony przebieg z d) za pomocą średniej biegnącej (tutaj okienko 0.25 s) czerwone pionowe linie wyznaczają okres referencyjny &amp;lt;br&amp;gt; f) ERD/ERS - względna zmiana sygnału e) w odniesieniu do okresu referencyjnego.]]&lt;br /&gt;
Klasyczny sposób estymowania  ERD i ERS (Pfurtscheller, 1979) polega na (patrz ilustracja): &lt;br /&gt;
*filtrowaniu pasmowym,&lt;br /&gt;
*wyrównaniu realizacji względem momentu wystąpienia bodźca, &lt;br /&gt;
*obliczaniu mocy chwilowej (podniesienie do kwadratu wartości każdej próbki sygnału), &lt;br /&gt;
*uśrednieniu mocy chwilowej po realizacjach, wygładzeniu przebiegu czasowego uśrednionej mocy chwilowej filtrem dolnoprzepustowym.&lt;br /&gt;
*Następnie względna zmiana mocy obliczana jest jako:&lt;br /&gt;
: &amp;lt;math&amp;gt;\mathrm{ERD/ERS}_f(t) = \frac{P_f(t) - R_f}{R_f}  &amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie:&lt;br /&gt;
&amp;lt;math&amp;gt;P_f(t)&amp;lt;/math&amp;gt; &amp;amp;mdash; średnia moc chwilowa w paśmie częstości ''f''; uśrednianie przebiega po realizacjach.&lt;br /&gt;
&amp;lt;math&amp;gt;R_f&amp;lt;/math&amp;gt; &amp;amp;mdash; średnia moc w paśmie ''f'' w okresie referencyjnym; uśrednianie przebiega po realizacjach i po czasie trwania okresu referencyjnego.&lt;br /&gt;
Klasycznym metodom obliczania ERD/ERS poświęcona jest praca (Pfurtscheller, 1999).&lt;br /&gt;
Całościowy obraz zmian mocy sygnału EEG związanych z bodźcem można dogodnie analizować w dziedzinie czas-częstość.&lt;br /&gt;
&lt;br /&gt;
=Cwiczenia=&lt;br /&gt;
&lt;br /&gt;
==Paradygmat ==&lt;br /&gt;
&lt;br /&gt;
===wersja 1===&lt;br /&gt;
Osoba badana siedzi wygodnie i trzyma przycisk podłączony do triggera.&lt;br /&gt;
Na ekranie w odstępach 13&amp;lt;math&amp;gt;\pm&amp;lt;/math&amp;gt;1 sekund wyświetlany jest krzyżyk. Krzyżyk wyświetlany jest przez 2 sekundy. W przeciągu 2 sekund po zniknięciu krzyżyka osoba badana w wybranym przez siebie momencie wciska przycisk. Proszę zarejestrować 60 realizacji.&lt;br /&gt;
&lt;br /&gt;
Przygotuj program implementujący powyższy paradygmat.&lt;br /&gt;
&lt;br /&gt;
===wersja 2===&lt;br /&gt;
Próba rozróżnienia ruchów lewą i prawą ręką &amp;amp;mdash; jak w BCI; na podstawie artykułu [[file:ERDS.BCI.TNSRE2012.pdf]], oczywiście w uproszczonej wersji :-)&lt;br /&gt;
&lt;br /&gt;
Procedura:&lt;br /&gt;
&lt;br /&gt;
Osoba badana ma za zadanie poruszać palcami (wskazującym oraz środkowym) prawej lub lewej ręki. Na ekranie monitora pojawia się strzałka, która widoczna jest przez okres 3 sek. i wskazuje rękę, którą będzie wykonywany ruch. Osoba badana ma ruszyć wskazaną ręką w wybranym przez siebie momencie PO zniknięciu strzałki. &lt;br /&gt;
Dla każdej ręki przewidziane jest 100 powtórzeń. W celu synchronizacji sygnału EEG ze wskazówkami pojawiającymi się na ekranie monitora, w lewym dolnym rogu (gdzie pojawia się biały kwadrat) powinna zostać umieszczona fotodioda. &lt;br /&gt;
&lt;br /&gt;
Rejestracja sygnału:&lt;br /&gt;
&lt;br /&gt;
Wykorzystujemy następujące elektrody umieszczone zgodnie z systemem 10--10: FC3, FC1, FCz, FC2, FC4, C5, C3, C1, Cz, C2, C4, C6, CP5, CP3, CP1, CPz, CP2, CP4, CP6, P1, P2, A1, A1. Dodatkowo wykonujemy pomiar z mięśnia extensor digitorum. W tym celu na obu rękach umieszczamy elektrody bipolarne do EMG (patrz Fig. 1 (elektroda ED3): http://jn.physiology.org/content/100/6/3225.long). Sygnał rejestrujemy z częstością 512 Hz.&lt;br /&gt;
&lt;br /&gt;
Procedura może zostać pobrana ze stony: https://github.com/mroja/signal_utils/tree/master/erds/arrows.&lt;br /&gt;
&lt;br /&gt;
===wersja 3=== &lt;br /&gt;
Osoba ma za zadanie ruszać palcem lub wyobrażać sobie ruch palcem. Polecenia te podawane są losowo (nie więcej niż 3 te same próby powinny być pod rząd). Na ekranie powinna zostać wyświetlona instrukcja, w której opisany jest cel badania. Następnie rozpoczyna się blok prób, w trakcie poszczególnej próby wyświetlane jest polecenie: &amp;quot;Rusz palcem&amp;quot;/ &amp;quot;Wyobraź sobie ruch palcem&amp;quot; na 4s, następnie 3 s przerwy (pusty ekran). Każde polecenie powinno być powtórzone 100 razy. &lt;br /&gt;
&lt;br /&gt;
W trakcie procedury powinien być zbierany sygnał EEG oraz EMG palca. Wykorzystujemy następujące elektrody EEG umieszczone zgodnie z systemem 10--10: FC3, FC1, FCz, FC2, FC4, C5, C3, C1, Cz, C2, C4, C6, CP5, CP3, CP1, CPz, CP2, CP4, CP6, P1, P2, A1, A1. częstość próbkowania: min. 1024 Hz. &lt;br /&gt;
&lt;br /&gt;
Analiza:&lt;br /&gt;
# ERD/S w pasmach&lt;br /&gt;
# uśrednione mapy czas-częstość osobno dla ruchu lewą i prawą ręką&lt;br /&gt;
# analiza możliwości rozróżnienia ruchu na podstawie EEG&lt;br /&gt;
&lt;br /&gt;
Uśrednianie spektrogramów wykonujemy samodzielnie w Pythonie, a na deser liczymy estymatę średnich rozkładów czas-częstość z MP:&lt;br /&gt;
&lt;br /&gt;
# eksportujemy tagi znalezione na podstawie EMG https://brain.fuw.edu.pl/edu/EEG:Pracownia_EEG/SSVEP_1#.C4.86wiczenie_dla_ch.C4.99tnych i oglądamy w Svarogu wyniki na tle sygnału&lt;br /&gt;
# ściągamy najnowszą wersję Svaroga z http://braintech.pl/svarog, umożliwiającą uśrednianie map&lt;br /&gt;
# Otwieramy w Svarogu plik sygnału wraz z tagami.&lt;br /&gt;
# Ustalamy odpowiedni montaż i filtrowanie sygnału.&lt;br /&gt;
# Uruchamiamy dekompozycję MP (Tools → MP decomposition) wybierając w ustawieniach (zakładka „Signal selection” → zakładka „Marked”)&lt;br /&gt;
## rodzaj taga oznaczającego kolejne powtórzenia&lt;br /&gt;
## początek i długość trwania analizowanego interwału czasu (w sekundach, względem wystąpienia taga)&lt;br /&gt;
&lt;br /&gt;
Po zakończeniu obliczeń otwieramy rezultat w nowym oknie („Get result”). Obliczona w ten sposób „książka” składa się z dekompozycji MP kolejnych powtórzeń eksperymentu, przedstawionych w postaci map czas-częstość. Otrzymane mapy możemy następnie uśrednić (Tools → Average books) i zapisać do pliku graficznego o ustalonej rozdzielczości.&lt;br /&gt;
&lt;br /&gt;
==Rejestracja sygnału==&lt;br /&gt;
[[Plik:10_20zAFz.png|thumb| 600px|right]]&lt;br /&gt;
# Zakładamy czepek i elektrody w systemie 10-20, dbamy o to by opory pomiędzy elektrodami były poniżej 5 k&amp;lt;math&amp;gt;\Omega&amp;lt;/math&amp;gt; i różnice pomiędzy oporami różnych elektrod nie przekraczały 20%.&lt;br /&gt;
# Elektrody referencyjne A1 i A2.&lt;br /&gt;
# Elektrodę GND mocujemy w otworze czepka odpowiadającym pozycji AFz (na linii centralnej 10% w stronę nosa od elektrody Fz).&lt;br /&gt;
# Sygnał rejestrujemy z częstością 256 Hz.&lt;br /&gt;
&lt;br /&gt;
==Analiza==&lt;br /&gt;
Czas wciśnięcia przycisku oznaczymy jako 0.&lt;br /&gt;
Poniższą analizę zastosuj dla sygnałów w referencji do uśrednionych odprowadzeń usznych A1 i A2.&lt;br /&gt;
&lt;br /&gt;
===Wyznaczenie pasma &amp;amp;mu; i &amp;amp;beta;===&lt;br /&gt;
# Z sygnału wycinamy fragmenty od &amp;amp;minus;4 do &amp;amp;minus;2 sek. dla elektrod C3 i C4 (elektrody położone nad korą ruchową dłoni). &lt;br /&gt;
# Dla każdej realizacji obliczamy widma metodą Welcha.&lt;br /&gt;
# Otrzymane widma uśredniamy po realizacjach.&lt;br /&gt;
# Z sygnału wycinamy fragmenty od +0.5 do +2.5 sek. dla elektrod C3 i C4 (elektrody położone nad korą ruchową dłoni). &lt;br /&gt;
# Dla każdej realizacji obliczamy widma metodą Welcha.&lt;br /&gt;
# Otrzymane widma uśredniamy po realizacjach.&lt;br /&gt;
# Wykreśl widma z okresu poprzedzającego ruch i z okresu po ruchu nałożone na siebie, a także względną zmianę widma. Zaobserwuj w jakich zakresach częstości &amp;amp;mu; (pasmo około 10 Hz) i &amp;amp;beta; (około 23 Hz) występują największe zmiany.&lt;br /&gt;
&lt;br /&gt;
===Wyznaczenie przebiegu czasowego ERD i ERS ===&lt;br /&gt;
# Zaprojektuj filtry pasmowo przepustowe (Chebyszewa 2 rodzaju) zgodne z wyznaczonymi pasmami. Zbadaj funkcje przenoszenia i odpowiedzi impulsowej.&lt;br /&gt;
# Powycinaj sygnały od &amp;amp;minus;5 do +5 sekund (wszystkie kanały). Przefiltruj każdą realizację. &lt;br /&gt;
# Oblicz moc chwilową za pomocą transformaty Hilberta (kwadrat amplitudy chwilowej).&lt;br /&gt;
# Uśrednij moc chwilową po realizacjach.&lt;br /&gt;
# Oblicz względną zmianę mocy chwilowej względem czasu &amp;amp;minus;4 do &amp;amp;minus;2. W ten sposób otrzymasz przebieg ERD i ERS w czasie.&lt;br /&gt;
# Wykreśl ERD i ERS w układzie topograficznym. (Rozmieść subploty tak, aby z w przybliżeniu odpowiadały pozycjom elektrod).&lt;br /&gt;
&lt;br /&gt;
===Transformacja Hjortha===&lt;br /&gt;
Transformacja Hjortha jest przybliżeniem numerycznym transformacji Laplace'a, czyli drugiej pochodnej przestrzennej.&lt;br /&gt;
Obliczamy ją jako różnicę potencjału pomiędzy daną elektrodą i średnią z czterech sąsiednich elektrod.&lt;br /&gt;
&lt;br /&gt;
Proszę przeliczyć potencjały C3, Cz i C4 na montaż Hjortha oraz powtórzyć analizę ERD/ERS opisaną powyżej.&lt;br /&gt;
Przykładowo dla elektrody C3 montaż Hjortha &amp;lt;math&amp;gt;\mathrm{C3_H}&amp;lt;/math&amp;gt; otrzymuje się w następujący sposób:&lt;br /&gt;
&amp;lt;math&amp;gt;\mathrm{C3_H = C3 - \frac{1}{4}(T3+F3+Cz+P3)}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Literatura=&lt;br /&gt;
* Beck, A., 1891. Oznaczenie lokalizacyi w mózgu i rdzeniu za pomoca zjawisk elektrycznych. Ph.D. thesis, Polska Akademia Umiejętności, Kraków, seria II.&lt;br /&gt;
* Crone, N. E., Miglioretti, D. L., Gordon, B., Lesser, R. P., 1998a. Functional mapping of human sensorimotor cortex with electrocorticigraphic spectral analysis II. Event-related synchronization in the gamma band. Brain 121, 2301–15.&lt;br /&gt;
* Crone, N. E., Miglioretti, D. L., Gordon, B., Sieracki, J. M., Wilson, M. T., Uematsu, S., 1998b. Functional mapping of human sensorimotor cortex with electrocorticographic spectral analysis I. Alpha and beta event-related desynchronization. Brain 121, 2271–99.&lt;br /&gt;
* Crone, N. E., Korzeniewska, A., Franaszczuk, P. J., 2010. Cortical gamma responses: Searching high and low. International Journal of Psychophysiology.&lt;br /&gt;
*Crone, N. E., Sinai, A., Korzeniewska, A., 2006. High-frequency gamma oscilla- tions and human brain mapping with electrocorticography. Progress in Brain Research 159, 275–295.&lt;br /&gt;
* Kaiser, J., Lutzenberger, W., 2003. Induced gamma-band activity and human brain function. Neuroscientist 9, 475–84.&lt;br /&gt;
* Nunez, P. L., 1981. Electric Fields of the Brain. The Neurophysics of EEG. Oxford University Press, New York.&lt;br /&gt;
* Pfurtscheller, G., Aranibar, A., 1979. Evaluation of event-related desyn- chronization (ERD) preceding and following voluntary self-paced movement. Electroencephalography and Clinical Neurophysiology 46, 138–146.&lt;br /&gt;
* Pfurtscheller, G., Flotzinger, D., Neuper, C., 1994. Differentiation between finger, toe and tongue movement in man based on 40 Hz EEG. Electroencephalography and Clinical Neurophysiology 90, 456–60.&lt;br /&gt;
* Pfurtscheller, G., Lopes da Silva, F. H., 1999. Event-related EEG/MEG synchronization and desynchronization: basic principles. Clinical Neurophysiology 110, 1842–57.&lt;br /&gt;
* Pfurtscheller, G., 1999. Quantification of ERD and ERS in the time domain. In: W Pfurtscheller, G., Lopes da Silva, F. H. (Eds.), Event-related desynchroni- zation. Vol. 6. Elsevier, p. 89–105.&lt;br /&gt;
* Pfurtscheller, G., Neuper, C., 2006. Future prospects of ERD/ERS in the context of brain-computer interface (BCI) developments. Progress in Brain Research 159, 433–437.&lt;br /&gt;
* Pfurtscheller, G., Stancak Jr, A., C., N., 1996a. Post-movement beta synchronization. A correlate of an idling motor area? Electroencephalography and Clinical Neurophysiology 98, 281–93.&lt;br /&gt;
* Pfurtscheller, G., Stancak Jr, A., Neuper, C., 1996b. Event-related synchronization (ERS) in the alpha band—an electrophysiological correlate of cortical idling: a review. International Journal of Psychophysiology 24, 39–46.&lt;br /&gt;
*Tallon-Baudry, C., Bertrand, O., 1999. Oscillatory gamma activity in humans and its role in object representation. Trends Cogn. Sci. 3, 151–62.&lt;br /&gt;
* Tallon-Baudry, C., Bertrand, O., Delpuech, C., Pernier, J., 1996. Stimulus specificity of phase-locked and non-phase-locked 40 Hz visual responses in human. The Journal of Neuroscience 16, 4240–4249.&lt;/div&gt;</summary>
		<author><name>Aduszyk</name></author>
		
	</entry>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=Pracownia_EEG/Potencja%C5%82y_wywo%C5%82ane&amp;diff=8994</id>
		<title>Pracownia EEG/Potencjały wywołane</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=Pracownia_EEG/Potencja%C5%82y_wywo%C5%82ane&amp;diff=8994"/>
		<updated>2022-11-15T12:31:52Z</updated>

		<summary type="html">&lt;p&gt;Aduszyk: /* Analiza */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Pracownia EEG|Pracownia EEG]] / Potencjały wywołane&lt;br /&gt;
&lt;br /&gt;
=Wstęp=&lt;br /&gt;
==Potencjały wywołane==&lt;br /&gt;
=== Wstęp ===&lt;br /&gt;
Potencjały wywołane EEG (ang. ''evoked potentials'', EP) są śladami odpowiedzi mózgu na bodźce. W przypadku MEG poprawnie mówi się o polach wywołanych (ang. ''evoked fields'', EF).&lt;br /&gt;
Zwykle reakcja ta jest mała (wyjątek stanowią [[Elektroencefalografia/Metody_analizy_sygnałów_EEG_-_analiza_w_dziedzinie_czasu |kompleksy K]]) i w zapisie pojedynczej realizacji reakcji na bodziec najczęściej niewidoczna wśród czynności pochodzącej od wielu innych procesów zachodzących w tym samym czasie w mózgu. &lt;br /&gt;
Ich wyodrębnienie z tak zwanego tła EEG/MEG, czyli manifestacji elektrycznej innych, trwających w tym samym czasie w mózgu procesów (aktywny prąd niezależny), wymaga w dniu dzisiejszym zapisu odpowiedzi na szereg powtórzeń tego samego bodźca (&amp;lt;xr id=&amp;quot;fig:EP&amp;quot;&amp;gt;rys. %i&amp;lt;/xr&amp;gt;). Pierwsze potencjały wywołane pokazał pod koniec lat 40-tych Dawson (Dawson 1947) wykonując superpozycję pojedynczych realizacji na kliszy fotograficznej.&lt;br /&gt;
Z czasem skomplikowane urządzenia analogowe zastąpione zostały przez cyfrowe uśrednianie kolejnych fragmentów EEG, zsynchronizowanych według momentu wystąpienia bodźca, łatwo realizowane za pomocą komputera.&lt;br /&gt;
&lt;br /&gt;
[[Grafika:EP.png|thumb|640px|center|&amp;lt;figure id=&amp;quot;fig:EP&amp;quot;&amp;gt;&amp;lt;/figure&amp;gt;&lt;br /&gt;
Uśrednianie potencjałów wywołanych. a) ciągły zapis EEG z wyróżnionymi momentami wystąpienia bodźca (w tym przypadku słuchowego) b) kilkadziesiąt kolejnych odcinków, wyciętych jako sekunda EEG od momentu wystąpienia kolejnych bodźców, ustawione jeden pod drugim c) uśredniony potencjał wywołany &amp;amp;mdash; widać m. in. załamek P300 ok. 300 milisekund po bodźcu]]&lt;br /&gt;
&lt;br /&gt;
Techniki te opierają się na założeniu, że zawarta w EEG odpowiedź mózgu na każdy z kolejnych bodźców jest niezmienna, a EEG odzwierciedlające pozostałe procesy traktowane jest jak nieskorelowany z nią proces stochastyczny. Zależnie od rodzaju potencjałów wywołanych, założenia te są mniej lub bardziej nieuzasadnione; podważa je choćby powszechnie znany efekt habituacji, polegający na osłabieniu późnych potencjałów wywołanych kolejnymi powtórzeniami bodźca.&lt;br /&gt;
&lt;br /&gt;
Istota potencjałów wywołanych jest przedmiotem otwartej dyskusji i dziesiątków prac, dotykających od lat podstawowych w tej dziedzinie pytań: czym jest potencjał wywołany, który widzimy w uśrednionym przebiegu? Czy naprawdę wynika z deterministycznie powtarzanej, jednakowej odpowiedzi pojawiającej się po każdym powtórzeniu bodźca niezależnie od &amp;amp;bdquo;tła&amp;amp;rdquo;, czy może wynika z reorganizacji faz tego właśnie &amp;amp;bdquo;tła&amp;amp;rdquo; EEG, czy może kombinacji tych dwóch efektów? Jest to wspaniałe pole dla zastosowań zaawansowanych metod modelowania i analizy sygnałów. W ostatnich latach powstają dziesiątki prac na ten temat, a od czasu do czasu również krytyczne artykuły wykazujące, że dotychczasowe odkrycia są raczej artefaktami stosowanych metod a nie wynikają z własności analizowanych danych (Yeung et al., 2004). Jak widać jest tu wciąż bardzo wiele do zrobienia, gdyż zrozumienie tego mechanizmu stoi na drodze do &amp;amp;bdquo;świętego Graala&amp;amp;rdquo;, którym w tej dziedzinie jest wyodrębnienie pojedynczych potencjałów wywołanych.&lt;br /&gt;
&lt;br /&gt;
Niezależnie od tego, w neurofizjologii klinicznej nazwą potencjał wywołany określa się krzywą widoczną po uśrednieniu odpowiedzi na kilkanaście do kilku tysięcy bodźców (Szelenberger 2000). Gromadzona od dziesięcioleci wiedza o behawioralnych i klinicznych korelatach potencjałów wywołanych opiera się na rozpoznawaniu w przebiegach uśrednionych tak zwanych załamków, czyli przejściowych wzrostów lub spadków potencjału (na przykład na &amp;lt;xr id=&amp;quot;fig:EP&amp;quot;&amp;gt;rys. %i&amp;lt;/xr&amp;gt; widać załamek P300). Nazwy załamków składają się zwykle z litery &amp;amp;bdquo;P&amp;amp;rdquo; (od ang. ''positive''), jeśli wychylenie jest dodatnie, lub &amp;amp;bdquo;N&amp;amp;rdquo; (od ang. ''negative''), jeśli wychylenie jest ujemne, oraz liczby. Uwaga: &lt;br /&gt;
* Nie ma niestety jednej ustalonej konwencji prezentacji potencjałów koniecznie trzeba więc zwracać uwagę na orientację wykresu, a wykonując wykres samemu - zamieszczać informację o orientacji kierunku dodatniego,gdyż kierunek dodatni może być wykresie skierowany do góry lub do dołu. &lt;br /&gt;
* Liczba następująca po N lub P określa przybliżoną liczbę milisekund od wystąpienia bodźca, czyli tak zwaną latencję. Nie można jednak ścisłego związku między tą liczbą a liczbą milisekund np. potencjał P300 w zależności od szczegółów paradygmatu doświadczalnego może wystąpić znacznie później. np. w eksperymentach językowych zdarza się że P300 występuje później niż N400 :-).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;xr id=&amp;quot;fig:zalamki&amp;quot;&amp;gt;Rys. %i&amp;lt;/xr&amp;gt; przedstawia schematycznie najważniejsze załamki rozpoznawane w potencjałach słuchowych, czyli wywoływanych bodźcem dźwiękowym. Dla potencjałów wzrokowych i somatosensorycznych istnieją podobne klasyfikacje.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Grafika:Zalamki.png|thumb|320px|right|&amp;lt;figure id=&amp;quot;fig:zalamki&amp;quot;&amp;gt;&amp;lt;/figure&amp;gt;&lt;br /&gt;
Orientacyjny schemat załamków rozpoznawanych w słuchowych potencjach wywołanych, na podstawie (Szelenberger 2000). Skala czasu logarytmiczna. Najszybsze (do 12 ms) składowe egzogenne to potencjały pniowe (BAEP), oznaczane jako fale I-VII. Litery &amp;amp;bdquo;P&amp;amp;rdquo; i &amp;amp;bdquo;N&amp;amp;rdquo; oznaczają dodatnie i ujemne wychylenia związane z dalszymi załamkami]]&lt;br /&gt;
&lt;br /&gt;
Najszybsze (czyli o najmniejszej latencji) składowe to potencjały egzogenne, odzwierciedlające wstępne fazy przekazu informacji. W potencjałach słuchowych są to potencjały pnia (ang. ''brainstem auditory evoked potentials'', BAEP), składające się z siedmiu fal występujących pomiędzy 1 a 12 ms od bodźca. Są one generowane np. w nerwie słuchowym czy pniu mózgu, i wykorzystywane w klinicznej diagnostyce integralności dróg słuchowych. Podobnie jak inne wczesne potencjały o latencjach poniżej 100 ms, są praktycznie niezależne od stanu uwagi.&lt;br /&gt;
&lt;br /&gt;
Po potencjałach o średniej latencji (między 12 a 50 ms) zaczynają się późne potencjały słuchowe (od 100 ms od podania bodźca), odzwierciedlające bardziej złożone reakcje na bodziec. Potencjały ok. 100 ms obserwowane w okolicach sensorycznych odzwierciedlają odpowiedź tejże kory na bodziec. Ich amplituda zależy od parametrów fizycznych bodźca oraz od uwagi, np. amplituda załamka N100 wzrasta w stanie skupienia uwagi czy pobudzenia emocjonalnego. Pierwszy i najpopularniejszy całkowicie endogenny załamek to P300, pojawiający się po rozpoznaniu bodźca oczekiwanego, na którym skupiamy uwagę: na przykład, jeśli w serii pojawiających się losowo liter mamy zliczać wystąpienia jednej z nich, to na średniej odpowiedzi na pojawienie się tej litery pojawi się załamek P300. Załamek ten występuje również w odpowiedzi na bodźce wyczekiwane, niespodziewane i ważne dla osoby (np. własne imię). &lt;br /&gt;
&lt;br /&gt;
=== Uśrednianie w dziedzinie czasu ===&lt;br /&gt;
Jak już było wspomniane powyżej podstawową techniką stosowaną do analizy potencjałów wywołanych jest uśrednianie wielu realizacji odpowiedzi na bodziec wyrównanych względem jakiegoś charakterystycznego zdarzenia, np. momentu podania bodźca albo momentu behawioralnej reakcji na bodziec (np. wciśnięcie przycisku). Podejście to bazuje na trzech założeniach:&lt;br /&gt;
* Reakcja jest czasowo związana z bodźcem. Tzn. w kolejnych realizacjach występuje ona zawsze z tym samym opóźnieniem.&lt;br /&gt;
* Reakcja na bodziec skutkuje zawsze pojawieniem się w sygnale składowej o stałym kształcie (mówimy o stałej morfologii).&lt;br /&gt;
* Spontaniczna czynność EEG &amp;amp;mdash; ta która nie dotyczy przetwarzania interesującego nas bodźca &amp;amp;mdash; jest niezależnym, stacjonarnym szumem o średniej zero.&lt;br /&gt;
&lt;br /&gt;
Zgodnie z powyższymi założeniami mierzony w ''i''-tej realizacji sygnał można wyrazić jako:&lt;br /&gt;
: &amp;lt;math&amp;gt;x_i(t) = s(t) + n_i(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
Uśrednianie po ''N'' realizacjach daje:&lt;br /&gt;
: &amp;lt;math&amp;gt;\bar x (t) = \frac{1}{N} \sum_{i=1}^N x_i(t) = \frac{1}{N} \left(N s(t) + \sum_{i=1}^N n_i(t) \right) &amp;lt;/math&amp;gt;&lt;br /&gt;
Wartość oczekiwana średniego sygnału wynosi:&lt;br /&gt;
: &amp;lt;math&amp;gt;\mathrm{E}\left[ \bar x(t) \right] = s(t) &amp;lt;/math&amp;gt;&lt;br /&gt;
gdyż dla szumu o średniej zero mamy:&lt;br /&gt;
: &amp;lt;math&amp;gt;\mathrm{E}\left[\frac{1}{N} \sum_{i=1}^N n_i(t)\right] = 0&amp;lt;/math&amp;gt;.&lt;br /&gt;
Wariancja &amp;lt;math&amp;gt;\bar x(t)&amp;lt;/math&amp;gt; wynosi:&lt;br /&gt;
: &amp;lt;math&amp;gt;\sigma^2_{\bar x(t)} = \mathrm{E} \left[  \left( \frac{1}{N} \sum_{i=1}^N n_i(t)\right)^2 \right] \approx \frac{1}{N} \sigma^2_{n(t)}&amp;lt;/math&amp;gt;&lt;br /&gt;
gdyż &amp;lt;math&amp;gt;s(t)&amp;lt;/math&amp;gt; jest deterministyczne. &lt;br /&gt;
&lt;br /&gt;
Dla potencjałów pojawiających się w pierwszych kilkudziesięciu milisekundach po bodźcu model ten można uznać za poprawny, gdyż wykazują one zależność głównie od parametrów fizycznych bodźca. Dla późniejszych składowych staje się on coraz bardziej wątpliwy ze względu na występujące korelacje ze stanem (np. uwagi) badanego.&lt;br /&gt;
&lt;br /&gt;
Dla późniejszych składowych można by postulować bardziej ogólną wersję modelu potencjału wywołanego:&lt;br /&gt;
: &amp;lt;math&amp;gt;x_i(t) = s_i(t) + n_i(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
Ten model uwidacznia, że do opisu potencjału wywołanego potrzebna jest nie tylko średnia, ale i wyższe momenty rozkładu (np. drugi moment centralny czyli wariancja).&lt;br /&gt;
&lt;br /&gt;
====Wariancja w przypadku szumu skorelowanego ====&lt;br /&gt;
W poprzednim paragrafie pokazaliśmy, że w przypadku niezależnego szumu wariancja uśrednionego sygnału (w danej chwili czasu) maleje jak  &amp;lt;math&amp;gt;\frac{1}{N}&amp;lt;/math&amp;gt;. Jednak w przypadku gdy kolejne próbki szumu są skorelowane (np. występuje silna aktywność rytmiczna alfa) sytuacja się komplikuje. Intuicyjnie łatwo możemy to sobie wyobrazić w granicznym przypadku. Załóżmy, że tło dla  potencjałów o stałej morfologii   stanowi sinusoida. Jeśli będziemy podawać bodźce w odstępach będących wielokrotnością okresu tej sinusoidy to w uśrednianych fragmentach sygnału owa sinusoida jest tak samo powtarzalna jak badany potencjał i uśrednianie nie prowadzi do poprawy stosunku amplitudy sygnału do amplitudy tła. &lt;br /&gt;
&lt;br /&gt;
Stopień zależności pomiędzy próbkami można zmierzyć przy pomocy funkcji autokorelacji. &lt;br /&gt;
Jeśli funkcję autokorelacji przybliżymy przez:&lt;br /&gt;
: &amp;lt;math&amp;gt;R_{xx}(\tau) = \sigma^2 \exp(-\beta |\tau|) \cos(2 \pi f_0 \tau)&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\sigma^2&amp;lt;/math&amp;gt; jest wariancją szumu, &amp;lt;math&amp;gt;f_0&amp;lt;/math&amp;gt; jest średnią częstością aktywności rytmicznej, &amp;lt;math&amp;gt;\beta/ \pi&amp;lt;/math&amp;gt; jest szerokością pasma tej czynności, zaś &amp;lt;math&amp;gt;\tau&amp;lt;/math&amp;gt; opóźnieniem, to wariancję potencjału wywołanego można wyrazić jako&amp;lt;!-- \cite{Spekreijse_1976}--&amp;gt;:&lt;br /&gt;
: &amp;lt;math&amp;gt;\sigma^2_{\bar x(t)} = \frac{\sigma^2}{N} \left[ \frac{1-\exp(-2 \beta T)}{1 - 2 \exp(- \beta T) \cos(2 \pi f_0 T) +\exp(-2 \beta T)} \right]&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; jest odstępem między bodźcami. &lt;br /&gt;
Widać stąd, że obecność czynności rytmicznej w tle wpływa na stosunek sygnału do szumu. Z powyższego równania widać, że stosunek wariancji dąży do &amp;lt;math&amp;gt;\frac{\sigma^2}{N}&amp;lt;/math&amp;gt; gdy &amp;lt;math&amp;gt;\beta T&amp;lt;/math&amp;gt; staje się duże.  &lt;br /&gt;
&lt;br /&gt;
Periodyczna stymulacja może ponadto prowadzić do wzbudzenia czynności rytmicznej o częstości równej częstości pobudzania bądź jej harmonicznej.&lt;br /&gt;
&lt;br /&gt;
===Wariancja latencji===&lt;br /&gt;
&lt;br /&gt;
Jedną z form zmienności potencjału wywołanego w pojedynczych realizacjach jest wariancja latencji. &lt;br /&gt;
[[Grafika:Wariancja_latencji.png|thumb|500px|right|&lt;br /&gt;
Czerwona linia: Uśrednianie 100 potencjałów wywołanych o latncjach z rozkładu normalnego N(300,30 ), Niebieskie linie: przykładowe pojedyncze realizacje wzięte do średniej]]&amp;lt;!--# -*- coding: utf-8 -*-&lt;br /&gt;
from __future__ import division&lt;br /&gt;
import numpy as np&lt;br /&gt;
from matplotlib.pyplot import plot, show ,subplot, figure, title, xlabel, ylabel, ylim&lt;br /&gt;
 &lt;br /&gt;
def fun(t,lat=100):&lt;br /&gt;
    return np.exp(-(t-lat)**2/(2*30**2))&lt;br /&gt;
Fs = 1&lt;br /&gt;
N = 100&lt;br /&gt;
t = np.arange(0,700)&lt;br /&gt;
f = np.zeros((N,700))&lt;br /&gt;
f_sr = np.zeros(t.shape)&lt;br /&gt;
for i in range(N):&lt;br /&gt;
    f[i,:] = fun(t,lat = 300 + 30* np.random.randn())&lt;br /&gt;
for i in range(3):&lt;br /&gt;
    plot(t,f[i,:], 'b')&lt;br /&gt;
plot(t,f.mean(0),'r')&lt;br /&gt;
show()--&amp;gt;&lt;br /&gt;
Zmienność latencji prowadzi do:&lt;br /&gt;
* zmniejszenia amplitudy &amp;lt;math&amp;gt;\bar x&amp;lt;/math&amp;gt;&lt;br /&gt;
* wzrostu rozciągłości czasowej załamka&lt;br /&gt;
&lt;br /&gt;
O tych konsekwencjach zmienności latencji należy w szczególności pamiętać porównując średnie potencjały uzyskane w różnych warunkach eksperymentalnych. Gdy zauważymy, że średnie potencjały różnią się amplitudą należy rozważyć możliwość, że w istocie warunki eksperymentalne wpływają na różnice w wariancji latencji. &lt;br /&gt;
&lt;br /&gt;
Naturalne jest, że zmienność latencji jest bardziej widoczna w przypadku załamków trwających krótko niż w przypadku załamków trwających długo. Wariancja latencji rożnie wraz z jej wartością, stąd wśród późnych składowych potencjałów wywołanych nie obserwuje się komponentów krótkotrwałych.&lt;br /&gt;
&amp;lt;!--====Uśrednianie metodą Woody'ego ====&lt;br /&gt;
&lt;br /&gt;
Model potencjału ze zmienną latencją i sposób na jego efektywniejsze uśrednianie zaproponował Woody (1967). Model ten zakłada, że w każdej realizacji występuje komponent addytywny &amp;lt;math&amp;gt;s_i(t)\;&amp;lt;/math&amp;gt;, który co do kształtu jest stały, a pomiędzy realizacjami różni się tylko latencją:&lt;br /&gt;
: &amp;lt;math&amp;gt; s_i(t) = s(t +\Delta t_i)\;&amp;lt;/math&amp;gt;&lt;br /&gt;
Woody zaproponował aby &amp;lt;math&amp;gt;\Delta t_i\;&amp;lt;/math&amp;gt; szacować na podstawie maksimum funkcji korelacji wzajemnej pomiędzy ''i''-tą realizacją a wzorcem. W pierwszym kroku wzorcem jest średni potencjał uzyskany przez proste uśrednienie realizacji.  Następnie w sposób iteracyjny dokonuje się:&lt;br /&gt;
* poprawek w wyrównaniu poszczególnych realizacji,&lt;br /&gt;
* obliczenia nowego wzorca poprzez uśrednienie realizacji po korekcie wyrównania,&lt;br /&gt;
* obliczenia nowych poprawek do wyrównania realizacji.--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Habituacja ===&lt;br /&gt;
Zmienność w odpowiedziach na kolejno występujące po sobie bodźce można podzielić na komponent stochastyczny i deterministyczny. Komponent deterministyczny odzwierciedla zmianę czułości  układu nerwowego  na kolejne bodźce. Nowy bodziec często wywołuje reakcje pobudzenia widoczną w wielu parametrach takich jak przewodnictwo skóry, rytm serca i reaktywność kory mózgowej. Powszechnie obserwowanym zjawiskiem jest spadek reaktywności na powtarzające się bodźce zwany habituacją. Niekiedy obserwuje się także zjawisko przeciwne &amp;amp;mdash; wzrost reaktywności na bodziec &amp;amp;mdash; zwane sensytyzacją. &lt;br /&gt;
&lt;br /&gt;
Klasycznym sposobem na badanie tych zjawisk w potencjałach wywołanych jest uśrednianie w podzbiorach lub  uśrednianie blokowe. Wymaga ono  zmiany paradygmatu rejestracji danych. Załóżmy, że interesującym nas bodźcem jest błysk światła. Chcemy zaobserwować ewentualne zmiany amplitudy i latencji w ciągu 100 potencjałów będących reakcją na błysk powtarzający się co 500 ms.&lt;br /&gt;
====Uśrednianie w podzbiorach ====&lt;br /&gt;
W metodzie tej musimy założyć, że proces habituacji jest powolny, tzn. zmiany pomiędzy kolejnymi reakcjami są bardzo małe. W takim przypadku możemy podzielić długą serię bodźców na ciąg pod-serii i uśrednienie przeprowadzić dla każdej pod-serii osobno.&lt;br /&gt;
[[Plik:Usrednianie_podzbiory.svg‎|640px|thumb|center|Ilustracja uśredniania w podzbiorach]]&lt;br /&gt;
&lt;br /&gt;
====Uśrednianie blokowe====&lt;br /&gt;
W tym celu eksperyment wykonujemy w wielu seriach. Jedna seria składa się ze 100 błysków powtarzanych co 500 ms.  Po serii następuje przerwa trwająca np. 5 s (długość przerwy wyraża nasze oszacowanie czasu potrzebnego na zanik habituacji). Po przerwie seria jest powtarzana. Powtórzeń serii wykonujemy ''N''.&lt;br /&gt;
Następnie uśredniamy fragmenty sygnałów odpowiadające sobie w kolejnych seriach. &lt;br /&gt;
&lt;br /&gt;
W tym paradygmacie zakładamy, że każda seria rejestrowana jest w tych samych warunkach. Zaniedbujemy efekty związane ze zmęczeniem i zmianami w np. stopniu koncentracji badanego.&lt;br /&gt;
[[Plik:Usrednianie blokowe.svg|Usrednianie blokowe.svg|640px|thumb|center|Ilustracja uśredniania w blokach]]&lt;br /&gt;
&lt;br /&gt;
===Załamki w krzywej potencjału wywołanego vs ukryte komponenty===&lt;br /&gt;
Komponenta potencjału wywołanego to bardzo ważne ale jednocześnie źle określone pojęcie. Krzywa otrzymana w wyniku uśredniania potencjałów wywołanych przedstawia serię załamków dodatnich i ujemnych, ale trzeba być świadomym, że ten przebieg napięcia rejestrowany przez elektrody przedstawia tak naprawdę sumę potencjałów pochodzących od wielu dość niezależnie działających źródeł w mózgu. Przyczynek pochodzący od jednego funkcjonalnego źródła będziemy określać jako komponentę. &lt;br /&gt;
&lt;br /&gt;
Komentarza wymaga też pojęcie źródła funkcjonalnego. Czynność elektryczną synchronicznie działających neuronów piramidalnych w określonym fragmencie kory mózgowej z pewnej odległości można przybliżyć potencjałem dipola prądowego. Taki aktywny fragment kory stanowi źródło dające przyczynek do mierzonego na powierzchni głowy potencjału. W najprostszej sytuacji taki przyczynek może być obserwowany jako komponenta. Mózg jest jednak obiektem niezwykle złożonym i gęsto połączonym. Wiele obszarów korowych może być funkcjonalnie połączonych i aktywowanych synchronicznie w celu realizacji określonego zadania &amp;amp;mdash; o takim funkcjonalnym zespole też możemy myśleć jako o pojedynczym źródle, choć może ono mieć złożoną strukturę przestrzenną. Często zatem myślimy o komponentach ukrytych potencjału wywołanego jako o aktywności takich funkcjonalnych zespołów. &lt;br /&gt;
&lt;br /&gt;
Po tym wstępie widać już chyba, że do zrozumienia co dzieje się w czasie reakcji na bodziec, którą obserwujemy w potencjale wywołanym, bardziej pożądane byłoby badanie komponent ukrytych niż poszczególnych załamków krzywej potencjału wywołanego, która stanowi ważoną sumę owych komponentów. Zanim przejdziemy do omówienia technik służących &amp;amp;bdquo;wyłuskiwaniu&amp;amp;rdquo; komponent prześledźmy kilka symulacji i wnioski z nich płynące.&lt;br /&gt;
&lt;br /&gt;
==== Załamki i komponenty nie są tym samym.====&lt;br /&gt;
Tę samą krzywą można otrzymać na nieskończenie wiele sposobów  przez sumowanie rożnych kombinacji domniemanych komponentów. Przykładowy rysunek pokazuje, jak tę samą krzywą można złożyć z dwóch rożnych zestawów komponentów (kod wytwarzający przykładową symulację pokazany jest poniżej).&lt;br /&gt;
[[Plik:Sumowanie_komponentow1.png|center|thumb|600px| Panel a) przedstawia hipotetyczną krzywą ERP, panel b) jedna z możliwych dekompozycji sygnału w panelu a), panel c) inna możliwa dekompozycja sygnału z panelu a) ]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
from __future__ import division&lt;br /&gt;
import numpy as np&lt;br /&gt;
from matplotlib.pyplot import plot, show ,subplot, figure, title, xlabel, ylabel, ylim&lt;br /&gt;
&lt;br /&gt;
Fs = 1&lt;br /&gt;
t = np.arange(0,700)&lt;br /&gt;
&lt;br /&gt;
C1 = np.exp(-(t-100)**2/(2*30**2))&lt;br /&gt;
C2 = np.exp(-(t-200)**2/(2*50**2))&lt;br /&gt;
C3 = np.exp(-(t-350)**2/(2*100**2))&lt;br /&gt;
ERP = 0.5*C1-C2+C3&lt;br /&gt;
&lt;br /&gt;
C2p = np.concatenate((C2[0:200], np.ones(30), C2[200:700-30] ))&lt;br /&gt;
C3p = ERP - 0.5*C1 + C2p&lt;br /&gt;
ERP_v2 = 0.5*C1-C2p+C3p&lt;br /&gt;
&lt;br /&gt;
subplot(3,1,1)&lt;br /&gt;
plot(t,ERP, t[::10],ERP_v2[::10],'g.')&lt;br /&gt;
ylabel('a)',rotation='horizontal')&lt;br /&gt;
ylim([-1, 1.5])&lt;br /&gt;
&lt;br /&gt;
subplot(3,1,2)&lt;br /&gt;
plot(t,0.5*C1,t,-C2,t,C3)&lt;br /&gt;
ylabel('b)',rotation='horizontal')&lt;br /&gt;
ylim([-1, 1.5])&lt;br /&gt;
&lt;br /&gt;
subplot(3,1,3)&lt;br /&gt;
plot(t,0.5*C1,t,-C2p,t,C3p)&lt;br /&gt;
ylabel('c)',rotation='horizontal')&lt;br /&gt;
ylim([-1, 1.5])&lt;br /&gt;
&lt;br /&gt;
show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Zmiana jednej komponenty może powodować zmiany w amplitudzie i latencji więcej niż jednego załamka.====&lt;br /&gt;
Poniższy rysunek przedstawia sytuację gdy zmiana amplitudy jednego komponentu może znacząco wpływać na amplitudę i latencję innych załamków.&lt;br /&gt;
&lt;br /&gt;
[[Plik:Sumowanie_komponentow2.png|center|thumb|768px| Panel a) przedstawia dwie hipotetyczne krzywe ERP, panel b) panel b i c komponenty z których powstały owe krzywe. Zmiana amplitudy komponentu oznaczonego kolorem powoduje zmianę amplitudy oznaczonych załamków ale także zmianę latencji wcześniejszego załamka. ]]&lt;br /&gt;
Poniżej kod odtwarzający powyższy przykład:&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
from __future__ import division&lt;br /&gt;
import numpy as np&lt;br /&gt;
from matplotlib.pyplot import plot, show, subplot, figure, title, xlabel, ylabel, ylim&lt;br /&gt;
&lt;br /&gt;
Fs = 1&lt;br /&gt;
t = np.arange(0,700)&lt;br /&gt;
&lt;br /&gt;
C1 = np.exp(-(t-100)**2/(2*30**2))&lt;br /&gt;
C2 = np.exp(-(t-200)**2/(2*50**2))&lt;br /&gt;
C3 = np.exp(-(t-350)**2/(2*100**2))&lt;br /&gt;
ERP1 = 0.5*C1-C2+C3&lt;br /&gt;
ERP2 = 0.5*C1-C2+1.5*C3&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
subplot(3,1,1)&lt;br /&gt;
plot(t,ERP1,'b', t,ERP2,'g')&lt;br /&gt;
plot(t[np.argmin(ERP1)],np.min(ERP1),'r.' )&lt;br /&gt;
plot(t[np.argmax(ERP1)],np.max(ERP1),'m.' )&lt;br /&gt;
plot(t[np.argmin(ERP2)],np.min(ERP2),'r.' )&lt;br /&gt;
plot(t[np.argmax(ERP2)],np.max(ERP2),'m.' )&lt;br /&gt;
&lt;br /&gt;
ylabel('a)',rotation='horizontal')&lt;br /&gt;
ylim([-1, 1.6])&lt;br /&gt;
&lt;br /&gt;
subplot(3,1,2)&lt;br /&gt;
plot(t,0.5*C1,'k',t,-C2,'k',t,C3,'b')&lt;br /&gt;
ylabel('b)',rotation='horizontal')&lt;br /&gt;
ylim([-1, 1.6])&lt;br /&gt;
&lt;br /&gt;
subplot(3,1,3)&lt;br /&gt;
plot(t,0.5*C1,'k',t,-C2,'k',t,1.5*C3,'g')&lt;br /&gt;
ylabel('c)',rotation='horizontal')&lt;br /&gt;
ylim([-1, 1.6])&lt;br /&gt;
&lt;br /&gt;
show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Instrukcje do ćwiczeń =&lt;br /&gt;
&lt;br /&gt;
==Zadanie 1: uśrednianie symulowanych sygnałów==&lt;br /&gt;
w tym ćwiczeniu chcemy pokazać efekty:&lt;br /&gt;
# uśredniania sygnałów związanych fazowo z bodźcem i nieskorelowanych z bodźcem / wpływ liczby realizacji,&lt;br /&gt;
# uśredniania sygnałów z fluktuacją latencji,&lt;br /&gt;
# wpływ filtrów o różnych funkcjach odpowiedzi impulsowej na morfologię uśrednionego potencjału.&lt;br /&gt;
&lt;br /&gt;
===Sygnały testowe===&lt;br /&gt;
Proszę zaimplementować funkcje generujące następujące przebiegi czasowe (oznaczenia: ''F&amp;lt;sub&amp;gt;s&amp;lt;/sub&amp;gt;'' &amp;amp;mdash; częstość próbkowania, ''T'' &amp;amp;mdash; czas trwania w sekundach, [[%C4%86wiczenia_1#Sygna.C5.82y_testowe|analogicznie do tego]]):&lt;br /&gt;
* sinusoida o zadanej częstości ''f'' i fazie &amp;lt;math&amp;gt;\phi&amp;lt;/math&amp;gt;: &amp;lt;tt&amp;gt;y = sin(f, phi, Fs, T)&amp;lt;/tt&amp;gt;,&lt;br /&gt;
* funkcja Gaussa o zadanym położeniu i szerokości &amp;lt;tt&amp;gt;y = g_1(t0, sigma, Fs, T) &amp;lt;/tt&amp;gt;&lt;br /&gt;
: &amp;lt;math&amp;gt;g_1(t) = \exp\left(-\frac{(t-t_0)^2}{2 \sigma^2}\right)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* pochodną funkcji Gaussa o zadanym położeniu i szerokości &amp;lt;tt&amp;gt;y = g_2(t0, sigma, Fs, T)&amp;lt;/tt&amp;gt;,&lt;br /&gt;
* połowę funkcji Gaussa o zadanym położeniu i szerokości &amp;lt;tt&amp;gt;y = g_3(t0, sigma, Fs, T)&amp;lt;/tt&amp;gt;,&lt;br /&gt;
: &amp;lt;math&amp;gt;g_{3}(t) = \left\{ &lt;br /&gt;
\begin{array}{lll}&lt;br /&gt;
0 &amp;amp; \mathrm{dla}&amp;amp; t&amp;lt;t_0 \\&lt;br /&gt;
\exp\left(-\frac{(t-t_0)^2}{2 \sigma^2}\right)&amp;amp; \mathrm{dla}&amp;amp; t \ge t_0  &lt;br /&gt;
\end{array}&lt;br /&gt;
\right. &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
W dalszych zadaniach tej sekcji przyjmiemy:&lt;br /&gt;
* ''T'' = 1 s,&lt;br /&gt;
* ''F&amp;lt;sub&amp;gt;s&amp;lt;/sub&amp;gt;'' = 128 Hz,&lt;br /&gt;
* ''t''&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; = 0,3 s,&lt;br /&gt;
* &amp;amp;sigma; = 0,02 s.&lt;br /&gt;
&lt;br /&gt;
===Uśrednianie w modelu addytywnym: sygnał + szum===&lt;br /&gt;
Dla funkcji &amp;lt;math&amp;gt;g_1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;g_2&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;g_3&amp;lt;/math&amp;gt;  wykonaj ''N'' symulacji sygnału opisanego daną funkcją z dodanym szumem gaussowskim (&amp;lt;tt&amp;gt;numpy.random.randn&amp;lt;/tt&amp;gt;). Zaobserwuj zmianę wariancji uśrednianego sygnału wraz z ''N''.&lt;br /&gt;
&lt;br /&gt;
===Uśrednianie w modelu addytywnym: sygnał + szum + niezależna czynność rytmiczna===&lt;br /&gt;
Powtórz poprzednie symulacje dokładając w każdej realizacji sinusoidę o losowo wybranej fazie. Symulacje wykonaj dla różnych częstości sinusoidy, takich których połówka okresu zbliżona jest do szerokości funkcji Gaussa, oraz znacząco od niej różnych.&lt;br /&gt;
&lt;br /&gt;
===Uśrednianie w modelu z resetem fazy===&lt;br /&gt;
Zbuduj sygnał składający się z dwóch fragmentów sinusoidy o częstości ''f'': &lt;br /&gt;
* pierwszy fragment ma losową fazę,&lt;br /&gt;
* drugi fragment ma fazę równą 0.&lt;br /&gt;
Wykonaj ''N'' realizacji takiego sygnału, przy czym każda realizacja ma częstość losowaną z rozkładu Gaussa o średniej 10 i pewnej wariancji (czyli &amp;lt;math&amp;gt;f \in \mathrm{N}(10,\sigma)&amp;lt;/math&amp;gt;). &lt;br /&gt;
Uśrednij otrzymane realizacje. Zaobserwuj zależność średniej od liczby uśrednianych realizacji i od wariancji częstości.&lt;br /&gt;
&lt;br /&gt;
===Uśrednianie potencjału z fluktuacją latencji===&lt;br /&gt;
Wygeneruj sygnały składające się z funkcji &amp;lt;math&amp;gt;g_1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;g_2&amp;lt;/math&amp;gt; albo &amp;lt;math&amp;gt;g_3&amp;lt;/math&amp;gt; z fluktuującą latencją, tzn. z wartością &amp;lt;math&amp;gt;t_0&amp;lt;/math&amp;gt; pochodzącą z jakiegoś rozkładu prawdopodobieństwa. U nas dla ustalenia uwagi niech będzie to rozkład Gaussa. Wykonaj zestaw symulacji obrazujący zależność od liczby realizacji i od wielkości fluktuacji, mierzonej przez wariancję rozkładu. Czy jest związek pomiędzy wariancją fluktuacji &amp;lt;math&amp;gt;t_0&amp;lt;/math&amp;gt; a szerokością załamków?&lt;br /&gt;
&lt;br /&gt;
===Wpływ filtrów===&lt;br /&gt;
# Zaprojektuj następujące filtry (przyjmij częstość próbkowania 128 Hz):&lt;br /&gt;
#* dolnoprzepustowy: Butterwortha z częstością odcięcia: 30, 40, 50 Hz, i rzędach od 1 do 5 (funkcja butter w module scipy.signal),&lt;br /&gt;
#* górnoprzepustowy: Butterwortha z częstością odcięcia: 0,1, 0,5, 2 i 5 Hz, i rzędach od 1 do 5,&lt;br /&gt;
#* notch: Czybyszewa II rodzaju z pasmem zaporowym ustawionym na 50 Hz, i rzędach od 1 do 3 (funkcja cheby2),&lt;br /&gt;
# Zbadaj funkcję odpowiedzi impulsowej i funkcję przenoszenia tych filtrów (w skali dB). Zaobserwuj jak długa jest odpowiedź impulsowa i jak daleko od częstości odcięcia zaburzone jest pasmo przenoszenia.&lt;br /&gt;
# Zastosuj powyższe filtry do funkcji &amp;lt;math&amp;gt;g_1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;g_2&amp;lt;/math&amp;gt; albo &amp;lt;math&amp;gt;g_3&amp;lt;/math&amp;gt;. Filtrowanie przeprowadź w jedną (lfilter) oraz w dwie strony (filtfilt). Zaobserwuj związek między zniekształceniem wprowadzanym przez filtr a funkcją odpowiedzi impulsowej filtru.&lt;br /&gt;
# W ćwiczeniu tym posłuż się symulowanymi sygnałami uzyskanymi z modelu addytywnego: &amp;amp;bdquo;sygnał+szum&amp;amp;rdquo;. Dla funkcji &amp;lt;math&amp;gt;g_1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;g_2&amp;lt;/math&amp;gt; albo &amp;lt;math&amp;gt;g_3&amp;lt;/math&amp;gt;  wykonaj ''N'' = 60 realizacji sygnału opisanego daną funkcją z dodanym szumem gaussowskim (&amp;lt;tt&amp;gt;numpy.random.randn&amp;lt;/tt&amp;gt;). Każdą z realizacji przefiltruj, a następnie uśrednij uzyskane sygnały.&lt;br /&gt;
&lt;br /&gt;
==Zadanie 2: rejestracje i analiza potencjałów wzrokowych==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- ===Synchronizacja występowania bodźców z sygnałem EEG===&lt;br /&gt;
&lt;br /&gt;
Rejestracja potencjałów wywołanych jest przykładem pomiaru czynności elektrycznej mózgu w odpowiedzi na określony bodziec. W przypadku tego rodzaju pomiarów konieczna jest synchronizacja momentu wystąpienia bodźca z sygnałem EEG. Wzmacniacze do pomiaru czynności elektrycznej mózgu wyposażone są w specjalne wejścia, na które można podawać sygnał odpowiadający pojawianiu się bodźca. Jak pamiętamy z zeszłego semestru, wejście to (jak i podawany na nie sygnał) nazywamy trigerem (ang. ''trigger'' &amp;amp;mdash; spust, cyngiel, wyzwalacz). W najprostszym przypadku, bodziec moglibyśmy wyświetlać na monitorze komputerowym, a sygnał związany z jego wystąpieniem wysyłać przez któryś z portów komputera (LPT, COM) na wzmacniacz EEG. Niestety, obecnie dostępne i popularne systemy operacyjne, takie jak Windows czy Linux nie są systemami czasu rzeczywistego (http://pl.wikipedia.org/wiki/System_operacyjny_czasu_rzeczywistego). Od momentu wyświetlania bodźca na ekranie, do pojawiania się sygnału odpowiednim porcie komputerowym może upłynąć kilkadziesiąt milisekund i co gorsza czas ten zwykle jest losowy. W przypadku gdy wzmacniacz próbkuje sygnał z częstością 1000 Hz, moment wystąpienia bodźca możemy określić z dokładnością 1 ms, jednakże wspomniane opóźnienia w systemie operacyjnym uniemożliwiają to. Ponadto, jak dowiedzieliśmy się w rozdziale wstępnym [http://brain.fuw.edu.pl/edu-wiki/action/edit/EEG:Potencja%C5%82y_wywo%C5%82ane?section=T-1], pierwsze załamki związane z potencjałami wywołanymi pojawiają się już 10 ms po wystąpieniu bodźca. W związku z tym, losowe, rzędu kilkudziesięciu milisekund opóźnienia sygnału określającego moment pojawienia się bodźca względem jego rzeczywistego wystąpienia są niedopuszczalne.&lt;br /&gt;
Istnieją pewne techniki programowania, dzięki którym opisywane opóźnienia można zmniejszyć, jednakże są one bardzo trudne  do realizacji. Ponadto, standardowe porty komputera, takie jak LPT, czy COM zostały zaprojektowane przede wszystkim do sterowania urządzeniami zewnętrznymi, a nie ich zasilania. Przykładowo, jedna linia portu drukarkowego (LPT) może być obciążona prądem nie większym niż 5 mA, podczas gdy do zapalenie zwykłej diody LED potrzeba około 10 mA. Taki pobór prądu możliwy jest do uzyskania z portu USB, jednakże  jest on  wyjątkowo trudny do oprogramowania.  &lt;br /&gt;
W celu ominięcia powyższych niedogodności w Zakładzie Fizyki Biomedycznej UW w przeprowadzanych eksperymentach wykorzystywane są  mikrokontrolery [http://pl.wikipedia.org/wiki/Mikrokontroler], w szczególności ATmega16 i ATmega32.  Mikrokontrolery te wyposażone są w procesory o architekturze RISC [http://pl.wikipedia.org/wiki/RISC] i mocy obliczeniowej porównywalnej z szeroko stosowanym kiedyś w komputerach ZX Spectrum, Commodore, Amiga i Atari procesorem Z80. Oprócz jednostki centralnej mikrokontrolery zawierają   stałą pamięć FLASH przeznaczoną do przechowywania kodu programu, pamięć  RAM i pamięć EEPROM, liczniki 8- i 16-bitowe, komparatory, przetworniki analogowo-cyfrowe, porty wejścia/wyjścia, łącze RS232 (popularnie nazywane portem szeregowym) i układy przerwań.&lt;br /&gt;
&lt;br /&gt;
Mikrokontrolery wchodzące w skład zestawów pomiarowych na Pracowni EEG zawierają program, który umożliwia komunikację z nimi poprzez port szeregowy. Obecnie, komputery są coraz rzadziej wyposażane w porty szeregowe. Standard komunikacji RS-232, opracowany w 1962 roku  nadal jest jednak popularny i często wykorzystywany do komunikacji miedzy urządzeniami.  W celu połączenia komputera posiadającego tylko porty USB z mikrokontrolerem zastosowano przejściówkę USB/RS-232. &lt;br /&gt;
&lt;br /&gt;
Jak każde urządzenie w systemie Linuks, przejściówka USB/RS-232 widoczna jest jako plik, znajdujący się w katalogu &amp;lt;tt&amp;gt;/dev&amp;lt;/tt&amp;gt;. Nazwy plików obsługujących urządzenia szeregowe to &amp;lt;tt&amp;gt;ttyXY&amp;lt;/tt&amp;gt;, gdzie &amp;lt;tt&amp;gt;XY&amp;lt;/tt&amp;gt; to kolejny numer przydzielony do urządzenia szeregowego.&lt;br /&gt;
Do komunikacji komputera z mikroknotrolerem  w Zakładzie Fizyki Biomedycznej UW została napisana prosta biblioteka.  Jej użycie jest następujące:&lt;br /&gt;
* Po podłączeniu przejściówki USB/RS232 do komputera mikrokontrolera sprawdź jaki plik w katalogu &amp;lt;tt&amp;gt;/dev&amp;lt;/tt&amp;gt; został utworzony i przydzielony do urządzenia. &lt;br /&gt;
* Zaimportuj bibliotekę do komunikacji z mikrokontrolerem: &lt;br /&gt;
: &amp;lt;tt&amp;gt;import SerialPort as SP&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Otwórz plik powiązany z urządzeniem zewnętrznym:&lt;br /&gt;
: &amp;lt;tt&amp;gt;sp = SP.SerialPort(nazwa_pliku) &amp;lt;/tt&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
: &amp;lt;tt&amp;gt;sp.open()&amp;lt;/tt&amp;gt;&lt;br /&gt;
W naszym przypadku prawidłowa nazwa pliku to &amp;lt;tt&amp;gt;/dev/ttyUSB0&amp;lt;/tt&amp;gt;.&lt;br /&gt;
* Po włączeniu zasilania mikrokontrolera, diody podłączone do niego i wykorzystywane w eksperymencie z potencjałami wywołanymi będą zapalone. Następujące polecenie zgasi obydwie diody:&lt;br /&gt;
: &amp;lt;tt&amp;gt;sp.blinkP300([0, 0])&amp;lt;/tt&amp;gt;&lt;br /&gt;
* Wydanie poniższego polecenia spowoduje, iż mikrokontroler zapali podłączoną do niego diodę numer 1 na czas 100 ms, zaś diodę numer 2 na 200 ms. Jednocześnie, w momencie włączenia jak i wyłączenia diody, sygnał z mikrokontrolera zostanie wysłany na 5-stykowe wejście AUX mikrokontrolera:&lt;br /&gt;
: &amp;lt;tt&amp;gt;sp.blinkP300([100, 200])&amp;lt;/tt&amp;gt;&lt;br /&gt;
* Jeśli chcemy zapalić tylko diodę numer dwa, np. na czas 500 ms w programie podajemy następującą instrukcję:&lt;br /&gt;
: &amp;lt;tt&amp;gt;sp.blinkP300([0, 500])&amp;lt;/tt&amp;gt;&lt;br /&gt;
* Jeśli chcemy zakończyć komunikację z mikrokontrolerem piszemy:&lt;br /&gt;
: &amp;lt;tt&amp;gt;sp.close()&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Kod biblioteki do komunikacji z mikrokontrolerem:&amp;lt;br&amp;gt;&lt;br /&gt;
--&amp;gt;&amp;lt;!--  Kod w Pythonie 2&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# -*- coding: cp1250 -*-&lt;br /&gt;
import serial&lt;br /&gt;
import logging&lt;br /&gt;
import sys&lt;br /&gt;
import os&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def to_hex_word(a):&lt;br /&gt;
    '''encodes a decimal number hexadecimally on two bytes'''&lt;br /&gt;
    return chr(a%256) + chr(a/256)&lt;br /&gt;
&lt;br /&gt;
class SerialPort(object):&lt;br /&gt;
    def __init__(self, port_name):&lt;br /&gt;
        import serial&lt;br /&gt;
        try:&lt;br /&gt;
            self.port = serial.Serial(&lt;br /&gt;
                port=port_name,&lt;br /&gt;
                baudrate=9600,&lt;br /&gt;
                bytesize=serial.EIGHTBITS,&lt;br /&gt;
                parity=serial.PARITY_NONE,&lt;br /&gt;
                stopbits=serial.STOPBITS_ONE,&lt;br /&gt;
                xonxoff=False&lt;br /&gt;
                )&lt;br /&gt;
        except serial.SerialException as e:&lt;br /&gt;
            print(&amp;quot;Nieprawidłowa nazwa portu lub port zajęty.&amp;quot;)&lt;br /&gt;
            raise e&lt;br /&gt;
        self.close()&lt;br /&gt;
        &lt;br /&gt;
    def open(self):&lt;br /&gt;
        self.port.open()&lt;br /&gt;
&lt;br /&gt;
    def close(self):&lt;br /&gt;
        self.port.close()&lt;br /&gt;
&lt;br /&gt;
    def send(self, value):&lt;br /&gt;
        self.port.write(value)&lt;br /&gt;
                           &lt;br /&gt;
    def blinkSSVEP(self,d, p1, p2):&lt;br /&gt;
        '''&lt;br /&gt;
        d = list of frequencies;&lt;br /&gt;
        p1:p2 = ratio LED_on_time/LED_off_time&lt;br /&gt;
        if you want i-th LED to be OFF all the time send  d[i] = 0&lt;br /&gt;
        if you want i-th LED to be ON all the time send  d[i] = -1&lt;br /&gt;
        in these two cases p1 and p2 do not matter&lt;br /&gt;
        '''&lt;br /&gt;
        clock  = 62500&lt;br /&gt;
        factor = float(p1) / float(p1 + p2)&lt;br /&gt;
    &lt;br /&gt;
        str = chr(3) # 'SSVEP_RUN'&lt;br /&gt;
&lt;br /&gt;
        for i in range(len(d)):&lt;br /&gt;
            # i-th LED OFF&lt;br /&gt;
            if d[i] == 0:                       &lt;br /&gt;
                str += to_hex_word(0) + to_hex_word(255) &lt;br /&gt;
            # i-th LED ON&lt;br /&gt;
            elif d[i] == -1:&lt;br /&gt;
                str += to_hex_word(255) + to_hex_word(0)&lt;br /&gt;
                #str = 'S'&lt;br /&gt;
                # i-th LED blinks d[i] times per second&lt;br /&gt;
                # p1:p2 = on_time:off_time in one blink&lt;br /&gt;
            else:&lt;br /&gt;
                period = clock/d[i]&lt;br /&gt;
                bright = int((clock/d[i]) * factor)&lt;br /&gt;
                dark = period - bright&lt;br /&gt;
                str += to_hex_word(bright) + to_hex_word(dark)&lt;br /&gt;
&lt;br /&gt;
        self.send(str)&lt;br /&gt;
&lt;br /&gt;
    def blinkP300(self,d):&lt;br /&gt;
        clock  = 62500&lt;br /&gt;
        str = chr(4) # 'P300_RUN'&lt;br /&gt;
&lt;br /&gt;
        for i in range(len(d)):&lt;br /&gt;
            period = int(clock*d[i]/1000.0)&lt;br /&gt;
            str += to_hex_word(period)&lt;br /&gt;
            print(period)&lt;br /&gt;
&lt;br /&gt;
        self.send(str)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
--&amp;gt;&amp;lt;!-- Kod w Pythonie 3 --&amp;gt;&amp;lt;!-- &amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# -*- coding: cp1250 -*-&lt;br /&gt;
import serial&lt;br /&gt;
import logging&lt;br /&gt;
import sys&lt;br /&gt;
import os&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
def to_hex_word(a):&lt;br /&gt;
    '''encodes a decimal number hexadecimally on two bytes'''&lt;br /&gt;
    return a.to_bytes(2,byteorder=sys.byteorder)&lt;br /&gt;
 &lt;br /&gt;
class SerialPort(object):&lt;br /&gt;
    def __init__(self, port_name):&lt;br /&gt;
        import serial&lt;br /&gt;
        try:&lt;br /&gt;
            self.port = serial.Serial(&lt;br /&gt;
                port=port_name,&lt;br /&gt;
                baudrate=9600,&lt;br /&gt;
                bytesize=serial.EIGHTBITS,&lt;br /&gt;
                parity=serial.PARITY_NONE,&lt;br /&gt;
                stopbits=serial.STOPBITS_ONE,&lt;br /&gt;
                xonxoff=False&lt;br /&gt;
                )&lt;br /&gt;
        except serial.SerialException as e:&lt;br /&gt;
            print(&amp;quot;Nieprawidłowa nazwa portu lub port zajęty.&amp;quot;)&lt;br /&gt;
            raise e&lt;br /&gt;
        self.close()&lt;br /&gt;
 &lt;br /&gt;
    def open(self):&lt;br /&gt;
        self.port.open()&lt;br /&gt;
 &lt;br /&gt;
    def close(self):&lt;br /&gt;
        self.port.close()&lt;br /&gt;
 &lt;br /&gt;
    def send(self, value):&lt;br /&gt;
        self.port.write(value)&lt;br /&gt;
 &lt;br /&gt;
    def blinkSSVEP(self,d, p1, p2):&lt;br /&gt;
        '''&lt;br /&gt;
        d = list of frequencies;&lt;br /&gt;
        p1:p2 = ratio LED_on_time/LED_off_time&lt;br /&gt;
        if you want i-th LED to be OFF all the time send  d[i] = 0&lt;br /&gt;
        if you want i-th LED to be ON all the time send  d[i] = -1&lt;br /&gt;
        in these two cases p1 and p2 do not matter&lt;br /&gt;
        '''&lt;br /&gt;
        clock  = 62500&lt;br /&gt;
        factor = float(p1) / float(p1 + p2)&lt;br /&gt;
 &lt;br /&gt;
        str = (3).to_bytes(1,byteorder=sys.byteorder) # 'SSVEP_RUN'&lt;br /&gt;
 &lt;br /&gt;
        for i in range(len(d)):&lt;br /&gt;
            # i-th LED OFF&lt;br /&gt;
            if d[i] == 0:                       &lt;br /&gt;
                str += to_hex_word(0) + to_hex_word(255) &lt;br /&gt;
            # i-th LED ON&lt;br /&gt;
            elif d[i] == -1:&lt;br /&gt;
                str += to_hex_word(255) + to_hex_word(0)&lt;br /&gt;
                #str = 'S'&lt;br /&gt;
                # i-th LED blinks d[i] times per second&lt;br /&gt;
                # p1:p2 = on_time:off_time in one blink&lt;br /&gt;
            else:&lt;br /&gt;
                period = clock/d[i]&lt;br /&gt;
                bright = int((clock/d[i]) * factor)&lt;br /&gt;
                dark = int(period - bright)&lt;br /&gt;
                str += to_hex_word(bright) + to_hex_word(dark)&lt;br /&gt;
 &lt;br /&gt;
        self.send(str)&lt;br /&gt;
 &lt;br /&gt;
    def blinkP300(self,d):&lt;br /&gt;
        clock  = 62500&lt;br /&gt;
        str = (4).to_bytes(1,byteorder=sys.byteorder) # 'P300_RUN'&lt;br /&gt;
 &lt;br /&gt;
        for i in range(len(d)):&lt;br /&gt;
            period = int(clock*d[i]/1000.0)&lt;br /&gt;
            str += to_hex_word(period)&lt;br /&gt;
 &lt;br /&gt;
        self.send(str)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
--&amp;gt;&amp;lt;!--&lt;br /&gt;
&lt;br /&gt;
===Zestaw eksperymentalny===&lt;br /&gt;
Zestaw składa się ze:&lt;br /&gt;
* wzmacniacza,&lt;br /&gt;
* stymulatora   &lt;br /&gt;
--&amp;gt;&amp;lt;!--* izolowanego galwanicznie układu generującego impulsy odpowiadające gaszeniu i zapalaniu diody,  o wartościach dopasowanych do akceptowalnych przez wejścia AUX wzmacniacza,--&amp;gt;&amp;lt;!--&lt;br /&gt;
* komputera: w tym eksperymencie komputer będzie służył do zaprogramowania stymulatora i do rejestracji sygnałów.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
===Eksperyment 1. Obserwacja bodźca wzrokowego  ===&lt;br /&gt;
&amp;lt;!--Proszę zapoznać się ze standardami rejestracji wzrokowych potencjałów wywołanych [http://www.gcu.ac.uk/media/gcalwebv2/theuniversity/academicschools/sls/psytimetables/SLS%20-%20VEP_Standard_2010.pdf] --&amp;gt;&lt;br /&gt;
Proszę zapoznać się z typowym wyglądem załamków w przypadku potencjałów wzrokowych, jaki jest przedstawiony na [https://link.springer.com/article/10.1007/s10633-009-9195-4/figures/2 rysunku] (cały artykuł jest dostępny [http://link.springer.com/article/10.1007%2Fs10633-009-9195-4 tu]).&lt;br /&gt;
&amp;lt;!--[[Plik:Fig 4 VEP.jpg|thumb|320px|right|&amp;lt;figure id=&amp;quot;fig:zalamki_VEP&amp;quot;&amp;gt;&amp;lt;/figure&amp;gt;&lt;br /&gt;
&amp;lt;xr id=&amp;quot;fig:zalamki_VEP&amp;quot;&amp;gt;Rys. %i.&amp;lt;/xr&amp;gt; Schemat załamków rozpoznawanych we wzrokowych potencjach wywołanych (z pracy: J. V. Odom i in. &amp;amp;bdquo;ISCEV standard for clinical visual evoked potentials&lt;br /&gt;
(2009 update)&amp;amp;rdquo;, Doc Ophthalmol (2010), 120:111–119).]]&lt;br /&gt;
--&amp;gt; &lt;br /&gt;
&lt;br /&gt;
==== Rejestracja ====&lt;br /&gt;
* Paradygmat: z odległości około 40 cm badany obserwuje wyświetalny na ekranie biały kwadrat. Bodźce trwają 300 ms i  powtarzają się co 0,5 sekundy. Bodziec poprzedza punkt fiksacji pokazywany przez 300 ms. Natężenie bodźca ma przyjąć jedną z 4 wartości (manipulujemy jego przeźroczystością: 1, 0,7, 0,3 i 0,1, gdzie 1 oznacza brak przeźroczystości). Każda z intensywności bodźca ma pojawić się 100 razy podczas badania, bodźce podawane mają być w sposób losowy. Zadanie poprzedza krótka instrukcja, a kończy podziękowanie. &lt;br /&gt;
&lt;br /&gt;
* Pomiar&lt;br /&gt;
**Zakładamy czepek i elektrody w systemie 10-20, dbamy o to by opory pomiędzy elektrodami były poniżej 10 k&amp;amp;Omega; i różnice pomiędzy oporami różnych elektrod nie przekraczały 20%. [[Plik:Glowka10-20 ERPy.svg|thumb|600px|right]]&lt;br /&gt;
** Elektrodę GND mocujemy w otworze czepka odpowiadającym pozycji AFz (na linii centralnej 10% w stronę nosa od elektrody Fz) &lt;br /&gt;
** Montujemy także elektrody M1 i M2 i FCz.&lt;br /&gt;
&lt;br /&gt;
==== Analiza ====&lt;br /&gt;
# W sygnale wyszukujemy wzrokowo odcinki z artefaktami i oznaczamy je tagami w SVAROGu.&lt;br /&gt;
# Filtrujemy sygnał w paśmie 1-20 Hz.&lt;br /&gt;
# Z ciągłego zapisu wycinamy fragmenty od &amp;amp;minus;300 ms do +800 ms (zero oznacza moment wystąpienia bodźca). W czasie wycinania badamy wycinane fragmenty pod względem zakresu amplitudy (wszystkie kanały powinny mieć amplitudę w granicach &amp;amp;plusmn;75 &amp;amp;mu;V) i zawartości artefaktów od mrugania (w tym celu trzeba oglądając sygnał w SVAROG-u ustalić próg na amplitudę sygnału w kanałach Fp1 i Fp2).&lt;br /&gt;
# W przypadku, gdy dane są zanieczyszczone wieloma mrugnięciami (zwłaszcza tylnych okolicach), należy skorzystać z metody ICA w SVAROGU, informacje tutaj: [https://brain.fuw.edu.pl/edu/index.php/Pracownia_EEG/EEG_spoczynkowe#ICA_.28.C4.87wiczenie_dodatkowe.29])&lt;br /&gt;
# Porównujemy zestawy danych otrzymane po wzrokowym i automatycznym (metodą opisaną powyżej) usunięciu artefaktów.&lt;br /&gt;
# Uśredniamy wycięte sygnały.&lt;br /&gt;
# Rysujemy średni potencjał we wszystkich kanałach.&lt;br /&gt;
# Pierwszy sposób analizy: Identyfikujemy załamki P1 i N2. Mierzymy amplitudę P1 jako różnicę między ekstremalną wartością załamka P1 a ekstremalną wartością załamka N2. &lt;br /&gt;
# Drugi sposób analizy: Identyfikujemy załamki P1 i N2. Mierzymy amplitudę P1 w stosunku do zera. &lt;br /&gt;
# Porównujemy uzyskane amplitudy w 4 warunkach za pomocą odpowiedniego testu statystycznego (porównanie warunków ze skrajnymi wartościami amplitudy) &amp;amp;mdash; zastosuj test permutacyjny (opisany poniżej) lub test t-Studenta/nieparametryczny odpowiednik). &lt;br /&gt;
&lt;br /&gt;
**Opis testu permutacyjnego &lt;br /&gt;
Pytanie: Czy intensywność bodźca wpływa na amplitudę potencjału P1?&lt;br /&gt;
Jak stwierdzić czy amplitudy załamków P1 istotnie różnią się pomiędzy seriami?&lt;br /&gt;
&lt;br /&gt;
Musimy przeprowadzić test statystyczny. Możemy skonstruować go np. tak:&lt;br /&gt;
Mamy dwa warunki I i II. Jako statystykę przyjmiemy różnicę pomiędzy amplitudą załamka zmierzoną w serii z dwoma diodami (P2&amp;lt;sub&amp;gt;II&amp;lt;/sub&amp;gt;) a amplitudą zmierzoną w serii z jedną diodą (P2&amp;lt;sub&amp;gt;I&amp;lt;/sub&amp;gt;):&lt;br /&gt;
: ''S'' = P2&amp;lt;sub&amp;gt;II&amp;lt;/sub&amp;gt; &amp;amp;minus; P2&amp;lt;sub&amp;gt;I&amp;lt;/sub&amp;gt;&lt;br /&gt;
Postawmy hipotezę zerową, że nie ma różnicy w amplitudzie pomiędzy warunkiem II a I oraz hipotezę alternatywną, że różnica taka występuje.&lt;br /&gt;
: H&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;: ''S'' = 0&lt;br /&gt;
: H&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;: ''S'' &amp;amp;ne; 0&lt;br /&gt;
Zgodnie z H&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; dla wartości ''S'' nie ma różnicy czy realizacja została zarejestrowana w warunkach I czy II, zatem można losowo poprzypisywać numery warunków do realizacji i w ten sposób uzyskać rozkład statystyki ''S'' pod warunkiem prawdziwości H&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;, czyli obliczyć średnie potencjały dla &amp;amp;bdquo;pomieszanych&amp;amp;rdquo; tagów, wyliczyć średnie potencjały dla sztucznie wygenerowaych grup, i wyliczyć różnicę amplitud dla tych średnich, czyli wartość statystyki dla hipotezy H&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Zaimplementuj test permutacyjny zgodny z powyższą koncepcją.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- ===Wersja 2: obserwacja habituacji / uśrednianie w blokach ===&lt;br /&gt;
==== Rejestracja ====&lt;br /&gt;
# Paradygmat: &lt;br /&gt;
#* z odległości około 40 cm badany obserwuje błyski diody. &lt;br /&gt;
#* Błyski powtarzają się co 0,5 sekundy. &lt;br /&gt;
#* Rejestrujemy 60 serii po 15 błysków.  &lt;br /&gt;
#* Pomiędzy seriami badany odpoczywa około 10 sekund.&lt;br /&gt;
# Zakładamy czepek i elektrody w systemie 10-20, dbamy o to by opory pomiędzy elektrodami były poniżej 5 k&amp;amp;Omega; i różnice pomiędzy oporami różnych elektrod nie przekraczały 20%.&lt;br /&gt;
#* Elektrodę GND mocujemy w otworze czepka odpowiadającym pozycji AFz (na linii centralnej 10% w stronę nosa od elektrody Fz) &lt;br /&gt;
#* Montujemy także elektrodę FCz (na linii centralnej pomiędzy Fz a Cz), będziemy jej używać w montażu i w czasie analizy jako referencji.&lt;br /&gt;
#* Częstość próbkowania 512 Hz.&lt;br /&gt;
&lt;br /&gt;
==== Analiza ====&lt;br /&gt;
# Filtrujemy sygnał w paśmie 0,1-20 Hz.&lt;br /&gt;
# Z ciągłego zapisu wycinamy fragmenty od &amp;amp;minus;300 ms do +600 ms (zero oznacza moment wystąpienia bodźca). W czasie wycinania badamy wycinane fragmenty pod względem zakresu amplitudy (wszystkie kanały powinny mieć amplitudę w granicach &amp;amp;plusmn;75 &amp;amp;mu;V) i zawartości artefaktów od mrugania (w tym celu trzeba oglądając sygnał w SVAROG-u ustalić próg na amplitudę sygnału w kanałach Fp1 i Fp2).&lt;br /&gt;
# Uśredniamy wycięte sygnały o tym samym numerze wewnątrz serii.&lt;br /&gt;
# Rysujemy serie 15 uśrednionych potencjałów dla tego kanału, który wykazywał najsilniejszy potencjał w pierwszej wersji eksperymentu. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Eksperyment 2: rejestracja i analiza potencjału P3 ===&lt;br /&gt;
====Rejestracja ====&lt;br /&gt;
# Paradygmat: &lt;br /&gt;
#* z odległości około 40 cm badany obserwuje kwadrat, który występuje w dwóch kolorach. &lt;br /&gt;
#* Bodźce trwają 300 ms, poprzedzane punktem fiksacji wyświetlanym na 300 ms, przerwa między próbami jest losowana i wynosi od 0.8-1.2 s.  &lt;br /&gt;
#* Proporcja wystapień bodźców koloru pierwszego i drugiego wynosi 1:5.   &lt;br /&gt;
#* Zadaniem badanego jest liczenie kwadratów w rzadkim kolorze. &lt;br /&gt;
#* Wykonujemy tyle realizacji aby zarejestrować 100 powtórzeń bodźców rzadkich. &lt;br /&gt;
# Zakładamy czepek i elektrody w systemie 10-20, dbamy o to by opory pomiędzy elektrodami były poniżej 5 k&amp;amp;Omega; i różnice pomiędzy oporami różnych elektrod nie przekraczały 20%.&lt;br /&gt;
#* Elektrodę GND mocujemy w otworze czepka odpowiadającym pozycji AFz (na linii centralnej 10% w stronę nosa od elektrody Fz) &lt;br /&gt;
#* Montujemy także elektrody M1 i M2, będziemy ich używać w montażu i w czasie analizy jako referencji typu połączone uszy.&lt;br /&gt;
#* Częstość próbkowania 512 Hz.&lt;br /&gt;
&lt;br /&gt;
==== Analiza ====&lt;br /&gt;
# Filtrujemy sygnał w paśmie 1-20 Hz.&lt;br /&gt;
# Z ciągłego zapisu wycinamy fragmenty od &amp;amp;minus;300 ms do +900 ms (zero oznacza moment wystąpienia bodźca). W czasie wycinania badamy wycinane fragmenty pod względem zakresu amplitudy (wszystkie kanały powinny mieć amplitudę w granicach &amp;amp;plusmn;75 &amp;amp;mu;V) i zawartości artefaktów od mrugania (w tym celu trzeba oglądając sygnał w SVAROG-u ustalić próg na amplitudę sygnału w kanałach Fp1 i Fp2).&lt;br /&gt;
# Uśredniamy osobno realizacje dla każdego koloru kwadratu. &lt;br /&gt;
# Nakładamy na siebie na rysunkach oba typy średnich.&lt;br /&gt;
# Wyznaczamy amplitudę P3 i liczymy test statystyczny pomiędzy warunkami.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- ==Ćwiczenie dodatkowe: P300 BCI==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wykorzystujemy elektrody z systemu 10-10 umieszczone nad korą wzrokową: P07, O1, O2, PO8, PO3, PO4, Pz, Cz.&lt;br /&gt;
&lt;br /&gt;
Uruchamiamy &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
obci_gui --presets eeg_workshop&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
i z guzika &amp;amp;bdquo;select amplifier&amp;amp;rdquo; wybieramy właściwy wzmacniacz.&lt;br /&gt;
&lt;br /&gt;
Do kontroli jakości sygnału możemy uruchomić Svaroga.&lt;br /&gt;
&lt;br /&gt;
Dane z kalibracji zapisują się w pliku test1 w katalogu domowym użytkownika, z labiryntu w pliku test2.&lt;br /&gt;
&lt;br /&gt;
Po zakończeniu kalibracji pojawia się napis &amp;amp;bdquo;Trwają obliczenia&amp;amp;rdquo; lub podobny. Odczekujemy kilka minut, aż skończy się peer &amp;amp;bdquo;Calibration&amp;amp;rdquo; (widoczny w obci_gui) i zamykamy okienko klawiszami Alt-F4 lub zatrzymując scenariusz guzikiem &amp;amp;bdquo;Stop&amp;amp;rdquo;. W katalogu domowym pojawi się plik z wynikami kalibracji, co pozwala na uruchomienie scenariusza &amp;amp;bdquo;labirynt&amp;amp;rdquo;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Po zebraniu danych, przed wczytaniem ich do Svaroga należy w tym samym katalogu uruchomić skrypt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
#!/usr/bin/env python&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
&lt;br /&gt;
from obci.analysis.obci_signal_processing.tags import tags_file_writer&lt;br /&gt;
from obci.analysis.obci_signal_processing.read_manager import ReadManager&lt;br /&gt;
&lt;br /&gt;
def main(): &lt;br /&gt;
	file_name = 'test1'&lt;br /&gt;
	&lt;br /&gt;
	mgr = ReadManager(&lt;br /&gt;
		file_name + '.obci.xml',&lt;br /&gt;
		file_name + '.obci.raw',&lt;br /&gt;
		file_name + '.obci.tag')&lt;br /&gt;
	&lt;br /&gt;
	tags = mgr.get_tags()&lt;br /&gt;
	for i in xrange(0, len(tags)):&lt;br /&gt;
		if tags[i]['desc']['index'] == tags[i]['desc']['target']:&lt;br /&gt;
			tags[i]['name'] = 'blink_target'&lt;br /&gt;
		else:&lt;br /&gt;
			tags[i]['name'] = 'blink'&lt;br /&gt;
			&lt;br /&gt;
	tags_writer = tags_file_writer.TagsFileWriter(file_name + '.obci.tag')&lt;br /&gt;
	for tag in tags:&lt;br /&gt;
		tags_writer.tag_received(tag)		&lt;br /&gt;
	tags_writer.finish_saving(0)	&lt;br /&gt;
 &lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Zadanie 3. Analiza Heartbeat-Evoked Potential (HEP)== &lt;br /&gt;
&lt;br /&gt;
Celem tego zadania jest zaobserwowanie występowania ERP związanego z działaniem serca (szczegóły można doczytać tutaj: [https://www.sciencedirect.com/science/article/pii/S1053811919303738?via%3Dihub]. W zadaniu tym wykorzystany dane spoczynkowe zebrane podczas pierwszej rejestracji. &lt;br /&gt;
* w pierwszym kroku sygnał montujemy i filtrujemy;&lt;br /&gt;
* następnie zaznaczamy fragmenty sygnału, w których widzimy artefakty;&lt;br /&gt;
* w drugim robimy detekcję załamków R z EKG &amp;amp;mdash; po ich podstawie będziemy cieli sygnał (&amp;amp;minus;200-600 ms po R);&lt;br /&gt;
* następnie uśredniamy otrzymane odcinki.&lt;/div&gt;</summary>
		<author><name>Aduszyk</name></author>
		
	</entry>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=Pracownia_EEG/EEG_spoczynkowe&amp;diff=8987</id>
		<title>Pracownia EEG/EEG spoczynkowe</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=Pracownia_EEG/EEG_spoczynkowe&amp;diff=8987"/>
		<updated>2022-11-08T11:58:39Z</updated>

		<summary type="html">&lt;p&gt;Aduszyk: /* ICA (ćwiczenie dodatkowe) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Pracownia EEG|Pracownia EEG]] / EEG spoczynkowe, artefakty&lt;br /&gt;
&lt;br /&gt;
==Podstawowe grafoelementy zapisu EEG i ich główne cechy==&lt;br /&gt;
&lt;br /&gt;
===Rytm &amp;amp;delta;===&lt;br /&gt;
&lt;br /&gt;
Przebieg rytmu delta zaprezentowano na &amp;lt;xr id=&amp;quot;uid3&amp;quot;&amp;gt; rysunku %i&amp;lt;/xr&amp;gt;. Jest to wysokoamplitudowa aktywność o niskiej częstości (0-4 Hz) i czasie trwania co najmniej 1/4 s. Do celów praktycznych przyjęto, że dolną granicą częstości jest 0,5 Hz. Pojawiające się podczas głębokiego snu fale delta o amplitudzie przekraczającej 75 &amp;amp;mu;V nazywa się falami wolnymi (ang. ''slow wave activity'', SWA). Występowanie SWA spowodowane jest wysoką synchronizacją neuronów kory (większą synchronizację spotyka się tylko podczas ataku epilepsji). Fale delta rejestruje się także podczas głębokiej medytacji, u małych dzieci i w przypadku pewnego rodzaju uszkodzeń mózgu.&lt;br /&gt;
&lt;br /&gt;
[[Plik:SWA.png|center|800px|thumb|&amp;lt;figure id=&amp;quot;uid3&amp;quot; /&amp;gt;Fale delta  w czasie snu w zapisie polisomnograficznym.]]&lt;br /&gt;
&lt;br /&gt;
===Rytm &amp;amp;theta;===&lt;br /&gt;
&lt;br /&gt;
Rytmem teta (ang. ''theta'') (&amp;lt;xr id=&amp;quot;uid9&amp;quot;&amp;gt; rys. %i&amp;lt;/xr&amp;gt;) nazywamy aktywność w paśmie częstości od 3 do 7 Hz i rozpiętości (ang. ''peak-to-peak'') rzędu kilkudziesięciu &amp;amp;mu;V. Charakterystyczne fale teta występują np. w okresie snu płytkiego &amp;amp;mdash; przypuszcza się że w tym czasie następuje przyswajanie i utrwalanie uczonych treści. Fale teta są najczęściej występującymi falami mózgowymi podczas medytacji, transu, hipnozy, intensywnego marzenia, intensywnych emocji. Odmienny rodzaj fal teta jest związany z aktywnością poznawczą, kojarzeniem (w szczególności uwagą), a także procesami pamięciowymi (tzw. rytm FM&amp;amp;Theta; &amp;amp;mdash; ''frontal midline theta''). Jest on obserwowany głównie w przyśrodkowej części przedniej części mózgu.&lt;br /&gt;
&lt;br /&gt;
Cechy charakterystyczne:&lt;br /&gt;
* Rytmiczny przebieg o częstości 3-7 Hz.&lt;br /&gt;
* Najwyższa amplituda w stanie czuwania w okolicach linii środkowej i obszarach skroniowych.&lt;br /&gt;
* Rozkład amplitudy symetryczny na półkulach określonych przez płaszczyznę strzałkową&lt;br /&gt;
Cechy patologiczne:&lt;br /&gt;
* Asymetryczny rozkład amplitudy (dominacja rytmu na jednej półkuli) bądź też jego występowanie w zapisie tylko na jednym odprowadzeniu może świadczyć o patologii.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Plik:Fala pila.png|800px|center|thumb|&amp;lt;figure id=&amp;quot;uid9&amp;quot; /&amp;gt;Przykład rytmu teta we śnie.]]&lt;br /&gt;
&lt;br /&gt;
===Rytm &amp;amp;alpha;===&lt;br /&gt;
&lt;br /&gt;
Fala alfa to jedna z najwcześniej zaobserwowanych struktur (grafoelementów) EEG.&lt;br /&gt;
Reprezentuje ona rytmiczną aktywność kory mózgowej w paśmie 8-12 Hz. Występowanie rytmu alfa przypisuje się stanowi relaksu z zamkniętymi oczami. Fale alfa najlepiej widoczne są w odprowadzeniach potylicznych, czyli z okolic kory odpowiadającej za przetwarzanie informacji wzrokowych. Rytm o częstości w paśmie alfa rejestrowany w okolicach kory motorycznej nazywany jest rytmem mi (ang. ''mu''), ze względu na kształt fali przypominającej literę &amp;amp;mu;. Wykazuje on istotny zanik w momencie wykonywania ruchu przez człowieka lub tylko zamierzenia jego wykonania.&lt;br /&gt;
&lt;br /&gt;
Rytm alfa fundamentalne znaczenie w analizie EEG snu. Mimo, że nie występuje podczas właściwego snu to świadczy o „przedsennym” czuwaniu pacjenta, a jej zanik oznacza przejście ze stanu czuwania do płytkiego snu. Fale alfa zanikają także podczas wysiłku umysłowego, np. wykonywaniu działań matematycznych albo przy otwarciu oczu i zadziałaniu na nie światła. Blokowanie rytmu alfa jest wyrazem desynchronizacji aktywności neuronów, zachodzącej pod wpływem koncentracji umysłowej lub stymulacji narządów zmysłów. Przebieg fali alfa zaprezentowano na &amp;lt;xr id=&amp;quot;uid11_a&amp;quot;&amp;gt; rysunku %i&amp;lt;/xr&amp;gt; i  &amp;lt;xr id=&amp;quot;uid11_b&amp;quot;&amp;gt; rysunku %i&amp;lt;/xr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Plik:Alpha.png|center|800px|thumb|&amp;lt;figure id=&amp;quot;uid11_a&amp;quot; /&amp;gt;Rytm alfa w zapisie polisomnograficznym szczególnie wyraźnie widoczny w odprowadzeniu O2 (referencja do uśrednionego potencjału z uszu).]]&lt;br /&gt;
[[Plik:Alpha_z_widmem.png|center|800px|thumb|&amp;lt;figure id=&amp;quot;uid11_b&amp;quot; /&amp;gt;Rytm alfa w zapisie polisomnograficznym szczególnie wyraźnie widoczny w odprowadzeniu O2 (referencja do uśrednionego potencjału z uszu). We wstawce widoczna jest estymata widma gęstości mocy z zaznaczonego fragmentu sygnału.]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Cechy charakterystyczne:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;li&amp;gt;&lt;br /&gt;
	Podstawowy rytm prawidłowego zapisu EEG u dorosłej osoby.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;li&amp;gt;&lt;br /&gt;
	Quasi harmoniczny przebieg o częstości 7-13 Hz.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;li&amp;gt;&lt;br /&gt;
	Wzrost amplitudy po zamknięciu oczu, w stanie relaksu czy czuwania z zamkniętymi oczami.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;li&amp;gt;&lt;br /&gt;
	Zanika po otwarciu oczu.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;li&amp;gt;&lt;br /&gt;
	Fale alfa najlepiej widoczne są w odprowadzeniach tylnych, czyli z okolic części kory odpowiadającej za przetwarzanie informacji wzrokowych. Czasem jednak może propagować się w kierunku obszarów tylno skroniowych i ciemieniowych.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;li&amp;gt;&lt;br /&gt;
	Występuje mniej lub bardziej symetrycznie względem płaszczyzny strzałkowej, zwykle jednak ma większą amplitudę nad półkulą dominującą.&lt;br /&gt;
Zbyt duża asymetria amplitudy rytmu alfa lub też jego brak po jednej stronie zawsze świadczy o jakiejś patologii. Często jednak przyczyną takiej asymetrii jest niewłaściwe umieszczenie elektrod na głowie bądź budowa anatomiczna czaszki.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
Cechy patologiczne:&lt;br /&gt;
* Częstość rytmu ulega zmniejszeniu pod wpływem takich czynników jak: choroby metaboliczne, wczesne fazy otępienia, leki.&lt;br /&gt;
&lt;br /&gt;
===Rytm &amp;amp;mu;===&lt;br /&gt;
&lt;br /&gt;
Cechy charakterystyczne:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;li&amp;gt;&lt;br /&gt;
	Rytmiczny przebieg o częstości od 7-11 Hz, z uwagi na co często mylony z rytmem alfa.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;li&amp;gt;&lt;br /&gt;
	Wyraźny przebieg, kształtem przypominający grecką literę &amp;amp;mu;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;li&amp;gt;&lt;br /&gt;
	Zanika w trakcie wykonywania ruchu bądź nawet pod wpływem samego jego wyobrażenia.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Rytm &amp;amp;beta;===&lt;br /&gt;
[[Plik:EEG_beta_1.png|768px|thumb|&amp;lt;figure id=&amp;quot;uid28&amp;quot; /&amp;gt;Rytm beta. Na osi pionowej &amp;amp;mdash; amplituda w &amp;amp;mu;V, na osi poziomej &amp;amp;mdash; czas.]]&lt;br /&gt;
Fale beta (&amp;lt;xr id=&amp;quot;uid28&amp;quot;&amp;gt;rys.&amp;lt;/xr&amp;gt;) to niskoamplitudowe oscylacje o częstości w przedziale 13-30 Hz. W paśmie beta wyróżnia się następujące przedziały: wolne fale beta (12-15 Hz), właściwe, średnie pasmo beta (15-18 Hz) i szybkie fale beta, o częstości powyżej 19 Hz. Ta mało zsynchronizowana praca neuronów charakteryzuje zwykłą codzienną aktywność kory mózgowej u człowieka, percepcję zmysłową i pracę umysłową. Specyficzna aktywność beta towarzyszy również stanom po zażyciu niektórych leków. Fale beta zazwyczaj występują w okolicy czołowej. Obrazują one zaangażowanie kory mózgowej w aktywność poznawczą. Fale beta o małej amplitudzie występują podczas koncentracji uwagi, gdy mózg nastawiony jest na świadomy odbiór bodźców zewnętrznych za pomocą wszystkich zmysłów.&lt;br /&gt;
Cechy charakterystyczne:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;li&amp;gt;&lt;br /&gt;
	Rytmiczny przebieg o częstości od 13 do 30 Hz.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;li&amp;gt;&lt;br /&gt;
	Amplituda nie zmienia się pod wpływem otwarcia lub zamknięcia oczu.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;li&amp;gt;&lt;br /&gt;
	Najwyższa amplituda w okolicach czołowo-centralnych.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;li&amp;gt;&lt;br /&gt;
	Asymetryczny zanik rytmu w trakcie wykonywania ruchu lub nawet jego wyobrażenia. Zanik obserwowalny jest w zapisie EEG z elektrod umieszczonych nad obszarami mózgu odpowiedzialnymi za kończynę wykonującą ruch (kontralatralnie czyli po przeciwnej stronie niż kończyna).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!----&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Fale &amp;amp;gamma;===&lt;br /&gt;
[[Plik:EEG_gamma_1.png|768px|thumb|&amp;lt;figure id=&amp;quot;uid30&amp;quot; /&amp;gt;Rytm gamma. Na osi pionowej &amp;amp;mdash; amplituda w &amp;amp;mu;V, na osi poziomej &amp;amp;mdash; czas.]]&lt;br /&gt;
Fale gamma (&amp;lt;xr id=&amp;quot;uid30&amp;quot;&amp;gt; rys.&amp;lt;/xr&amp;gt;) to fale mózgowe o częstości w okolicach 40 Hz (30-80 Hz). Aktywność w paśmie 80-200 Hz określa się natomiast jako wysokoczęstotliwościową (ang. ''high'') gammę. Rytm gamma towarzyszy aktywności ruchowej i funkcjom motorycznym. Fale gamma związane są też z wyższymi procesami poznawczymi, m. in. percepcją sensoryczną, pamięcią. Przypuszcza się, że rytm gamma o częstotliwości około 40 Hz ma związek ze świadomością percepcyjną (dotyczącą wrażeń zmysłowych i ich postrzegania) oraz związany jest z integracją poszczególnych modalności zmysłowych w jeden spostrzegany obiekt. Aktywność high-gamma występuje podczas aktywacji kory mózgowej, zarówno przez bodźce zewnętrzne (np. dotykowe, wzrokowe), jak i wewnętrzne (przygotowanie ruchu, mowa). Fale o częstościach 100-250 Hz nazywane są ''ripples''. Rejestruje się je w sygnale z implantowanych mikroelektrod, a wysoko częstościową aktywność ''fast ripples'' (250-600 Hz) w szczególności u pacjentów z epilepsją, w obszarze ogniska epileptycznego.&lt;br /&gt;
&lt;br /&gt;
===Wrzeciona snu===&lt;br /&gt;
&lt;br /&gt;
Wrzeciona snu (ang. ''sleep spindles'') (&amp;lt;xr id=&amp;quot;uid32&amp;quot;&amp;gt; rys.&amp;lt;/xr&amp;gt;) to charakterystyczne struktury zaobserwowane już niemal od samych początków historii pomiarów EEG. Występują podczas umiarkowanie głębokiego snu. Wrzecionami snu nazywamy aktywność o częstości 11-15 Hz i czasie trwania 0,5-1,5 s. Obwiednia tych krótkich salw dość szybkiej aktywności o niewielkiej amplitudzie przypomina kształt wrzeciona. Wrzeciona pojawiają się we wszystkich odprowadzeniach, z tym, że ich amplituda i częstość może się nieznacznie zmieniać przy przejściu od przodu do tyłu głowy (od wrzecion „wolnych” po „szybkie”). Wrzeciona snu mogą występować w parach z kompleksami K.&lt;br /&gt;
&lt;br /&gt;
[[Plik:Wrzeciona.png|800px|center|thumb|&amp;lt;figure id=&amp;quot;uid32&amp;quot; /&amp;gt;Trzy wrzeciona snu.]]&lt;br /&gt;
&lt;br /&gt;
===Kompleksy K===&lt;br /&gt;
&lt;br /&gt;
Kompleksy K (ang. ''K-complexes'', w Polsce często nazywane zespołami K), (rys. &amp;lt;xr id=&amp;quot;uid32&amp;quot;&amp;gt; %i&amp;lt;/xr&amp;gt;) mogą pojawiać się pojedynczo lub też w serii po dwa podczas umiarkowanie głębokiego snu. Definiuje się je jako dwufazową (ostry spadek poprzedzony dodatnim maksimum), wysokonapięciową (to największe maksimum strefy), nisko częstotliwościową falę związaną z wrzecionami snu, przy czym jej czas trwania powinien przekraczać 0,5 s. Obecnie wymaga się aby struktury te miały częstość 1-4 cykli/s, amplitudę co najmniej dwa razy większą od średniej amplitudy tła i czas trwania 0,5-2 s. Amplituda kompleksu K jest zazwyczaj największa na czubku głowy. Kompleksy K mogą podczas snu występować spontanicznie lub też w odpowiedzi na bodźce.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Plik:2kompleksy.png|800px|center|thumb|&amp;lt;figure id=&amp;quot;uid32&amp;quot; /&amp;gt;Kompleksy K z następującymi po nich wrzecionami snu.]]&lt;br /&gt;
&lt;br /&gt;
===Fale piłokształtne===&lt;br /&gt;
&lt;br /&gt;
Fale piłokształtne (ang. ''sawtooth waves'') pojawiają się w EEG w czasie snu w fazie REM, są to wierzchołkowe, ujemne fale o umiarkowanej częstości i amplitudzie. Z definicji falą piłokształtną nazywa się pojedyncze lub zgrupowane po kilka fale o częstości 6-10 Hz, amplitudzie rzędu kilkudziesięciu &amp;amp;mu;V i wyraźnym kształcie zębów piły.&lt;br /&gt;
&lt;br /&gt;
===Wierzchołkowe fale ostre===&lt;br /&gt;
&lt;br /&gt;
Wierzchołkowe fale ostre (ang. ''vertex sharp waves'') występują pod koniec okresu płytkiego snu. Aktywnością tą określa się ostry potencjał, maksymalny w okolicy wierzchołkowej, ujemny w stosunku do innych pól, o amplitudzie zmiennej, rozpiętości często dochodzącej do 250 &amp;amp;mu;V.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Plik:Wierzcholkowa fala ostra.png|800px|center|thumb|&amp;lt;figure id=&amp;quot;uid32&amp;quot; /&amp;gt;Wierzcholkowa fala ostra.]]&lt;br /&gt;
&lt;br /&gt;
===Iglice===&lt;br /&gt;
&lt;br /&gt;
Iglice (ang. ''spikes''), to termin ograniczony do padaczkopodobnych wyładowań, obserwowanych także w zapisie międzynapadowym EEG. Są to grafoelementy wyraźnie wyróżniające się z czynności podstawowej, z ostrym wierzchołkiem i często następującą po nim falą wolną. Czas trwania iglicy wynosi zazwyczaj od 20 do 70 milisekund, a amplituda co najmniej dwa razy większa o od amplitudy tła w obrębie około 5 sekund.&lt;br /&gt;
&lt;br /&gt;
==Artefakty==&lt;br /&gt;
&lt;br /&gt;
===Niewłaściwie umocowanie elektrod===&lt;br /&gt;
Jednym z bardzo ważnych etapów przed wykonaniem rejestracji czynności elektrycznej mózgu jest umieszczenie na powierzchni głowy elektrod pomiarowych. Elektrody te powinny być rozlokowane zgodnie z wybranym uprzednio standardem (np. 10-20, czy 10-10). Lokalizacja elektrod w badaniu EEG była tematem [[Pracownia_Sygna%C5%82%C3%B3w_Biologicznych/Zajecia_9#Lokalizacja_elektrod_na_powierzchni_g.C5.82owy._System_10-20|IX spotkania na Pracowni Sygnałów Bioelektrycznych]] i nie będzie omawiana już w bieżących materiałach. W tym miejscu zapoznamy się bliżej z konsekwencjami nieprawidłowego umocowania elektrod na głowie badanej osoby. Jak wiemy, poszczególnym obszarom kory mózgowej można przypisać aktywność związaną z określoną czynnością behawioralną, np. w trakcie czuwania z zamkniętymi oczami, w płatach potylicznych powstaje rytmiczna czynność o częstości 7-13 Hz. Z kolei w trakcie planowania bądź wykonywania ruchu zachodzą zmiany w czynności elektrycznej mózgu w obszarach bruzdy Rolanda, nad którą zlokalizowane są miejsca przyłożenia elektrod C3, Cz i C4. Czynność elektryczna mózgu jest bardzo słaba (zwykle wynosi od kliku do kilkudziesięciu &amp;amp;mu;V) i szybko zanika wraz z odległością. Elektroda umieszczona w niewłaściwym miejscu (np. przesunięta o 1 cm względem prawidłowego położenia), nie będzie rejestrować interesującej nas czynności elektrycznej mózgu. Kolejna bardzo istotna kwestia, to przygotowanie skóry w miejscu przyłożenia elektrody. Najbardziej zewnętrzna cześć skóry &amp;amp;mdash; naskórek, jest martwy, zrogowaciały i pokryty tłuszczem. Powoduje to, iż opór elektryczny skóry jest bardzo duży (rzędu M&amp;amp;Omega;) i uniemożliwia rejestrację EEG. Pomiar tego sygnału nie może bowiem odbywać się na drodze &amp;amp;bdquo;radiowej&amp;amp;rdquo;, to jest np. za pomocą elektrody umieszczone w pewnej odległości od powierzchni głowy. Wynika to z warunków brzegowych dla pola elektrycznego na granicy ośrodka przewodzącego i próżni.&lt;br /&gt;
&lt;br /&gt;
Podsumowując, rejestracja sygnału EEG wymaga dobrego kontaktu elektrod ze skórą pacjenta, umożliwiającego przewodzenie prądów elektrycznych, będących wynikiem elektrycznej aktywności mózgu. W szczególności dotyczy to tzw. elektrody GND oraz referencyjnej. Niewłaściwe umocowanie tych elektrod na powierzchni głowy będzie skutkować zakłóceniem pomiaru na wszystkich elektrodach. Odpowiednie schematy połączeń elektrod ze wzmacniaczem EEG znajdują się w [[Elektroencefalografia/Fizyczne_i_techniczne_aspekty_rejestracji_sygnałów_bioelektrycznych#Budowa_elektroencefalografu|skrypcie o EEG]].&lt;br /&gt;
Brak dobrego kontaktu powoduje następujące efekty uboczne:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;	&lt;br /&gt;
&amp;lt;li&amp;gt;	Tłumienie sygnału (patrz wzór na zajęciach z Pracowni Sygnałów Bioelektrycznych).&lt;br /&gt;
&amp;lt;li&amp;gt;	Zakłócanie pomiaru EEG przez pole elektryczne od sieci zasilającej, widoczne w postaci harmonicznego sygnału o częstości 50 Hz i relatywnie wysokiej amplitudzie w porównaniu z amplitudą sygnału EEG.&lt;br /&gt;
&amp;lt;li&amp;gt;	&amp;amp;bdquo;Trzaskanie elektrod&amp;amp;rdquo;. Polega ono na krótkotrwałym braku kontaktu części elektrody ze skórą. Powoduje to nagłą zmianę potencjału, kształtem przypominającego wyładowania iglicowe, które pełnią ważną rolę w diagnostyce padaczki. Cechą odróżniającą skoki potencjału związane z patologią czynności elektrycznej mózgu, a nieszczelnym kontaktem elektrody ze skórą jest fakt, iż wyładowania związane z niewłaściwym umocowaniem elektrody są widoczne na:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;	jednym (uszkodzonym) odprowadzeniu w przypadku odprowadzeń referencyjnych jednobiegunowych;&lt;br /&gt;
&amp;lt;li&amp;gt;	dwóch elektrodach w przypadku odprowadzeń dwubiegunowych.&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Jeśli zmiana kontaktu ze skórą nie ma gwałtownego charakteru, niewłaściwie zamocowana elektroda może być źródłem powstawania zmian potencjału w zakresie pasm EEG, trudno odróżnialnych od prawdziwej czynności elektrycznej. Jedyną cechą różnicującą ten artefakt od sygnału EEG jest fakt jego występowania na pojedynczej elektrodzie, w przypadku odprowadzeń jednobiegunowych i dwóch sąsiednich kanałach, będących lustrzanymi odbiciami w przypadku odprowadzeń dwubiegunowych.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Pocenie się===&lt;br /&gt;
Pocenie się badanej osoby prowadzi do:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;	Rozpuszczania klejów wodozmywalnych, za pomocą których elektrody przyczepiane są do powierzchni głowy. Pogarsza to kontakt elektrody ze skórą.&lt;br /&gt;
&amp;lt;li&amp;gt;	Tworzenie zwarć pomiędzy elektrodami. Pot składający głównie z wody, soli i innych związków chemicznych dobrze przewodzi prąd. W efekcie następuje redukcja impedancji pomiędzy elektrodami i zmiana wartości mierzonego potencjału.&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wymienione powyżej zjawiska prowadzą do powstania w zapisie EEG bardzo wolnych, trwających kilka sekund fal.&lt;br /&gt;
===Mruganie===&lt;br /&gt;
Bardzo silny artefakt, trudny do wyeliminowania z zapisu EEG, mogący się objawić na wszystkich elektrodach, w szczególności zaś widoczny na odprowadzeniach przedczołowych i czołowych. Źródłem tego artefaktu jest występująca pomiędzy rogówką a siatkówką różnica potencjałów (sięgająca wartości kilku miliwotlów) oraz czynność elektryczna siatkówki o amplitudzie kilku mikrowoltów. W trakcie mrugania gałki oczne skręcają nieznacznie ku górze (tzw. zjawisko Bella) powodując nagły wzrost potencjału elektrycznego. Rogówka posiada potencjał dodatni względem siatkówki, w związku z czym na odprowadzeniach przedczołowych i czołowych obserwuje się wychylenie potencjału w kierunku dodatnich wartości względem potencjału na innych elektrodach. Zwiększony potencjał na elektrodach czołowych utrzymuje się tak długo, jak skręcone ku górze pozostają gałki oczne.&lt;br /&gt;
Powrót gałek do pozycji spoczynkowej powoduje redukcję potencjału na przednich elektrodach. Zmiana sygnału związana z artefaktem od gałki ocznej ma zatem charakter &amp;amp;bdquo;schodka&amp;amp;rdquo;, jednakże filtry w które wyposażony jest wzmacniacz EEG powodują rozmycie i wygładzenie tego zaburzenia, które przyjmuje łatwo rozpoznawalny kształt. Artefakt ten jest na tyle silny, iż pomimo losowego występowania, uśrednianie sygnałów EEG mierzonych w trakcie powtarzania tego samego paradygmatu doświadczalnego nie redukuje jego amplitudy w sposób zadowalający. Środkami mogącymi zmniejszyć jego występowanie jest przewidzenie w trakcie eksperymentu przerw na &amp;amp;bdquo;wymruganie&amp;amp;rdquo;, używanie środków nawilżających oczy (najlepiej w postaci żeli, które długo pozostają na gałce), lekkie zmrużenie oczu.&lt;br /&gt;
[[Plik:Artefakt_mrugnięcia.png|center|thumb| 800px|Mrugnięcia]]&lt;br /&gt;
&lt;br /&gt;
===Ruchy gałek ocznych na boki===&lt;br /&gt;
Źródło powstawania tych artefaktów jest takie samo jak w przypadku mrugania. W wyniku różnic potencjałów pomiędzy siatkówką a rogówką, zmiana orientacji gałki ocznej w przestrzeni powoduje zmianę pola elektrycznego i jego potencjału, który mierzymy. W przypadku skręcenia oczami w prawą stronę, nastąpi wzrost mierzonego potencjału na elektrodzie skroniowej prawej &amp;amp;mdash; F8 (dodatnio naładowana część gałki przybliża się do tej elektrody) i jego spadek na elektrodzie leżącej po przeciwnej stronie głowy &amp;amp;mdash; F7 (dodatnio naładowana część gałki odsuwa się do tej elektrody). Dzięki temu artefakt ten jest łatwo rozpoznawalny. U osób z oczopląsem artefakt ten występuje rytmicznie z częstością oczopląsu. Należy również pamiętać, że ruchy gałek ocznych są sterowane mięśniami, w związku z czym nagłe i silne ruchu gałek na boki będą powodowały występowanie wyładowań iglicowych związanych z czynnością mięśni. Amplituda tych wyładowań osiągnie największą wartość na elektrodach F8 i F7.&lt;br /&gt;
[[Plik:Artefakt_ruch_oczu_w_poziomie.png|center|thumb| 800px|Artefakt wywołany ruchem gałek ocznych w poziomie.]]&lt;br /&gt;
&lt;br /&gt;
===Elektryczna Czynność Mięśni &amp;amp;mdash; EMG===&lt;br /&gt;
Na głowie człowieka znajdują się mięśnie, bądź przyczepy mięśni odpowiedzialnych głównie za mimikę twarzy, ruchy gałek ocznych czy ruchy szczęki. W związku z powyższym artefakty mięśniowe najsilniej będą rejestrowane przez elektrody czołowe oraz skroniowe (przednie i środkowe). Artefakty te są znaczne silniejsze niż zapis EEG (mogą dochodzić do kilku mV), zaś ich widmo w niskich częstościach pokrywa się z pasmem beta i gamma w EEG. Powstawaniu artefaktów EMG sprzyja: niewłaściwe oświetlenie laboratorium (co powoduje mrużenie oczu), niewygodna dla pacjenta pozycja &amp;amp;mdash; brak oparcia dla głowy, brak oparcia dla rąk i nóg, wykonywane testy wymagające uwagi i koncentracji. W tym ostatnim przypadku, w trakcie rozwiązywania takiego testu, cześć spośród badanych osób ma tendencję do marszczenia czoła, czy mrużenia oczu.&lt;br /&gt;
[[Plik:Artefakt_marszczenie_czola.png|center|thumb| 800px|Marszczenie czoła.]]&lt;br /&gt;
[[Plik:Artefakt_napiecie_miesni_rak.png|center|thumb| 800px|Artefakt wywołany napięciem mięśni rąk.]]&lt;br /&gt;
[[Plik:Artefakt_zacisniecie_zebow.png|center|thumb| 800px|Artefakt wywołany zaciskaniem zębów.]]&lt;br /&gt;
&lt;br /&gt;
===Czynność elektryczna serca===&lt;br /&gt;
Artefakt ten pojawia się najczęściej rytmicznie wraz z czynnością elektryczną serca i przyjmuje charakterystyczny dla niego kształt. Zdarza się jednak, że nie każdy kolejny cykl pracy serca zostanie zmierzony przez elektrody EEG. Wtedy artefakt ten może być pomylony z wyładowaniami iglicowymi. Najlepszą metodą detekcji tego artefaktu jest jednoczesny pomiar EEG i EKG. Zakłócenie związane z EKG objawia się najsilniej na elektrodzie, które została umieszczona tuż nad jakąś tętniczką. Często to ma miejsce w przypadku gdy jako elektrodę referencyjną wybrano elektrodę umieszczoną na wyrostku sutkowatym (za uszami), gdzie u wielu osób przebiega właśnie mała tętniczka. Sygnały z kanałów referencyjnych odejmowane są od sygnałów zarejestrowanych od pozostałych kanałów co będzie w oczywisty sposób prowadzić do &amp;amp;bdquo;rozpowszechniania się&amp;amp;rdquo; artefaktu EKG po wszystkich elektrodach. O ile to możliwe, należy zmienić nieznacznie pozycję elektrody, tak aby nie znajdowała się ona nad tętniczką.&lt;br /&gt;
&lt;br /&gt;
===Żucie, ruchy języka===&lt;br /&gt;
Artefakt związany z żuciem to głównie potencjały od czynności elektrycznej mięśni o częstości występowania skorelowanej z rytmicznie powtarzającym się ruchem szczęk. Z kolei ruch języka powoduje również czynność elektryczną ale nie mającą charakteru rytmicznego, przypominającą fale delta.&lt;br /&gt;
[[Plik:Artefakt_ruch_jezykiem.png|center|thumb| 800px|Artefakt wywołany ruchem języka.]]&lt;br /&gt;
[[Plik:Artefakt_zucie.png|center|thumb| 800px|Artefakt wywołany żuciem.]]&lt;br /&gt;
&lt;br /&gt;
===Drżenie kończyn===&lt;br /&gt;
&lt;br /&gt;
Drżenie kończyn może być spowodowane chorobą (np. Parkinsona) lub długotrwałym siedzeniem w mało komfortowej pozycji. Ruchy kończyn będą wywoływały także ledwo zauważalne ruchy głowy. W sytuacji, gdy badana osoba cierpi na chorobę Parkinsona, drżenia kończyn prowadzą do powstania rytmicznej fali o częstości 5-6 Hz przypominającej wyładowania padaczkowe. W celu lepszej detekcji tego artefaktu wskazane jest rejestrowanie czynności EMG.&lt;br /&gt;
&lt;br /&gt;
===Chodzenie osób w pobliżu badanego===&lt;br /&gt;
Chodzenie w pobliżu badanej osoby powoduje powstawanie artefaktu przypominającego fale ostre.&lt;br /&gt;
&lt;br /&gt;
===Artefakty związane z ruchem badanej osoby.===&lt;br /&gt;
Wywołane są dowolnymi ruchami głowy i ciała badanej osoby i związaną z nimi czynnością elektryczną mięśni. Powstałe potencjały są szerokopasmowe i mają znaczne amplitudy. Ruchy badanej osoby prowadzą do:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;li&amp;gt;&lt;br /&gt;
	ruchu elektrod, a w związku tym pogorszenia ich kontaktu ze skór, a nawet oderwania elektrod od skóry;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;li&amp;gt;&lt;br /&gt;
	zmiany strumienia pola elektromagnetycznego przechodzącego przez pętle utworzone przez elektrody i wzmacniacz. Zgodnie z prawem indukcji Faradaya, zmiana strumienia w czasie spowoduje powstaje siły elektromotorycznej.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Plik:Artefakt_ruch_glowa.png|thumb|800px|center|Artefakt wywołany ruchem głowy.]]&lt;br /&gt;
&lt;br /&gt;
===Redukcja artefaktów===&lt;br /&gt;
Kilka rad umożliwiających redukcję artefaktów, bądź ich lepsze rozpoznanie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;li&amp;gt;&lt;br /&gt;
	zadbać o położenie wzmacniacza EEG z dala od innych urządzeń i kabli. Umieścić go na podkładce z tworzywa;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;li&amp;gt;&lt;br /&gt;
	zadbać o komfortową pozycję dla pacjenta;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;li&amp;gt;&lt;br /&gt;
	mierzyć czynność EKG, EMG i elektrookulogram wraz z EEG;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;li&amp;gt;&lt;br /&gt;
	sporządzać notatki na temat zachowania się pacjenta (jeśli mamy możliwość obserwowania go) &amp;amp;mdash; kiedy się poruszał, czy ktoś do niego podszedł np. celem poprawienia jakiegoś elementu układu eksperymentalnego.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Ćwiczenia: rejestracja EEG z artefaktami oraz EEG spoczynkowego==&lt;br /&gt;
&lt;br /&gt;
=== Przypomnij sobie:===&lt;br /&gt;
* [[Pracownia_Sygnałów_Biologicznych/Zajecia_9#Procedura_zak.C5.82adania_czepka.|procedurę zakładania czepka]] na głowie &lt;br /&gt;
* [[Pracownia_Sygnałów_Biologicznych/Zajecia_9#Oczyszczanie_sk.C3.B3ry_w_miejscu_przy.C5.82o.C5.BCenia_elektrody|przygotowanie skóry głowy]]&lt;br /&gt;
* [[Elektroencefalografia/Fizyczne_i_techniczne_aspekty_rejestracji_sygnałów_bioelektrycznych#Praktyczne_uwagi_dotycz.C4.85ce_przeprowadzania_rejestracji_sygna.C5.82u_EEG|techniczne uwagi]] dotyczące pomiaru EEG.&lt;br /&gt;
&lt;br /&gt;
=== Rejestracja ===&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
	&lt;br /&gt;
&amp;lt;li&amp;gt;	Dokonaj przynajmniej 25-minutowego zapisu EEG w systemie 10-20, jako elektrody referencyjne wybierz elektrody uszne. Jednocześnie wraz z rejestracją EEG dokonaj pomiaru sygnału EKG z [[Pracownia_Sygnałów_Biologicznych/Zajecia_2_4|odprowadzenia I Einthovena]], EMG z szyi oraz elektrookulogamu. W trakcie pomiaru, w wybranych chwilach czasu wykonaj:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
	&amp;lt;li&amp;gt;	mrugnięcie,&lt;br /&gt;
	&amp;lt;li&amp;gt;	ruch językiem,&lt;br /&gt;
	&amp;lt;li&amp;gt;	żucie,&lt;br /&gt;
	&amp;lt;li&amp;gt;	napięcie mięśni rąk bądź nóg na tyle silne, aby wywołało drżenie,&lt;br /&gt;
	&amp;lt;li&amp;gt;	ruch oczu w prawo,&lt;br /&gt;
	&amp;lt;li&amp;gt;	ruch oczu w lewo,&lt;br /&gt;
	&amp;lt;li&amp;gt;	zmarszczenie czoła,&lt;br /&gt;
	&amp;lt;li&amp;gt;	zaciśnięcie zębów,&lt;br /&gt;
	&amp;lt;li&amp;gt;	napięcie mięśni szyi,&lt;br /&gt;
	&amp;lt;li&amp;gt;	ruch głową&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wszystkie powyższe czynności powinny być odseparowane od siebie w czasie. Osoba biorąca razem z Tobą udział w eksperymencie powinna dokładnie zanotować moment wykonywania przez Ciebie kolejnych ruchów. Następnie, poproś kolegę aby:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
	&amp;lt;li&amp;gt;przez 30 sekund chodził za Tobą,&lt;br /&gt;
	&amp;lt;li&amp;gt;	pogłaskał Cię po ramieniu&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Kolega powinien odnotować czas wykonywania powyższych czynności.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt; Zarejestruj 10 minut sygnału EEG, w trakcie których badana osoba będzie siedziała z otwartymi oczami oraz kolejne 10 minut w stanie czuwania z zamkniętymi oczami. Sygnał ten będzie potrzebny w czasie kolejnych zajęć, więc zapisz jego kopię zapasową.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Praca z sygnałami===&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Po zakończeniu rejestracji otwórz w SVAROGu z pliku zapisany sygnał. Obejrzyj dokładnie zarówno 2-minutowe odcinki sygnału pomiędzy wykonywanymi ruchami jak i w momencie wykonywania ruchów. Scharakteryzuj powstałe artefakty pod względem amplitudy, długości trwania, widma mocy i topografii.&lt;br /&gt;
&amp;lt;li&amp;gt; Zmień referencje pomiaru z jednobiegunowego usznego na dwubiegunowy podłużny bananowy. Ponownie przyjrzyj się zapisowi i scharakteryzuj artefakty.&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&amp;lt;li&amp;gt; Zastosuj transformację ICA. Przyjrzyj się otrzymanym komponentom, ich przebiegom czasowym, widmom mocy i topografiom.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;  Swój zapis sygnałów bioelektrycznych przekaż pozostałym grupom. Od nich otrzymasz również zapisy. Na podstawie dotychczas zebranych wiadomości, dokonaj przeglądu otrzymanych zapisów pod kątem występowania artefaktów. Pod dokonaniu analizy poproś grupy od których otrzymałeś dane o informacje jakie ruchy były wykonywane w określonej chwili czasu. Sprawdź poprawność dokonanych przez Ciebie oznaczeń artefaktów z informacjami dostarczonymi przez kolegów&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===ICA (ćwiczenie dodatkowe)===&lt;br /&gt;
Popularna w ostatnich latach metoda &amp;quot;czyszczenia&amp;quot; sygnału z artefaktów opiera się na analizie składowych niezależnych.&lt;br /&gt;
&lt;br /&gt;
Analiza składowych niezależnych (ang. ''Independent Components Analysis'',&lt;br /&gt;
ICA) to jedno z określeń dla metod rozwiązywania problemu tzw. ślepej&lt;br /&gt;
separacji źródeł (''blind source separation, BSS''). Przyjęty model&lt;br /&gt;
zakłada, że mamy do czynienia z następującą sytuacją: dane którymi&lt;br /&gt;
dysponujemy (&amp;lt;math&amp;gt;\vec{x}&amp;lt;/math&amp;gt; &amp;amp;mdash; np. zapisy z kilku mikrofonów)&lt;br /&gt;
są liniową mieszaniną kilku statystycznie niezależnych sygnałów&lt;br /&gt;
(&amp;lt;math&amp;gt;\vec{s}&amp;lt;/math&amp;gt; &amp;amp;mdash; np. głosy kilku mówiących jednocześnie osób,&lt;br /&gt;
tzw. ''cocktail party problem''): &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; &lt;br /&gt;
\vec{x} = A \vec{s}&lt;br /&gt;
&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; zwiemy macierzą mieszającą, a&lt;br /&gt;
rozwiązania szukamy w postaci macierzy separującej &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;, takiej, że wektor sygnałów &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \vec{y}=B\vec{x}&lt;br /&gt;
&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
jest możliwie bliski (nieznanym) sygnałom&lt;br /&gt;
&amp;lt;math&amp;gt;\vec{s}&amp;lt;/math&amp;gt;.  Wymóg niezależności statystycznej elementów&lt;br /&gt;
&amp;lt;math&amp;gt;\vec{y}&amp;lt;/math&amp;gt; wymaga uwzględnienia statystyk rzędów wyższych&lt;br /&gt;
niż 2, czyli korelacji (używanych w PCA). Przetwarzanie wstępne&lt;br /&gt;
polega często na wyzerowaniu statystyk do rzędu 2, czy odjęciu&lt;br /&gt;
średniej i obrocie diagonalizującym macierz kowariancji (zwykle&lt;br /&gt;
PCA). Uzyskanie w prosty sposób dekorelacji ułatwia działanie procedur&lt;br /&gt;
realizujących dalsze wymagania niezależności. Realizowane są one&lt;br /&gt;
zwykle z pomocą sztucznych sieci neuronowych o specjalnie dobieranych&lt;br /&gt;
regułach uczenia.&lt;br /&gt;
&lt;br /&gt;
Procedura usuwania artefaktów polega na zerowaniu komponentów, które zidentyfikujemy -- na przykład na podstawie kształtu, widma i rozkładu przestrzennego -- i odtwarzaniu sygnału z pominięciem tych komponentów. Procedura jest zaimplementowania w programie Svarog, którego aktualną wersję można ściągnąć stąd: https://braintech.pl/software/svarog-streamer/&lt;/div&gt;</summary>
		<author><name>Aduszyk</name></author>
		
	</entry>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=Pracownia_EEG/Potencja%C5%82y_wywo%C5%82ane&amp;diff=8986</id>
		<title>Pracownia EEG/Potencjały wywołane</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=Pracownia_EEG/Potencja%C5%82y_wywo%C5%82ane&amp;diff=8986"/>
		<updated>2022-11-08T11:56:40Z</updated>

		<summary type="html">&lt;p&gt;Aduszyk: /* Zadanie 2: rejestracje i analiza potencjałów wzrokowych */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Pracownia EEG|Pracownia EEG]] / Potencjały wywołane&lt;br /&gt;
&lt;br /&gt;
=Wstęp=&lt;br /&gt;
==Potencjały wywołane==&lt;br /&gt;
=== Wstęp ===&lt;br /&gt;
Potencjały wywołane EEG (ang. ''evoked potentials'', EP) są śladami odpowiedzi mózgu na bodźce. W przypadku MEG poprawnie mówi się o polach wywołanych (ang. ''evoked fields'', EF).&lt;br /&gt;
Zwykle reakcja ta jest mała (wyjątek stanowią [[Elektroencefalografia/Metody_analizy_sygnałów_EEG_-_analiza_w_dziedzinie_czasu |kompleksy K]]) i w zapisie pojedynczej realizacji reakcji na bodziec najczęściej niewidoczna wśród czynności pochodzącej od wielu innych procesów zachodzących w tym samym czasie w mózgu. &lt;br /&gt;
Ich wyodrębnienie z tak zwanego tła EEG/MEG, czyli manifestacji elektrycznej innych, trwających w tym samym czasie w mózgu procesów (aktywny prąd niezależny), wymaga w dniu dzisiejszym zapisu odpowiedzi na szereg powtórzeń tego samego bodźca (&amp;lt;xr id=&amp;quot;fig:EP&amp;quot;&amp;gt;rys. %i&amp;lt;/xr&amp;gt;). Pierwsze potencjały wywołane pokazał pod koniec lat 40-tych Dawson (Dawson 1947) wykonując superpozycję pojedynczych realizacji na kliszy fotograficznej.&lt;br /&gt;
Z czasem skomplikowane urządzenia analogowe zastąpione zostały przez cyfrowe uśrednianie kolejnych fragmentów EEG, zsynchronizowanych według momentu wystąpienia bodźca, łatwo realizowane za pomocą komputera.&lt;br /&gt;
&lt;br /&gt;
[[Grafika:EP.png|thumb|640px|center|&amp;lt;figure id=&amp;quot;fig:EP&amp;quot;&amp;gt;&amp;lt;/figure&amp;gt;&lt;br /&gt;
Uśrednianie potencjałów wywołanych. a) ciągły zapis EEG z wyróżnionymi momentami wystąpienia bodźca (w tym przypadku słuchowego) b) kilkadziesiąt kolejnych odcinków, wyciętych jako sekunda EEG od momentu wystąpienia kolejnych bodźców, ustawione jeden pod drugim c) uśredniony potencjał wywołany &amp;amp;mdash; widać m. in. załamek P300 ok. 300 milisekund po bodźcu]]&lt;br /&gt;
&lt;br /&gt;
Techniki te opierają się na założeniu, że zawarta w EEG odpowiedź mózgu na każdy z kolejnych bodźców jest niezmienna, a EEG odzwierciedlające pozostałe procesy traktowane jest jak nieskorelowany z nią proces stochastyczny. Zależnie od rodzaju potencjałów wywołanych, założenia te są mniej lub bardziej nieuzasadnione; podważa je choćby powszechnie znany efekt habituacji, polegający na osłabieniu późnych potencjałów wywołanych kolejnymi powtórzeniami bodźca.&lt;br /&gt;
&lt;br /&gt;
Istota potencjałów wywołanych jest przedmiotem otwartej dyskusji i dziesiątków prac, dotykających od lat podstawowych w tej dziedzinie pytań: czym jest potencjał wywołany, który widzimy w uśrednionym przebiegu? Czy naprawdę wynika z deterministycznie powtarzanej, jednakowej odpowiedzi pojawiającej się po każdym powtórzeniu bodźca niezależnie od &amp;amp;bdquo;tła&amp;amp;rdquo;, czy może wynika z reorganizacji faz tego właśnie &amp;amp;bdquo;tła&amp;amp;rdquo; EEG, czy może kombinacji tych dwóch efektów? Jest to wspaniałe pole dla zastosowań zaawansowanych metod modelowania i analizy sygnałów. W ostatnich latach powstają dziesiątki prac na ten temat, a od czasu do czasu również krytyczne artykuły wykazujące, że dotychczasowe odkrycia są raczej artefaktami stosowanych metod a nie wynikają z własności analizowanych danych (Yeung et al., 2004). Jak widać jest tu wciąż bardzo wiele do zrobienia, gdyż zrozumienie tego mechanizmu stoi na drodze do &amp;amp;bdquo;świętego Graala&amp;amp;rdquo;, którym w tej dziedzinie jest wyodrębnienie pojedynczych potencjałów wywołanych.&lt;br /&gt;
&lt;br /&gt;
Niezależnie od tego, w neurofizjologii klinicznej nazwą potencjał wywołany określa się krzywą widoczną po uśrednieniu odpowiedzi na kilkanaście do kilku tysięcy bodźców (Szelenberger 2000). Gromadzona od dziesięcioleci wiedza o behawioralnych i klinicznych korelatach potencjałów wywołanych opiera się na rozpoznawaniu w przebiegach uśrednionych tak zwanych załamków, czyli przejściowych wzrostów lub spadków potencjału (na przykład na &amp;lt;xr id=&amp;quot;fig:EP&amp;quot;&amp;gt;rys. %i&amp;lt;/xr&amp;gt; widać załamek P300). Nazwy załamków składają się zwykle z litery &amp;amp;bdquo;P&amp;amp;rdquo; (od ang. ''positive''), jeśli wychylenie jest dodatnie, lub &amp;amp;bdquo;N&amp;amp;rdquo; (od ang. ''negative''), jeśli wychylenie jest ujemne, oraz liczby. Uwaga: &lt;br /&gt;
* Nie ma niestety jednej ustalonej konwencji prezentacji potencjałów koniecznie trzeba więc zwracać uwagę na orientację wykresu, a wykonując wykres samemu - zamieszczać informację o orientacji kierunku dodatniego,gdyż kierunek dodatni może być wykresie skierowany do góry lub do dołu. &lt;br /&gt;
* Liczba następująca po N lub P określa przybliżoną liczbę milisekund od wystąpienia bodźca, czyli tak zwaną latencję. Nie można jednak ścisłego związku między tą liczbą a liczbą milisekund np. potencjał P300 w zależności od szczegółów paradygmatu doświadczalnego może wystąpić znacznie później. np. w eksperymentach językowych zdarza się że P300 występuje później niż N400 :-).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;xr id=&amp;quot;fig:zalamki&amp;quot;&amp;gt;Rys. %i&amp;lt;/xr&amp;gt; przedstawia schematycznie najważniejsze załamki rozpoznawane w potencjałach słuchowych, czyli wywoływanych bodźcem dźwiękowym. Dla potencjałów wzrokowych i somatosensorycznych istnieją podobne klasyfikacje.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Grafika:Zalamki.png|thumb|320px|right|&amp;lt;figure id=&amp;quot;fig:zalamki&amp;quot;&amp;gt;&amp;lt;/figure&amp;gt;&lt;br /&gt;
Orientacyjny schemat załamków rozpoznawanych w słuchowych potencjach wywołanych, na podstawie (Szelenberger 2000). Skala czasu logarytmiczna. Najszybsze (do 12 ms) składowe egzogenne to potencjały pniowe (BAEP), oznaczane jako fale I-VII. Litery &amp;amp;bdquo;P&amp;amp;rdquo; i &amp;amp;bdquo;N&amp;amp;rdquo; oznaczają dodatnie i ujemne wychylenia związane z dalszymi załamkami]]&lt;br /&gt;
&lt;br /&gt;
Najszybsze (czyli o najmniejszej latencji) składowe to potencjały egzogenne, odzwierciedlające wstępne fazy przekazu informacji. W potencjałach słuchowych są to potencjały pnia (ang. ''brainstem auditory evoked potentials'', BAEP), składające się z siedmiu fal występujących pomiędzy 1 a 12 ms od bodźca. Są one generowane np. w nerwie słuchowym czy pniu mózgu, i wykorzystywane w klinicznej diagnostyce integralności dróg słuchowych. Podobnie jak inne wczesne potencjały o latencjach poniżej 100 ms, są praktycznie niezależne od stanu uwagi.&lt;br /&gt;
&lt;br /&gt;
Po potencjałach o średniej latencji (między 12 a 50 ms) zaczynają się późne potencjały słuchowe (od 100 ms od podania bodźca), odzwierciedlające bardziej złożone reakcje na bodziec. Potencjały ok. 100 ms obserwowane w okolicach sensorycznych odzwierciedlają odpowiedź tejże kory na bodziec. Ich amplituda zależy od parametrów fizycznych bodźca oraz od uwagi, np. amplituda załamka N100 wzrasta w stanie skupienia uwagi czy pobudzenia emocjonalnego. Pierwszy i najpopularniejszy całkowicie endogenny załamek to P300, pojawiający się po rozpoznaniu bodźca oczekiwanego, na którym skupiamy uwagę: na przykład, jeśli w serii pojawiających się losowo liter mamy zliczać wystąpienia jednej z nich, to na średniej odpowiedzi na pojawienie się tej litery pojawi się załamek P300. Załamek ten występuje również w odpowiedzi na bodźce wyczekiwane, niespodziewane i ważne dla osoby (np. własne imię). &lt;br /&gt;
&lt;br /&gt;
=== Uśrednianie w dziedzinie czasu ===&lt;br /&gt;
Jak już było wspomniane powyżej podstawową techniką stosowaną do analizy potencjałów wywołanych jest uśrednianie wielu realizacji odpowiedzi na bodziec wyrównanych względem jakiegoś charakterystycznego zdarzenia, np. momentu podania bodźca albo momentu behawioralnej reakcji na bodziec (np. wciśnięcie przycisku). Podejście to bazuje na trzech założeniach:&lt;br /&gt;
* Reakcja jest czasowo związana z bodźcem. Tzn. w kolejnych realizacjach występuje ona zawsze z tym samym opóźnieniem.&lt;br /&gt;
* Reakcja na bodziec skutkuje zawsze pojawieniem się w sygnale składowej o stałym kształcie (mówimy o stałej morfologii).&lt;br /&gt;
* Spontaniczna czynność EEG &amp;amp;mdash; ta która nie dotyczy przetwarzania interesującego nas bodźca &amp;amp;mdash; jest niezależnym, stacjonarnym szumem o średniej zero.&lt;br /&gt;
&lt;br /&gt;
Zgodnie z powyższymi założeniami mierzony w ''i''-tej realizacji sygnał można wyrazić jako:&lt;br /&gt;
: &amp;lt;math&amp;gt;x_i(t) = s(t) + n_i(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
Uśrednianie po ''N'' realizacjach daje:&lt;br /&gt;
: &amp;lt;math&amp;gt;\bar x (t) = \frac{1}{N} \sum_{i=1}^N x_i(t) = \frac{1}{N} \left(N s(t) + \sum_{i=1}^N n_i(t) \right) &amp;lt;/math&amp;gt;&lt;br /&gt;
Wartość oczekiwana średniego sygnału wynosi:&lt;br /&gt;
: &amp;lt;math&amp;gt;\mathrm{E}\left[ \bar x(t) \right] = s(t) &amp;lt;/math&amp;gt;&lt;br /&gt;
gdyż dla szumu o średniej zero mamy:&lt;br /&gt;
: &amp;lt;math&amp;gt;\mathrm{E}\left[\frac{1}{N} \sum_{i=1}^N n_i(t)\right] = 0&amp;lt;/math&amp;gt;.&lt;br /&gt;
Wariancja &amp;lt;math&amp;gt;\bar x(t)&amp;lt;/math&amp;gt; wynosi:&lt;br /&gt;
: &amp;lt;math&amp;gt;\sigma^2_{\bar x(t)} = \mathrm{E} \left[  \left( \frac{1}{N} \sum_{i=1}^N n_i(t)\right)^2 \right] \approx \frac{1}{N} \sigma^2_{n(t)}&amp;lt;/math&amp;gt;&lt;br /&gt;
gdyż &amp;lt;math&amp;gt;s(t)&amp;lt;/math&amp;gt; jest deterministyczne. &lt;br /&gt;
&lt;br /&gt;
Dla potencjałów pojawiających się w pierwszych kilkudziesięciu milisekundach po bodźcu model ten można uznać za poprawny, gdyż wykazują one zależność głównie od parametrów fizycznych bodźca. Dla późniejszych składowych staje się on coraz bardziej wątpliwy ze względu na występujące korelacje ze stanem (np. uwagi) badanego.&lt;br /&gt;
&lt;br /&gt;
Dla późniejszych składowych można by postulować bardziej ogólną wersję modelu potencjału wywołanego:&lt;br /&gt;
: &amp;lt;math&amp;gt;x_i(t) = s_i(t) + n_i(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
Ten model uwidacznia, że do opisu potencjału wywołanego potrzebna jest nie tylko średnia, ale i wyższe momenty rozkładu (np. drugi moment centralny czyli wariancja).&lt;br /&gt;
&lt;br /&gt;
====Wariancja w przypadku szumu skorelowanego ====&lt;br /&gt;
W poprzednim paragrafie pokazaliśmy, że w przypadku niezależnego szumu wariancja uśrednionego sygnału (w danej chwili czasu) maleje jak  &amp;lt;math&amp;gt;\frac{1}{N}&amp;lt;/math&amp;gt;. Jednak w przypadku gdy kolejne próbki szumu są skorelowane (np. występuje silna aktywność rytmiczna alfa) sytuacja się komplikuje. Intuicyjnie łatwo możemy to sobie wyobrazić w granicznym przypadku. Załóżmy, że tło dla  potencjałów o stałej morfologii   stanowi sinusoida. Jeśli będziemy podawać bodźce w odstępach będących wielokrotnością okresu tej sinusoidy to w uśrednianych fragmentach sygnału owa sinusoida jest tak samo powtarzalna jak badany potencjał i uśrednianie nie prowadzi do poprawy stosunku amplitudy sygnału do amplitudy tła. &lt;br /&gt;
&lt;br /&gt;
Stopień zależności pomiędzy próbkami można zmierzyć przy pomocy funkcji autokorelacji. &lt;br /&gt;
Jeśli funkcję autokorelacji przybliżymy przez:&lt;br /&gt;
: &amp;lt;math&amp;gt;R_{xx}(\tau) = \sigma^2 \exp(-\beta |\tau|) \cos(2 \pi f_0 \tau)&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\sigma^2&amp;lt;/math&amp;gt; jest wariancją szumu, &amp;lt;math&amp;gt;f_0&amp;lt;/math&amp;gt; jest średnią częstością aktywności rytmicznej, &amp;lt;math&amp;gt;\beta/ \pi&amp;lt;/math&amp;gt; jest szerokością pasma tej czynności, zaś &amp;lt;math&amp;gt;\tau&amp;lt;/math&amp;gt; opóźnieniem, to wariancję potencjału wywołanego można wyrazić jako&amp;lt;!-- \cite{Spekreijse_1976}--&amp;gt;:&lt;br /&gt;
: &amp;lt;math&amp;gt;\sigma^2_{\bar x(t)} = \frac{\sigma^2}{N} \left[ \frac{1-\exp(-2 \beta T)}{1 - 2 \exp(- \beta T) \cos(2 \pi f_0 T) +\exp(-2 \beta T)} \right]&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; jest odstępem między bodźcami. &lt;br /&gt;
Widać stąd, że obecność czynności rytmicznej w tle wpływa na stosunek sygnału do szumu. Z powyższego równania widać, że stosunek wariancji dąży do &amp;lt;math&amp;gt;\frac{\sigma^2}{N}&amp;lt;/math&amp;gt; gdy &amp;lt;math&amp;gt;\beta T&amp;lt;/math&amp;gt; staje się duże.  &lt;br /&gt;
&lt;br /&gt;
Periodyczna stymulacja może ponadto prowadzić do wzbudzenia czynności rytmicznej o częstości równej częstości pobudzania bądź jej harmonicznej.&lt;br /&gt;
&lt;br /&gt;
===Wariancja latencji===&lt;br /&gt;
&lt;br /&gt;
Jedną z form zmienności potencjału wywołanego w pojedynczych realizacjach jest wariancja latencji. &lt;br /&gt;
[[Grafika:Wariancja_latencji.png|thumb|500px|right|&lt;br /&gt;
Czerwona linia: Uśrednianie 100 potencjałów wywołanych o latncjach z rozkładu normalnego N(300,30 ), Niebieskie linie: przykładowe pojedyncze realizacje wzięte do średniej]]&amp;lt;!--# -*- coding: utf-8 -*-&lt;br /&gt;
from __future__ import division&lt;br /&gt;
import numpy as np&lt;br /&gt;
from matplotlib.pyplot import plot, show ,subplot, figure, title, xlabel, ylabel, ylim&lt;br /&gt;
 &lt;br /&gt;
def fun(t,lat=100):&lt;br /&gt;
    return np.exp(-(t-lat)**2/(2*30**2))&lt;br /&gt;
Fs = 1&lt;br /&gt;
N = 100&lt;br /&gt;
t = np.arange(0,700)&lt;br /&gt;
f = np.zeros((N,700))&lt;br /&gt;
f_sr = np.zeros(t.shape)&lt;br /&gt;
for i in range(N):&lt;br /&gt;
    f[i,:] = fun(t,lat = 300 + 30* np.random.randn())&lt;br /&gt;
for i in range(3):&lt;br /&gt;
    plot(t,f[i,:], 'b')&lt;br /&gt;
plot(t,f.mean(0),'r')&lt;br /&gt;
show()--&amp;gt;&lt;br /&gt;
Zmienność latencji prowadzi do:&lt;br /&gt;
* zmniejszenia amplitudy &amp;lt;math&amp;gt;\bar x&amp;lt;/math&amp;gt;&lt;br /&gt;
* wzrostu rozciągłości czasowej załamka&lt;br /&gt;
&lt;br /&gt;
O tych konsekwencjach zmienności latencji należy w szczególności pamiętać porównując średnie potencjały uzyskane w różnych warunkach eksperymentalnych. Gdy zauważymy, że średnie potencjały różnią się amplitudą należy rozważyć możliwość, że w istocie warunki eksperymentalne wpływają na różnice w wariancji latencji. &lt;br /&gt;
&lt;br /&gt;
Naturalne jest, że zmienność latencji jest bardziej widoczna w przypadku załamków trwających krótko niż w przypadku załamków trwających długo. Wariancja latencji rożnie wraz z jej wartością, stąd wśród późnych składowych potencjałów wywołanych nie obserwuje się komponentów krótkotrwałych.&lt;br /&gt;
&amp;lt;!--====Uśrednianie metodą Woody'ego ====&lt;br /&gt;
&lt;br /&gt;
Model potencjału ze zmienną latencją i sposób na jego efektywniejsze uśrednianie zaproponował Woody (1967). Model ten zakłada, że w każdej realizacji występuje komponent addytywny &amp;lt;math&amp;gt;s_i(t)\;&amp;lt;/math&amp;gt;, który co do kształtu jest stały, a pomiędzy realizacjami różni się tylko latencją:&lt;br /&gt;
: &amp;lt;math&amp;gt; s_i(t) = s(t +\Delta t_i)\;&amp;lt;/math&amp;gt;&lt;br /&gt;
Woody zaproponował aby &amp;lt;math&amp;gt;\Delta t_i\;&amp;lt;/math&amp;gt; szacować na podstawie maksimum funkcji korelacji wzajemnej pomiędzy ''i''-tą realizacją a wzorcem. W pierwszym kroku wzorcem jest średni potencjał uzyskany przez proste uśrednienie realizacji.  Następnie w sposób iteracyjny dokonuje się:&lt;br /&gt;
* poprawek w wyrównaniu poszczególnych realizacji,&lt;br /&gt;
* obliczenia nowego wzorca poprzez uśrednienie realizacji po korekcie wyrównania,&lt;br /&gt;
* obliczenia nowych poprawek do wyrównania realizacji.--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Habituacja ===&lt;br /&gt;
Zmienność w odpowiedziach na kolejno występujące po sobie bodźce można podzielić na komponent stochastyczny i deterministyczny. Komponent deterministyczny odzwierciedla zmianę czułości  układu nerwowego  na kolejne bodźce. Nowy bodziec często wywołuje reakcje pobudzenia widoczną w wielu parametrach takich jak przewodnictwo skóry, rytm serca i reaktywność kory mózgowej. Powszechnie obserwowanym zjawiskiem jest spadek reaktywności na powtarzające się bodźce zwany habituacją. Niekiedy obserwuje się także zjawisko przeciwne &amp;amp;mdash; wzrost reaktywności na bodziec &amp;amp;mdash; zwane sensytyzacją. &lt;br /&gt;
&lt;br /&gt;
Klasycznym sposobem na badanie tych zjawisk w potencjałach wywołanych jest uśrednianie w podzbiorach lub  uśrednianie blokowe. Wymaga ono  zmiany paradygmatu rejestracji danych. Załóżmy, że interesującym nas bodźcem jest błysk światła. Chcemy zaobserwować ewentualne zmiany amplitudy i latencji w ciągu 100 potencjałów będących reakcją na błysk powtarzający się co 500 ms.&lt;br /&gt;
====Uśrednianie w podzbiorach ====&lt;br /&gt;
W metodzie tej musimy założyć, że proces habituacji jest powolny, tzn. zmiany pomiędzy kolejnymi reakcjami są bardzo małe. W takim przypadku możemy podzielić długą serię bodźców na ciąg pod-serii i uśrednienie przeprowadzić dla każdej pod-serii osobno.&lt;br /&gt;
[[Plik:Usrednianie_podzbiory.svg‎|640px|thumb|center|Ilustracja uśredniania w podzbiorach]]&lt;br /&gt;
&lt;br /&gt;
====Uśrednianie blokowe====&lt;br /&gt;
W tym celu eksperyment wykonujemy w wielu seriach. Jedna seria składa się ze 100 błysków powtarzanych co 500 ms.  Po serii następuje przerwa trwająca np. 5 s (długość przerwy wyraża nasze oszacowanie czasu potrzebnego na zanik habituacji). Po przerwie seria jest powtarzana. Powtórzeń serii wykonujemy ''N''.&lt;br /&gt;
Następnie uśredniamy fragmenty sygnałów odpowiadające sobie w kolejnych seriach. &lt;br /&gt;
&lt;br /&gt;
W tym paradygmacie zakładamy, że każda seria rejestrowana jest w tych samych warunkach. Zaniedbujemy efekty związane ze zmęczeniem i zmianami w np. stopniu koncentracji badanego.&lt;br /&gt;
[[Plik:Usrednianie blokowe.svg|Usrednianie blokowe.svg|640px|thumb|center|Ilustracja uśredniania w blokach]]&lt;br /&gt;
&lt;br /&gt;
===Załamki w krzywej potencjału wywołanego vs ukryte komponenty===&lt;br /&gt;
Komponenta potencjału wywołanego to bardzo ważne ale jednocześnie źle określone pojęcie. Krzywa otrzymana w wyniku uśredniania potencjałów wywołanych przedstawia serię załamków dodatnich i ujemnych, ale trzeba być świadomym, że ten przebieg napięcia rejestrowany przez elektrody przedstawia tak naprawdę sumę potencjałów pochodzących od wielu dość niezależnie działających źródeł w mózgu. Przyczynek pochodzący od jednego funkcjonalnego źródła będziemy określać jako komponentę. &lt;br /&gt;
&lt;br /&gt;
Komentarza wymaga też pojęcie źródła funkcjonalnego. Czynność elektryczną synchronicznie działających neuronów piramidalnych w określonym fragmencie kory mózgowej z pewnej odległości można przybliżyć potencjałem dipola prądowego. Taki aktywny fragment kory stanowi źródło dające przyczynek do mierzonego na powierzchni głowy potencjału. W najprostszej sytuacji taki przyczynek może być obserwowany jako komponenta. Mózg jest jednak obiektem niezwykle złożonym i gęsto połączonym. Wiele obszarów korowych może być funkcjonalnie połączonych i aktywowanych synchronicznie w celu realizacji określonego zadania &amp;amp;mdash; o takim funkcjonalnym zespole też możemy myśleć jako o pojedynczym źródle, choć może ono mieć złożoną strukturę przestrzenną. Często zatem myślimy o komponentach ukrytych potencjału wywołanego jako o aktywności takich funkcjonalnych zespołów. &lt;br /&gt;
&lt;br /&gt;
Po tym wstępie widać już chyba, że do zrozumienia co dzieje się w czasie reakcji na bodziec, którą obserwujemy w potencjale wywołanym, bardziej pożądane byłoby badanie komponent ukrytych niż poszczególnych załamków krzywej potencjału wywołanego, która stanowi ważoną sumę owych komponentów. Zanim przejdziemy do omówienia technik służących &amp;amp;bdquo;wyłuskiwaniu&amp;amp;rdquo; komponent prześledźmy kilka symulacji i wnioski z nich płynące.&lt;br /&gt;
&lt;br /&gt;
==== Załamki i komponenty nie są tym samym.====&lt;br /&gt;
Tę samą krzywą można otrzymać na nieskończenie wiele sposobów  przez sumowanie rożnych kombinacji domniemanych komponentów. Przykładowy rysunek pokazuje, jak tę samą krzywą można złożyć z dwóch rożnych zestawów komponentów (kod wytwarzający przykładową symulację pokazany jest poniżej).&lt;br /&gt;
[[Plik:Sumowanie_komponentow1.png|center|thumb|600px| Panel a) przedstawia hipotetyczną krzywą ERP, panel b) jedna z możliwych dekompozycji sygnału w panelu a), panel c) inna możliwa dekompozycja sygnału z panelu a) ]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
from __future__ import division&lt;br /&gt;
import numpy as np&lt;br /&gt;
from matplotlib.pyplot import plot, show ,subplot, figure, title, xlabel, ylabel, ylim&lt;br /&gt;
&lt;br /&gt;
Fs = 1&lt;br /&gt;
t = np.arange(0,700)&lt;br /&gt;
&lt;br /&gt;
C1 = np.exp(-(t-100)**2/(2*30**2))&lt;br /&gt;
C2 = np.exp(-(t-200)**2/(2*50**2))&lt;br /&gt;
C3 = np.exp(-(t-350)**2/(2*100**2))&lt;br /&gt;
ERP = 0.5*C1-C2+C3&lt;br /&gt;
&lt;br /&gt;
C2p = np.concatenate((C2[0:200], np.ones(30), C2[200:700-30] ))&lt;br /&gt;
C3p = ERP - 0.5*C1 + C2p&lt;br /&gt;
ERP_v2 = 0.5*C1-C2p+C3p&lt;br /&gt;
&lt;br /&gt;
subplot(3,1,1)&lt;br /&gt;
plot(t,ERP, t[::10],ERP_v2[::10],'g.')&lt;br /&gt;
ylabel('a)',rotation='horizontal')&lt;br /&gt;
ylim([-1, 1.5])&lt;br /&gt;
&lt;br /&gt;
subplot(3,1,2)&lt;br /&gt;
plot(t,0.5*C1,t,-C2,t,C3)&lt;br /&gt;
ylabel('b)',rotation='horizontal')&lt;br /&gt;
ylim([-1, 1.5])&lt;br /&gt;
&lt;br /&gt;
subplot(3,1,3)&lt;br /&gt;
plot(t,0.5*C1,t,-C2p,t,C3p)&lt;br /&gt;
ylabel('c)',rotation='horizontal')&lt;br /&gt;
ylim([-1, 1.5])&lt;br /&gt;
&lt;br /&gt;
show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Zmiana jednej komponenty może powodować zmiany w amplitudzie i latencji więcej niż jednego załamka.====&lt;br /&gt;
Poniższy rysunek przedstawia sytuację gdy zmiana amplitudy jednego komponentu może znacząco wpływać na amplitudę i latencję innych załamków.&lt;br /&gt;
&lt;br /&gt;
[[Plik:Sumowanie_komponentow2.png|center|thumb|768px| Panel a) przedstawia dwie hipotetyczne krzywe ERP, panel b) panel b i c komponenty z których powstały owe krzywe. Zmiana amplitudy komponentu oznaczonego kolorem powoduje zmianę amplitudy oznaczonych załamków ale także zmianę latencji wcześniejszego załamka. ]]&lt;br /&gt;
Poniżej kod odtwarzający powyższy przykład:&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
from __future__ import division&lt;br /&gt;
import numpy as np&lt;br /&gt;
from matplotlib.pyplot import plot, show, subplot, figure, title, xlabel, ylabel, ylim&lt;br /&gt;
&lt;br /&gt;
Fs = 1&lt;br /&gt;
t = np.arange(0,700)&lt;br /&gt;
&lt;br /&gt;
C1 = np.exp(-(t-100)**2/(2*30**2))&lt;br /&gt;
C2 = np.exp(-(t-200)**2/(2*50**2))&lt;br /&gt;
C3 = np.exp(-(t-350)**2/(2*100**2))&lt;br /&gt;
ERP1 = 0.5*C1-C2+C3&lt;br /&gt;
ERP2 = 0.5*C1-C2+1.5*C3&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
subplot(3,1,1)&lt;br /&gt;
plot(t,ERP1,'b', t,ERP2,'g')&lt;br /&gt;
plot(t[np.argmin(ERP1)],np.min(ERP1),'r.' )&lt;br /&gt;
plot(t[np.argmax(ERP1)],np.max(ERP1),'m.' )&lt;br /&gt;
plot(t[np.argmin(ERP2)],np.min(ERP2),'r.' )&lt;br /&gt;
plot(t[np.argmax(ERP2)],np.max(ERP2),'m.' )&lt;br /&gt;
&lt;br /&gt;
ylabel('a)',rotation='horizontal')&lt;br /&gt;
ylim([-1, 1.6])&lt;br /&gt;
&lt;br /&gt;
subplot(3,1,2)&lt;br /&gt;
plot(t,0.5*C1,'k',t,-C2,'k',t,C3,'b')&lt;br /&gt;
ylabel('b)',rotation='horizontal')&lt;br /&gt;
ylim([-1, 1.6])&lt;br /&gt;
&lt;br /&gt;
subplot(3,1,3)&lt;br /&gt;
plot(t,0.5*C1,'k',t,-C2,'k',t,1.5*C3,'g')&lt;br /&gt;
ylabel('c)',rotation='horizontal')&lt;br /&gt;
ylim([-1, 1.6])&lt;br /&gt;
&lt;br /&gt;
show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Instrukcje do ćwiczeń =&lt;br /&gt;
&lt;br /&gt;
==Zadanie 1: uśrednianie symulowanych sygnałów==&lt;br /&gt;
w tym ćwiczeniu chcemy pokazać efekty:&lt;br /&gt;
# uśredniania sygnałów związanych fazowo z bodźcem i nieskorelowanych z bodźcem / wpływ liczby realizacji,&lt;br /&gt;
# uśredniania sygnałów z fluktuacją latencji,&lt;br /&gt;
# wpływ filtrów o różnych funkcjach odpowiedzi impulsowej na morfologię uśrednionego potencjału.&lt;br /&gt;
&lt;br /&gt;
===Sygnały testowe===&lt;br /&gt;
Proszę zaimplementować funkcje generujące następujące przebiegi czasowe (oznaczenia: ''F&amp;lt;sub&amp;gt;s&amp;lt;/sub&amp;gt;'' &amp;amp;mdash; częstość próbkowania, ''T'' &amp;amp;mdash; czas trwania w sekundach, [[%C4%86wiczenia_1#Sygna.C5.82y_testowe|analogicznie do tego]]):&lt;br /&gt;
* sinusoida o zadanej częstości ''f'' i fazie &amp;lt;math&amp;gt;\phi&amp;lt;/math&amp;gt;: &amp;lt;tt&amp;gt;y = sin(f, phi, Fs, T)&amp;lt;/tt&amp;gt;,&lt;br /&gt;
* funkcja Gaussa o zadanym położeniu i szerokości &amp;lt;tt&amp;gt;y = g_1(t0, sigma, Fs, T) &amp;lt;/tt&amp;gt;&lt;br /&gt;
: &amp;lt;math&amp;gt;g_1(t) = \exp\left(-\frac{(t-t_0)^2}{2 \sigma^2}\right)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* pochodną funkcji Gaussa o zadanym położeniu i szerokości &amp;lt;tt&amp;gt;y = g_2(t0, sigma, Fs, T)&amp;lt;/tt&amp;gt;,&lt;br /&gt;
* połowę funkcji Gaussa o zadanym położeniu i szerokości &amp;lt;tt&amp;gt;y = g_3(t0, sigma, Fs, T)&amp;lt;/tt&amp;gt;,&lt;br /&gt;
: &amp;lt;math&amp;gt;g_{3}(t) = \left\{ &lt;br /&gt;
\begin{array}{lll}&lt;br /&gt;
0 &amp;amp; \mathrm{dla}&amp;amp; t&amp;lt;t_0 \\&lt;br /&gt;
\exp\left(-\frac{(t-t_0)^2}{2 \sigma^2}\right)&amp;amp; \mathrm{dla}&amp;amp; t \ge t_0  &lt;br /&gt;
\end{array}&lt;br /&gt;
\right. &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
W dalszych zadaniach tej sekcji przyjmiemy:&lt;br /&gt;
* ''T'' = 1 s,&lt;br /&gt;
* ''F&amp;lt;sub&amp;gt;s&amp;lt;/sub&amp;gt;'' = 128 Hz,&lt;br /&gt;
* ''t''&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; = 0,3 s,&lt;br /&gt;
* &amp;amp;sigma; = 0,02 s.&lt;br /&gt;
&lt;br /&gt;
===Uśrednianie w modelu addytywnym: sygnał + szum===&lt;br /&gt;
Dla funkcji &amp;lt;math&amp;gt;g_1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;g_2&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;g_3&amp;lt;/math&amp;gt;  wykonaj ''N'' symulacji sygnału opisanego daną funkcją z dodanym szumem gaussowskim (&amp;lt;tt&amp;gt;numpy.random.randn&amp;lt;/tt&amp;gt;). Zaobserwuj zmianę wariancji uśrednianego sygnału wraz z ''N''.&lt;br /&gt;
&lt;br /&gt;
===Uśrednianie w modelu addytywnym: sygnał + szum + niezależna czynność rytmiczna===&lt;br /&gt;
Powtórz poprzednie symulacje dokładając w każdej realizacji sinusoidę o losowo wybranej fazie. Symulacje wykonaj dla różnych częstości sinusoidy, takich których połówka okresu zbliżona jest do szerokości funkcji Gaussa, oraz znacząco od niej różnych.&lt;br /&gt;
&lt;br /&gt;
===Uśrednianie w modelu z resetem fazy===&lt;br /&gt;
Zbuduj sygnał składający się z dwóch fragmentów sinusoidy o częstości ''f'': &lt;br /&gt;
* pierwszy fragment ma losową fazę,&lt;br /&gt;
* drugi fragment ma fazę równą 0.&lt;br /&gt;
Wykonaj ''N'' realizacji takiego sygnału, przy czym każda realizacja ma częstość losowaną z rozkładu Gaussa o średniej 10 i pewnej wariancji (czyli &amp;lt;math&amp;gt;f \in \mathrm{N}(10,\sigma)&amp;lt;/math&amp;gt;). &lt;br /&gt;
Uśrednij otrzymane realizacje. Zaobserwuj zależność średniej od liczby uśrednianych realizacji i od wariancji częstości.&lt;br /&gt;
&lt;br /&gt;
===Uśrednianie potencjału z fluktuacją latencji===&lt;br /&gt;
Wygeneruj sygnały składające się z funkcji &amp;lt;math&amp;gt;g_1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;g_2&amp;lt;/math&amp;gt; albo &amp;lt;math&amp;gt;g_3&amp;lt;/math&amp;gt; z fluktuującą latencją, tzn. z wartością &amp;lt;math&amp;gt;t_0&amp;lt;/math&amp;gt; pochodzącą z jakiegoś rozkładu prawdopodobieństwa. U nas dla ustalenia uwagi niech będzie to rozkład Gaussa. Wykonaj zestaw symulacji obrazujący zależność od liczby realizacji i od wielkości fluktuacji, mierzonej przez wariancję rozkładu. Czy jest związek pomiędzy wariancją fluktuacji &amp;lt;math&amp;gt;t_0&amp;lt;/math&amp;gt; a szerokością załamków?&lt;br /&gt;
&lt;br /&gt;
===Wpływ filtrów===&lt;br /&gt;
# Zaprojektuj następujące filtry (przyjmij częstość próbkowania 128 Hz):&lt;br /&gt;
#* dolnoprzepustowy: Butterwortha z częstością odcięcia: 30, 40, 50 Hz, i rzędach od 1 do 5 (funkcja butter w module scipy.signal),&lt;br /&gt;
#* górnoprzepustowy: Butterwortha z częstością odcięcia: 0,1, 0,5, 2 i 5 Hz, i rzędach od 1 do 5,&lt;br /&gt;
#* notch: Czybyszewa II rodzaju z pasmem zaporowym ustawionym na 50 Hz, i rzędach od 1 do 3 (funkcja cheby2),&lt;br /&gt;
# Zbadaj funkcję odpowiedzi impulsowej i funkcję przenoszenia tych filtrów (w skali dB). Zaobserwuj jak długa jest odpowiedź impulsowa i jak daleko od częstości odcięcia zaburzone jest pasmo przenoszenia.&lt;br /&gt;
# Zastosuj powyższe filtry do funkcji &amp;lt;math&amp;gt;g_1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;g_2&amp;lt;/math&amp;gt; albo &amp;lt;math&amp;gt;g_3&amp;lt;/math&amp;gt;. Filtrowanie przeprowadź w jedną (lfilter) oraz w dwie strony (filtfilt). Zaobserwuj związek między zniekształceniem wprowadzanym przez filtr a funkcją odpowiedzi impulsowej filtru.&lt;br /&gt;
# W ćwiczeniu tym posłuż się symulowanymi sygnałami uzyskanymi z modelu addytywnego: &amp;amp;bdquo;sygnał+szum&amp;amp;rdquo;. Dla funkcji &amp;lt;math&amp;gt;g_1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;g_2&amp;lt;/math&amp;gt; albo &amp;lt;math&amp;gt;g_3&amp;lt;/math&amp;gt;  wykonaj ''N'' = 60 realizacji sygnału opisanego daną funkcją z dodanym szumem gaussowskim (&amp;lt;tt&amp;gt;numpy.random.randn&amp;lt;/tt&amp;gt;). Każdą z realizacji przefiltruj, a następnie uśrednij uzyskane sygnały.&lt;br /&gt;
&lt;br /&gt;
==Zadanie 2: rejestracje i analiza potencjałów wzrokowych==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- ===Synchronizacja występowania bodźców z sygnałem EEG===&lt;br /&gt;
&lt;br /&gt;
Rejestracja potencjałów wywołanych jest przykładem pomiaru czynności elektrycznej mózgu w odpowiedzi na określony bodziec. W przypadku tego rodzaju pomiarów konieczna jest synchronizacja momentu wystąpienia bodźca z sygnałem EEG. Wzmacniacze do pomiaru czynności elektrycznej mózgu wyposażone są w specjalne wejścia, na które można podawać sygnał odpowiadający pojawianiu się bodźca. Jak pamiętamy z zeszłego semestru, wejście to (jak i podawany na nie sygnał) nazywamy trigerem (ang. ''trigger'' &amp;amp;mdash; spust, cyngiel, wyzwalacz). W najprostszym przypadku, bodziec moglibyśmy wyświetlać na monitorze komputerowym, a sygnał związany z jego wystąpieniem wysyłać przez któryś z portów komputera (LPT, COM) na wzmacniacz EEG. Niestety, obecnie dostępne i popularne systemy operacyjne, takie jak Windows czy Linux nie są systemami czasu rzeczywistego (http://pl.wikipedia.org/wiki/System_operacyjny_czasu_rzeczywistego). Od momentu wyświetlania bodźca na ekranie, do pojawiania się sygnału odpowiednim porcie komputerowym może upłynąć kilkadziesiąt milisekund i co gorsza czas ten zwykle jest losowy. W przypadku gdy wzmacniacz próbkuje sygnał z częstością 1000 Hz, moment wystąpienia bodźca możemy określić z dokładnością 1 ms, jednakże wspomniane opóźnienia w systemie operacyjnym uniemożliwiają to. Ponadto, jak dowiedzieliśmy się w rozdziale wstępnym [http://brain.fuw.edu.pl/edu-wiki/action/edit/EEG:Potencja%C5%82y_wywo%C5%82ane?section=T-1], pierwsze załamki związane z potencjałami wywołanymi pojawiają się już 10 ms po wystąpieniu bodźca. W związku z tym, losowe, rzędu kilkudziesięciu milisekund opóźnienia sygnału określającego moment pojawienia się bodźca względem jego rzeczywistego wystąpienia są niedopuszczalne.&lt;br /&gt;
Istnieją pewne techniki programowania, dzięki którym opisywane opóźnienia można zmniejszyć, jednakże są one bardzo trudne  do realizacji. Ponadto, standardowe porty komputera, takie jak LPT, czy COM zostały zaprojektowane przede wszystkim do sterowania urządzeniami zewnętrznymi, a nie ich zasilania. Przykładowo, jedna linia portu drukarkowego (LPT) może być obciążona prądem nie większym niż 5 mA, podczas gdy do zapalenie zwykłej diody LED potrzeba około 10 mA. Taki pobór prądu możliwy jest do uzyskania z portu USB, jednakże  jest on  wyjątkowo trudny do oprogramowania.  &lt;br /&gt;
W celu ominięcia powyższych niedogodności w Zakładzie Fizyki Biomedycznej UW w przeprowadzanych eksperymentach wykorzystywane są  mikrokontrolery [http://pl.wikipedia.org/wiki/Mikrokontroler], w szczególności ATmega16 i ATmega32.  Mikrokontrolery te wyposażone są w procesory o architekturze RISC [http://pl.wikipedia.org/wiki/RISC] i mocy obliczeniowej porównywalnej z szeroko stosowanym kiedyś w komputerach ZX Spectrum, Commodore, Amiga i Atari procesorem Z80. Oprócz jednostki centralnej mikrokontrolery zawierają   stałą pamięć FLASH przeznaczoną do przechowywania kodu programu, pamięć  RAM i pamięć EEPROM, liczniki 8- i 16-bitowe, komparatory, przetworniki analogowo-cyfrowe, porty wejścia/wyjścia, łącze RS232 (popularnie nazywane portem szeregowym) i układy przerwań.&lt;br /&gt;
&lt;br /&gt;
Mikrokontrolery wchodzące w skład zestawów pomiarowych na Pracowni EEG zawierają program, który umożliwia komunikację z nimi poprzez port szeregowy. Obecnie, komputery są coraz rzadziej wyposażane w porty szeregowe. Standard komunikacji RS-232, opracowany w 1962 roku  nadal jest jednak popularny i często wykorzystywany do komunikacji miedzy urządzeniami.  W celu połączenia komputera posiadającego tylko porty USB z mikrokontrolerem zastosowano przejściówkę USB/RS-232. &lt;br /&gt;
&lt;br /&gt;
Jak każde urządzenie w systemie Linuks, przejściówka USB/RS-232 widoczna jest jako plik, znajdujący się w katalogu &amp;lt;tt&amp;gt;/dev&amp;lt;/tt&amp;gt;. Nazwy plików obsługujących urządzenia szeregowe to &amp;lt;tt&amp;gt;ttyXY&amp;lt;/tt&amp;gt;, gdzie &amp;lt;tt&amp;gt;XY&amp;lt;/tt&amp;gt; to kolejny numer przydzielony do urządzenia szeregowego.&lt;br /&gt;
Do komunikacji komputera z mikroknotrolerem  w Zakładzie Fizyki Biomedycznej UW została napisana prosta biblioteka.  Jej użycie jest następujące:&lt;br /&gt;
* Po podłączeniu przejściówki USB/RS232 do komputera mikrokontrolera sprawdź jaki plik w katalogu &amp;lt;tt&amp;gt;/dev&amp;lt;/tt&amp;gt; został utworzony i przydzielony do urządzenia. &lt;br /&gt;
* Zaimportuj bibliotekę do komunikacji z mikrokontrolerem: &lt;br /&gt;
: &amp;lt;tt&amp;gt;import SerialPort as SP&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Otwórz plik powiązany z urządzeniem zewnętrznym:&lt;br /&gt;
: &amp;lt;tt&amp;gt;sp = SP.SerialPort(nazwa_pliku) &amp;lt;/tt&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
: &amp;lt;tt&amp;gt;sp.open()&amp;lt;/tt&amp;gt;&lt;br /&gt;
W naszym przypadku prawidłowa nazwa pliku to &amp;lt;tt&amp;gt;/dev/ttyUSB0&amp;lt;/tt&amp;gt;.&lt;br /&gt;
* Po włączeniu zasilania mikrokontrolera, diody podłączone do niego i wykorzystywane w eksperymencie z potencjałami wywołanymi będą zapalone. Następujące polecenie zgasi obydwie diody:&lt;br /&gt;
: &amp;lt;tt&amp;gt;sp.blinkP300([0, 0])&amp;lt;/tt&amp;gt;&lt;br /&gt;
* Wydanie poniższego polecenia spowoduje, iż mikrokontroler zapali podłączoną do niego diodę numer 1 na czas 100 ms, zaś diodę numer 2 na 200 ms. Jednocześnie, w momencie włączenia jak i wyłączenia diody, sygnał z mikrokontrolera zostanie wysłany na 5-stykowe wejście AUX mikrokontrolera:&lt;br /&gt;
: &amp;lt;tt&amp;gt;sp.blinkP300([100, 200])&amp;lt;/tt&amp;gt;&lt;br /&gt;
* Jeśli chcemy zapalić tylko diodę numer dwa, np. na czas 500 ms w programie podajemy następującą instrukcję:&lt;br /&gt;
: &amp;lt;tt&amp;gt;sp.blinkP300([0, 500])&amp;lt;/tt&amp;gt;&lt;br /&gt;
* Jeśli chcemy zakończyć komunikację z mikrokontrolerem piszemy:&lt;br /&gt;
: &amp;lt;tt&amp;gt;sp.close()&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Kod biblioteki do komunikacji z mikrokontrolerem:&amp;lt;br&amp;gt;&lt;br /&gt;
--&amp;gt;&amp;lt;!--  Kod w Pythonie 2&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# -*- coding: cp1250 -*-&lt;br /&gt;
import serial&lt;br /&gt;
import logging&lt;br /&gt;
import sys&lt;br /&gt;
import os&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def to_hex_word(a):&lt;br /&gt;
    '''encodes a decimal number hexadecimally on two bytes'''&lt;br /&gt;
    return chr(a%256) + chr(a/256)&lt;br /&gt;
&lt;br /&gt;
class SerialPort(object):&lt;br /&gt;
    def __init__(self, port_name):&lt;br /&gt;
        import serial&lt;br /&gt;
        try:&lt;br /&gt;
            self.port = serial.Serial(&lt;br /&gt;
                port=port_name,&lt;br /&gt;
                baudrate=9600,&lt;br /&gt;
                bytesize=serial.EIGHTBITS,&lt;br /&gt;
                parity=serial.PARITY_NONE,&lt;br /&gt;
                stopbits=serial.STOPBITS_ONE,&lt;br /&gt;
                xonxoff=False&lt;br /&gt;
                )&lt;br /&gt;
        except serial.SerialException as e:&lt;br /&gt;
            print(&amp;quot;Nieprawidłowa nazwa portu lub port zajęty.&amp;quot;)&lt;br /&gt;
            raise e&lt;br /&gt;
        self.close()&lt;br /&gt;
        &lt;br /&gt;
    def open(self):&lt;br /&gt;
        self.port.open()&lt;br /&gt;
&lt;br /&gt;
    def close(self):&lt;br /&gt;
        self.port.close()&lt;br /&gt;
&lt;br /&gt;
    def send(self, value):&lt;br /&gt;
        self.port.write(value)&lt;br /&gt;
                           &lt;br /&gt;
    def blinkSSVEP(self,d, p1, p2):&lt;br /&gt;
        '''&lt;br /&gt;
        d = list of frequencies;&lt;br /&gt;
        p1:p2 = ratio LED_on_time/LED_off_time&lt;br /&gt;
        if you want i-th LED to be OFF all the time send  d[i] = 0&lt;br /&gt;
        if you want i-th LED to be ON all the time send  d[i] = -1&lt;br /&gt;
        in these two cases p1 and p2 do not matter&lt;br /&gt;
        '''&lt;br /&gt;
        clock  = 62500&lt;br /&gt;
        factor = float(p1) / float(p1 + p2)&lt;br /&gt;
    &lt;br /&gt;
        str = chr(3) # 'SSVEP_RUN'&lt;br /&gt;
&lt;br /&gt;
        for i in range(len(d)):&lt;br /&gt;
            # i-th LED OFF&lt;br /&gt;
            if d[i] == 0:                       &lt;br /&gt;
                str += to_hex_word(0) + to_hex_word(255) &lt;br /&gt;
            # i-th LED ON&lt;br /&gt;
            elif d[i] == -1:&lt;br /&gt;
                str += to_hex_word(255) + to_hex_word(0)&lt;br /&gt;
                #str = 'S'&lt;br /&gt;
                # i-th LED blinks d[i] times per second&lt;br /&gt;
                # p1:p2 = on_time:off_time in one blink&lt;br /&gt;
            else:&lt;br /&gt;
                period = clock/d[i]&lt;br /&gt;
                bright = int((clock/d[i]) * factor)&lt;br /&gt;
                dark = period - bright&lt;br /&gt;
                str += to_hex_word(bright) + to_hex_word(dark)&lt;br /&gt;
&lt;br /&gt;
        self.send(str)&lt;br /&gt;
&lt;br /&gt;
    def blinkP300(self,d):&lt;br /&gt;
        clock  = 62500&lt;br /&gt;
        str = chr(4) # 'P300_RUN'&lt;br /&gt;
&lt;br /&gt;
        for i in range(len(d)):&lt;br /&gt;
            period = int(clock*d[i]/1000.0)&lt;br /&gt;
            str += to_hex_word(period)&lt;br /&gt;
            print(period)&lt;br /&gt;
&lt;br /&gt;
        self.send(str)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
--&amp;gt;&amp;lt;!-- Kod w Pythonie 3 --&amp;gt;&amp;lt;!-- &amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# -*- coding: cp1250 -*-&lt;br /&gt;
import serial&lt;br /&gt;
import logging&lt;br /&gt;
import sys&lt;br /&gt;
import os&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
def to_hex_word(a):&lt;br /&gt;
    '''encodes a decimal number hexadecimally on two bytes'''&lt;br /&gt;
    return a.to_bytes(2,byteorder=sys.byteorder)&lt;br /&gt;
 &lt;br /&gt;
class SerialPort(object):&lt;br /&gt;
    def __init__(self, port_name):&lt;br /&gt;
        import serial&lt;br /&gt;
        try:&lt;br /&gt;
            self.port = serial.Serial(&lt;br /&gt;
                port=port_name,&lt;br /&gt;
                baudrate=9600,&lt;br /&gt;
                bytesize=serial.EIGHTBITS,&lt;br /&gt;
                parity=serial.PARITY_NONE,&lt;br /&gt;
                stopbits=serial.STOPBITS_ONE,&lt;br /&gt;
                xonxoff=False&lt;br /&gt;
                )&lt;br /&gt;
        except serial.SerialException as e:&lt;br /&gt;
            print(&amp;quot;Nieprawidłowa nazwa portu lub port zajęty.&amp;quot;)&lt;br /&gt;
            raise e&lt;br /&gt;
        self.close()&lt;br /&gt;
 &lt;br /&gt;
    def open(self):&lt;br /&gt;
        self.port.open()&lt;br /&gt;
 &lt;br /&gt;
    def close(self):&lt;br /&gt;
        self.port.close()&lt;br /&gt;
 &lt;br /&gt;
    def send(self, value):&lt;br /&gt;
        self.port.write(value)&lt;br /&gt;
 &lt;br /&gt;
    def blinkSSVEP(self,d, p1, p2):&lt;br /&gt;
        '''&lt;br /&gt;
        d = list of frequencies;&lt;br /&gt;
        p1:p2 = ratio LED_on_time/LED_off_time&lt;br /&gt;
        if you want i-th LED to be OFF all the time send  d[i] = 0&lt;br /&gt;
        if you want i-th LED to be ON all the time send  d[i] = -1&lt;br /&gt;
        in these two cases p1 and p2 do not matter&lt;br /&gt;
        '''&lt;br /&gt;
        clock  = 62500&lt;br /&gt;
        factor = float(p1) / float(p1 + p2)&lt;br /&gt;
 &lt;br /&gt;
        str = (3).to_bytes(1,byteorder=sys.byteorder) # 'SSVEP_RUN'&lt;br /&gt;
 &lt;br /&gt;
        for i in range(len(d)):&lt;br /&gt;
            # i-th LED OFF&lt;br /&gt;
            if d[i] == 0:                       &lt;br /&gt;
                str += to_hex_word(0) + to_hex_word(255) &lt;br /&gt;
            # i-th LED ON&lt;br /&gt;
            elif d[i] == -1:&lt;br /&gt;
                str += to_hex_word(255) + to_hex_word(0)&lt;br /&gt;
                #str = 'S'&lt;br /&gt;
                # i-th LED blinks d[i] times per second&lt;br /&gt;
                # p1:p2 = on_time:off_time in one blink&lt;br /&gt;
            else:&lt;br /&gt;
                period = clock/d[i]&lt;br /&gt;
                bright = int((clock/d[i]) * factor)&lt;br /&gt;
                dark = int(period - bright)&lt;br /&gt;
                str += to_hex_word(bright) + to_hex_word(dark)&lt;br /&gt;
 &lt;br /&gt;
        self.send(str)&lt;br /&gt;
 &lt;br /&gt;
    def blinkP300(self,d):&lt;br /&gt;
        clock  = 62500&lt;br /&gt;
        str = (4).to_bytes(1,byteorder=sys.byteorder) # 'P300_RUN'&lt;br /&gt;
 &lt;br /&gt;
        for i in range(len(d)):&lt;br /&gt;
            period = int(clock*d[i]/1000.0)&lt;br /&gt;
            str += to_hex_word(period)&lt;br /&gt;
 &lt;br /&gt;
        self.send(str)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
--&amp;gt;&amp;lt;!--&lt;br /&gt;
&lt;br /&gt;
===Zestaw eksperymentalny===&lt;br /&gt;
Zestaw składa się ze:&lt;br /&gt;
* wzmacniacza,&lt;br /&gt;
* stymulatora   &lt;br /&gt;
--&amp;gt;&amp;lt;!--* izolowanego galwanicznie układu generującego impulsy odpowiadające gaszeniu i zapalaniu diody,  o wartościach dopasowanych do akceptowalnych przez wejścia AUX wzmacniacza,--&amp;gt;&amp;lt;!--&lt;br /&gt;
* komputera: w tym eksperymencie komputer będzie służył do zaprogramowania stymulatora i do rejestracji sygnałów.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
===Eksperyment 1. Obserwacja bodźca wzrokowego  ===&lt;br /&gt;
&amp;lt;!--Proszę zapoznać się ze standardami rejestracji wzrokowych potencjałów wywołanych [http://www.gcu.ac.uk/media/gcalwebv2/theuniversity/academicschools/sls/psytimetables/SLS%20-%20VEP_Standard_2010.pdf] --&amp;gt;&lt;br /&gt;
Proszę zapoznać się z typowym wyglądem załamków w przypadku potencjałów wzrokowych, jaki jest przedstawiony na [https://link.springer.com/article/10.1007/s10633-009-9195-4/figures/2 rysunku] (cały artykuł jest dostępny [http://link.springer.com/article/10.1007%2Fs10633-009-9195-4 tu]).&lt;br /&gt;
&amp;lt;!--[[Plik:Fig 4 VEP.jpg|thumb|320px|right|&amp;lt;figure id=&amp;quot;fig:zalamki_VEP&amp;quot;&amp;gt;&amp;lt;/figure&amp;gt;&lt;br /&gt;
&amp;lt;xr id=&amp;quot;fig:zalamki_VEP&amp;quot;&amp;gt;Rys. %i.&amp;lt;/xr&amp;gt; Schemat załamków rozpoznawanych we wzrokowych potencjach wywołanych (z pracy: J. V. Odom i in. &amp;amp;bdquo;ISCEV standard for clinical visual evoked potentials&lt;br /&gt;
(2009 update)&amp;amp;rdquo;, Doc Ophthalmol (2010), 120:111–119).]]&lt;br /&gt;
--&amp;gt; &lt;br /&gt;
&lt;br /&gt;
==== Rejestracja ====&lt;br /&gt;
* Paradygmat: z odległości około 40 cm badany obserwuje wyświetalny na ekranie biały kwadrat. Bodźce trwają 300 ms i  powtarzają się co 0.5 sekundy. Bodziec poprzedza punkt fiksacji pokazywany przez 300 ms. Natężenie bodźca ma przyjąć jedną z 4 wartości (manipulujemy jego przeźroczystością: 1, 0.7, 0.3 i 0.1, gdzie 1 oznacza brak przeźroczystości). Każda z intensywności bodźca ma pojawić się 100 razy podczas badania, bodźce podawane mają być w sposób losowy. Zadanie poprzedza krótka instrukcja, kończy podziękowanie. &lt;br /&gt;
&lt;br /&gt;
* Pomiar&lt;br /&gt;
**Zakładamy czepek i elektrody w systemie 10-20, dbamy o to by opory pomiędzy elektrodami były poniżej 10 k&amp;amp;Omega; i różnice pomiędzy oporami różnych elektrod nie przekraczały 20%. [[Plik:Glowka10-20 ERPy.svg|thumb|600px|right]]&lt;br /&gt;
** Elektrodę GND mocujemy w otworze czepka odpowiadającym pozycji AFz (na linii centralnej 10% w stronę nosa od elektrody Fz) &lt;br /&gt;
** Montujemy także elektrody M1 i M2 i FCz.&lt;br /&gt;
&lt;br /&gt;
==== Analiza ====&lt;br /&gt;
# Filtrujemy sygnał w paśmie 1-20 Hz.&lt;br /&gt;
# Z ciągłego zapisu wycinamy fragmenty od &amp;amp;minus;300 ms do +800 ms (zero oznacza moment wystąpienia bodźca). W czasie wycinania badamy wycinane fragmenty pod względem zakresu amplitudy (wszystkie kanały powinny mieć amplitudę w granicach &amp;amp;plusmn;75 &amp;amp;mu;V) i zawartości artefaktów od mrugania (w tym celu trzeba oglądając sygnał w SVAROG-u ustalić próg na amplitudę sygnału w kanałach Fp1 i Fp2).&lt;br /&gt;
# W przypadku, gdy dane są zanieczyszczone wieloma mrugnięciami (zwłaszcza tylnych okolicach należy skorzystać z metody ICA w SVAROGU, informcje tutaj: [https://brain.fuw.edu.pl/edu/index.php/Pracownia_EEG/EEG_spoczynkowe#ICA_.28.C4.87wiczenie_dodatkowe.29])&lt;br /&gt;
# Uśredniamy wycięte sygnały.&lt;br /&gt;
# Rysujemy średni potencjał we wszystkich kanałach.&lt;br /&gt;
# Pierwszy sposób: Identyfikujemy załamki P1 i N2. Mierzymy amplitudę P1 jako różnicę między ekstremalną wartością załamka N2 a ekstremalną wartością załamka N2. &lt;br /&gt;
# Drugi sposób: Identyfikujemy załamki P1 i N2. Mierzymy amplitudę P1 w stosunku do zera. &lt;br /&gt;
#porównujemy uzyskane amplitudy w 4 warunkach za pomocą odpowiedniego testu statystycznego (porównanie warunków ze skrajnymi wartościami amplitudy - zastosuj test permutacyjny (opisany poniżej) lub test t-Studenta/nieparametryczny odpowiednik). &lt;br /&gt;
&lt;br /&gt;
**Opis testu permutacyjnego &lt;br /&gt;
Pytanie: Czy intensywność bodźca wpływa na amplitudę potencjału P1?&lt;br /&gt;
Jak stwierdzić czy amplitudy załamków P1 istotnie różnią się pomiędzy seriami?&lt;br /&gt;
&lt;br /&gt;
Musimy przeprowadzić test statystyczny. Możemy skonstruować go np. tak:&lt;br /&gt;
Mamy dwa warunki I i II. Jako statystykę przyjmiemy różnicę pomiędzy amplitudą załamka zmierzoną w serii z dwoma diodami (P2&amp;lt;sub&amp;gt;II&amp;lt;/sub&amp;gt;) a amplitudą zmierzoną w serii z jedną diodą (P2&amp;lt;sub&amp;gt;I&amp;lt;/sub&amp;gt;):&lt;br /&gt;
: ''S'' = P2&amp;lt;sub&amp;gt;II&amp;lt;/sub&amp;gt; &amp;amp;minus; P2&amp;lt;sub&amp;gt;I&amp;lt;/sub&amp;gt;&lt;br /&gt;
Postawmy hipotezę zerową, że nie ma różnicy w amplitudzie pomiędzy warunkiem II a I oraz hipotezę alternatywną, że różnica taka występuje.&lt;br /&gt;
: H&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;: ''S'' = 0&lt;br /&gt;
: H&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;: ''S'' &amp;amp;ne; 0&lt;br /&gt;
Zgodnie z H&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; dla wartości ''S'' nie ma różnicy czy realizacja została zarejestrowana w warunkach I czy II, zatem można losowo poprzypisywać numery warunków do realizacji i w ten sposób uzyskać rozkład statystyki ''S'' pod warunkiem prawdziwości H&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;, czyli obliczyć średnie potencjały dla &amp;amp;bdquo;pomieszanych&amp;amp;rdquo; tagów, wyliczyć średnie potencjały dla sztucznie wygenerowaych grup, i wyliczyć różnicę amplitud dla tych średnich, czyli wartość statystyki dla hipotezy H&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Zaimplementuj test permutacyjny zgodny z powyższą koncepcją.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- ===Wersja 2: obserwacja habituacji / uśrednianie w blokach ===&lt;br /&gt;
==== Rejestracja ====&lt;br /&gt;
# Paradygmat: &lt;br /&gt;
#* z odległości około 40 cm badany obserwuje błyski diody. &lt;br /&gt;
#* Błyski powtarzają się co 0,5 sekundy. &lt;br /&gt;
#* Rejestrujemy 60 serii po 15 błysków.  &lt;br /&gt;
#* Pomiędzy seriami badany odpoczywa około 10 sekund.&lt;br /&gt;
# Zakładamy czepek i elektrody w systemie 10-20, dbamy o to by opory pomiędzy elektrodami były poniżej 5 k&amp;amp;Omega; i różnice pomiędzy oporami różnych elektrod nie przekraczały 20%.&lt;br /&gt;
#* Elektrodę GND mocujemy w otworze czepka odpowiadającym pozycji AFz (na linii centralnej 10% w stronę nosa od elektrody Fz) &lt;br /&gt;
#* Montujemy także elektrodę FCz (na linii centralnej pomiędzy Fz a Cz), będziemy jej używać w montażu i w czasie analizy jako referencji.&lt;br /&gt;
#* Częstość próbkowania 512 Hz.&lt;br /&gt;
&lt;br /&gt;
==== Analiza ====&lt;br /&gt;
# Filtrujemy sygnał w paśmie 0,1-20 Hz.&lt;br /&gt;
# Z ciągłego zapisu wycinamy fragmenty od &amp;amp;minus;300 ms do +600 ms (zero oznacza moment wystąpienia bodźca). W czasie wycinania badamy wycinane fragmenty pod względem zakresu amplitudy (wszystkie kanały powinny mieć amplitudę w granicach &amp;amp;plusmn;75 &amp;amp;mu;V) i zawartości artefaktów od mrugania (w tym celu trzeba oglądając sygnał w SVAROG-u ustalić próg na amplitudę sygnału w kanałach Fp1 i Fp2).&lt;br /&gt;
# Uśredniamy wycięte sygnały o tym samym numerze wewnątrz serii.&lt;br /&gt;
# Rysujemy serie 15 uśrednionych potencjałów dla tego kanału, który wykazywał najsilniejszy potencjał w pierwszej wersji eksperymentu. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Eksperyment 2: rejestracja i analiza potencjału P3 ===&lt;br /&gt;
====Rejestracja ====&lt;br /&gt;
# Paradygmat: &lt;br /&gt;
#* z odległości około 40 cm badany obserwuje kwadrat, który występuje w dwóch kolorach. &lt;br /&gt;
#* Bodźce trwają 300 ms, poprzedzane punktem fiksacji wyświetlanym na 300 ms, przerwa między próbami jest losowana i wynosi od 0.8-1.2 s.  &lt;br /&gt;
#* Proporcja wystapień bodźców koloru pierwszego i drugiego wynosi 1:5.   &lt;br /&gt;
#* Zadaniem badanego jest liczenie kwadratów w rzadkim kolorze. &lt;br /&gt;
#* Wykonujemy tyle realizacji aby zarejestrować 100 powtórzeń bodźców rzadkich. &lt;br /&gt;
# Zakładamy czepek i elektrody w systemie 10-20, dbamy o to by opory pomiędzy elektrodami były poniżej 5 k&amp;amp;Omega; i różnice pomiędzy oporami różnych elektrod nie przekraczały 20%.&lt;br /&gt;
#* Elektrodę GND mocujemy w otworze czepka odpowiadającym pozycji AFz (na linii centralnej 10% w stronę nosa od elektrody Fz) &lt;br /&gt;
#* Montujemy także elektrody M1 i M2, będziemy ich używać w montażu i w czasie analizy jako referencji typu połączone uszy.&lt;br /&gt;
#* Częstość próbkowania 512 Hz.&lt;br /&gt;
&lt;br /&gt;
==== Analiza ====&lt;br /&gt;
# Filtrujemy sygnał w paśmie 1-20 Hz.&lt;br /&gt;
# Z ciągłego zapisu wycinamy fragmenty od &amp;amp;minus;300 ms do +900 ms (zero oznacza moment wystąpienia bodźca). W czasie wycinania badamy wycinane fragmenty pod względem zakresu amplitudy (wszystkie kanały powinny mieć amplitudę w granicach &amp;amp;plusmn;75 &amp;amp;mu;V) i zawartości artefaktów od mrugania (w tym celu trzeba oglądając sygnał w SVAROG-u ustalić próg na amplitudę sygnału w kanałach Fp1 i Fp2).&lt;br /&gt;
# Uśredniamy osobno realizacje dla każdego koloru kwadratu. &lt;br /&gt;
# Nakładamy na siebie na rysunkach oba typy średnich.&lt;br /&gt;
# wyznaczamy amplitudę P3 i liczymy test statystyczny pomiędzy warunkami&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- ==Ćwiczenie dodatkowe: P300 BCI==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wykorzystujemy elektrody z systemu 10-10 umieszczone nad korą wzrokową: P07, O1, O2, PO8, PO3, PO4, Pz, Cz.&lt;br /&gt;
&lt;br /&gt;
Uruchamiamy &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
obci_gui --presets eeg_workshop&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
i z guzika &amp;amp;bdquo;select amplifier&amp;amp;rdquo; wybieramy właściwy wzmacniacz.&lt;br /&gt;
&lt;br /&gt;
Do kontroli jakości sygnału możemy uruchomić Svaroga.&lt;br /&gt;
&lt;br /&gt;
Dane z kalibracji zapisują się w pliku test1 w katalogu domowym użytkownika, z labiryntu w pliku test2.&lt;br /&gt;
&lt;br /&gt;
Po zakończeniu kalibracji pojawia się napis &amp;amp;bdquo;Trwają obliczenia&amp;amp;rdquo; lub podobny. Odczekujemy kilka minut, aż skończy się peer &amp;amp;bdquo;Calibration&amp;amp;rdquo; (widoczny w obci_gui) i zamykamy okienko klawiszami Alt-F4 lub zatrzymując scenariusz guzikiem &amp;amp;bdquo;Stop&amp;amp;rdquo;. W katalogu domowym pojawi się plik z wynikami kalibracji, co pozwala na uruchomienie scenariusza &amp;amp;bdquo;labirynt&amp;amp;rdquo;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Po zebraniu danych, przed wczytaniem ich do Svaroga należy w tym samym katalogu uruchomić skrypt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
#!/usr/bin/env python&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
&lt;br /&gt;
from obci.analysis.obci_signal_processing.tags import tags_file_writer&lt;br /&gt;
from obci.analysis.obci_signal_processing.read_manager import ReadManager&lt;br /&gt;
&lt;br /&gt;
def main(): &lt;br /&gt;
	file_name = 'test1'&lt;br /&gt;
	&lt;br /&gt;
	mgr = ReadManager(&lt;br /&gt;
		file_name + '.obci.xml',&lt;br /&gt;
		file_name + '.obci.raw',&lt;br /&gt;
		file_name + '.obci.tag')&lt;br /&gt;
	&lt;br /&gt;
	tags = mgr.get_tags()&lt;br /&gt;
	for i in xrange(0, len(tags)):&lt;br /&gt;
		if tags[i]['desc']['index'] == tags[i]['desc']['target']:&lt;br /&gt;
			tags[i]['name'] = 'blink_target'&lt;br /&gt;
		else:&lt;br /&gt;
			tags[i]['name'] = 'blink'&lt;br /&gt;
			&lt;br /&gt;
	tags_writer = tags_file_writer.TagsFileWriter(file_name + '.obci.tag')&lt;br /&gt;
	for tag in tags:&lt;br /&gt;
		tags_writer.tag_received(tag)		&lt;br /&gt;
	tags_writer.finish_saving(0)	&lt;br /&gt;
 &lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Zadanie 3. Analiza Heartbeat-Evoked Potential (HEP)== &lt;br /&gt;
&lt;br /&gt;
Celem tego zadania jest zaobserwowanie występowania ERP związanego z działaniem serca (szczegóły można doczytać tutaj: [https://www.sciencedirect.com/science/article/pii/S1053811919303738?via%3Dihub]. W zadaniu tym wykorzystany dane spoczynkowe zebrane podczas pierwszej rejestracji. &lt;br /&gt;
* w pierwszym kroku signał montujemy i filtrujemy&lt;br /&gt;
* następnie zaznaczamy fragmenty sygnału, w których widzimy artefakty  &lt;br /&gt;
* w drugim robimy detekcję załamków R z EKG - po ich podstawie będziemy cieli sygnał (-200-600ms po R) &lt;br /&gt;
* następnie uśredniamy orzymane odcinki&lt;/div&gt;</summary>
		<author><name>Aduszyk</name></author>
		
	</entry>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=Pracownia_EEG/Potencja%C5%82y_wywo%C5%82ane&amp;diff=8985</id>
		<title>Pracownia EEG/Potencjały wywołane</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=Pracownia_EEG/Potencja%C5%82y_wywo%C5%82ane&amp;diff=8985"/>
		<updated>2022-11-08T11:47:05Z</updated>

		<summary type="html">&lt;p&gt;Aduszyk: /* Zadanie 3. Analiza Heartbeat-Evoked Potential (HEP) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Pracownia EEG|Pracownia EEG]] / Potencjały wywołane&lt;br /&gt;
&lt;br /&gt;
=Wstęp=&lt;br /&gt;
==Potencjały wywołane==&lt;br /&gt;
=== Wstęp ===&lt;br /&gt;
Potencjały wywołane EEG (ang. ''evoked potentials'', EP) są śladami odpowiedzi mózgu na bodźce. W przypadku MEG poprawnie mówi się o polach wywołanych (ang. ''evoked fields'', EF).&lt;br /&gt;
Zwykle reakcja ta jest mała (wyjątek stanowią [[Elektroencefalografia/Metody_analizy_sygnałów_EEG_-_analiza_w_dziedzinie_czasu |kompleksy K]]) i w zapisie pojedynczej realizacji reakcji na bodziec najczęściej niewidoczna wśród czynności pochodzącej od wielu innych procesów zachodzących w tym samym czasie w mózgu. &lt;br /&gt;
Ich wyodrębnienie z tak zwanego tła EEG/MEG, czyli manifestacji elektrycznej innych, trwających w tym samym czasie w mózgu procesów (aktywny prąd niezależny), wymaga w dniu dzisiejszym zapisu odpowiedzi na szereg powtórzeń tego samego bodźca (&amp;lt;xr id=&amp;quot;fig:EP&amp;quot;&amp;gt;rys. %i&amp;lt;/xr&amp;gt;). Pierwsze potencjały wywołane pokazał pod koniec lat 40-tych Dawson (Dawson 1947) wykonując superpozycję pojedynczych realizacji na kliszy fotograficznej.&lt;br /&gt;
Z czasem skomplikowane urządzenia analogowe zastąpione zostały przez cyfrowe uśrednianie kolejnych fragmentów EEG, zsynchronizowanych według momentu wystąpienia bodźca, łatwo realizowane za pomocą komputera.&lt;br /&gt;
&lt;br /&gt;
[[Grafika:EP.png|thumb|640px|center|&amp;lt;figure id=&amp;quot;fig:EP&amp;quot;&amp;gt;&amp;lt;/figure&amp;gt;&lt;br /&gt;
Uśrednianie potencjałów wywołanych. a) ciągły zapis EEG z wyróżnionymi momentami wystąpienia bodźca (w tym przypadku słuchowego) b) kilkadziesiąt kolejnych odcinków, wyciętych jako sekunda EEG od momentu wystąpienia kolejnych bodźców, ustawione jeden pod drugim c) uśredniony potencjał wywołany &amp;amp;mdash; widać m. in. załamek P300 ok. 300 milisekund po bodźcu]]&lt;br /&gt;
&lt;br /&gt;
Techniki te opierają się na założeniu, że zawarta w EEG odpowiedź mózgu na każdy z kolejnych bodźców jest niezmienna, a EEG odzwierciedlające pozostałe procesy traktowane jest jak nieskorelowany z nią proces stochastyczny. Zależnie od rodzaju potencjałów wywołanych, założenia te są mniej lub bardziej nieuzasadnione; podważa je choćby powszechnie znany efekt habituacji, polegający na osłabieniu późnych potencjałów wywołanych kolejnymi powtórzeniami bodźca.&lt;br /&gt;
&lt;br /&gt;
Istota potencjałów wywołanych jest przedmiotem otwartej dyskusji i dziesiątków prac, dotykających od lat podstawowych w tej dziedzinie pytań: czym jest potencjał wywołany, który widzimy w uśrednionym przebiegu? Czy naprawdę wynika z deterministycznie powtarzanej, jednakowej odpowiedzi pojawiającej się po każdym powtórzeniu bodźca niezależnie od &amp;amp;bdquo;tła&amp;amp;rdquo;, czy może wynika z reorganizacji faz tego właśnie &amp;amp;bdquo;tła&amp;amp;rdquo; EEG, czy może kombinacji tych dwóch efektów? Jest to wspaniałe pole dla zastosowań zaawansowanych metod modelowania i analizy sygnałów. W ostatnich latach powstają dziesiątki prac na ten temat, a od czasu do czasu również krytyczne artykuły wykazujące, że dotychczasowe odkrycia są raczej artefaktami stosowanych metod a nie wynikają z własności analizowanych danych (Yeung et al., 2004). Jak widać jest tu wciąż bardzo wiele do zrobienia, gdyż zrozumienie tego mechanizmu stoi na drodze do &amp;amp;bdquo;świętego Graala&amp;amp;rdquo;, którym w tej dziedzinie jest wyodrębnienie pojedynczych potencjałów wywołanych.&lt;br /&gt;
&lt;br /&gt;
Niezależnie od tego, w neurofizjologii klinicznej nazwą potencjał wywołany określa się krzywą widoczną po uśrednieniu odpowiedzi na kilkanaście do kilku tysięcy bodźców (Szelenberger 2000). Gromadzona od dziesięcioleci wiedza o behawioralnych i klinicznych korelatach potencjałów wywołanych opiera się na rozpoznawaniu w przebiegach uśrednionych tak zwanych załamków, czyli przejściowych wzrostów lub spadków potencjału (na przykład na &amp;lt;xr id=&amp;quot;fig:EP&amp;quot;&amp;gt;rys. %i&amp;lt;/xr&amp;gt; widać załamek P300). Nazwy załamków składają się zwykle z litery &amp;amp;bdquo;P&amp;amp;rdquo; (od ang. ''positive''), jeśli wychylenie jest dodatnie, lub &amp;amp;bdquo;N&amp;amp;rdquo; (od ang. ''negative''), jeśli wychylenie jest ujemne, oraz liczby. Uwaga: &lt;br /&gt;
* Nie ma niestety jednej ustalonej konwencji prezentacji potencjałów koniecznie trzeba więc zwracać uwagę na orientację wykresu, a wykonując wykres samemu - zamieszczać informację o orientacji kierunku dodatniego,gdyż kierunek dodatni może być wykresie skierowany do góry lub do dołu. &lt;br /&gt;
* Liczba następująca po N lub P określa przybliżoną liczbę milisekund od wystąpienia bodźca, czyli tak zwaną latencję. Nie można jednak ścisłego związku między tą liczbą a liczbą milisekund np. potencjał P300 w zależności od szczegółów paradygmatu doświadczalnego może wystąpić znacznie później. np. w eksperymentach językowych zdarza się że P300 występuje później niż N400 :-).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;xr id=&amp;quot;fig:zalamki&amp;quot;&amp;gt;Rys. %i&amp;lt;/xr&amp;gt; przedstawia schematycznie najważniejsze załamki rozpoznawane w potencjałach słuchowych, czyli wywoływanych bodźcem dźwiękowym. Dla potencjałów wzrokowych i somatosensorycznych istnieją podobne klasyfikacje.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Grafika:Zalamki.png|thumb|320px|right|&amp;lt;figure id=&amp;quot;fig:zalamki&amp;quot;&amp;gt;&amp;lt;/figure&amp;gt;&lt;br /&gt;
Orientacyjny schemat załamków rozpoznawanych w słuchowych potencjach wywołanych, na podstawie (Szelenberger 2000). Skala czasu logarytmiczna. Najszybsze (do 12 ms) składowe egzogenne to potencjały pniowe (BAEP), oznaczane jako fale I-VII. Litery &amp;amp;bdquo;P&amp;amp;rdquo; i &amp;amp;bdquo;N&amp;amp;rdquo; oznaczają dodatnie i ujemne wychylenia związane z dalszymi załamkami]]&lt;br /&gt;
&lt;br /&gt;
Najszybsze (czyli o najmniejszej latencji) składowe to potencjały egzogenne, odzwierciedlające wstępne fazy przekazu informacji. W potencjałach słuchowych są to potencjały pnia (ang. ''brainstem auditory evoked potentials'', BAEP), składające się z siedmiu fal występujących pomiędzy 1 a 12 ms od bodźca. Są one generowane np. w nerwie słuchowym czy pniu mózgu, i wykorzystywane w klinicznej diagnostyce integralności dróg słuchowych. Podobnie jak inne wczesne potencjały o latencjach poniżej 100 ms, są praktycznie niezależne od stanu uwagi.&lt;br /&gt;
&lt;br /&gt;
Po potencjałach o średniej latencji (między 12 a 50 ms) zaczynają się późne potencjały słuchowe (od 100 ms od podania bodźca), odzwierciedlające bardziej złożone reakcje na bodziec. Potencjały ok. 100 ms obserwowane w okolicach sensorycznych odzwierciedlają odpowiedź tejże kory na bodziec. Ich amplituda zależy od parametrów fizycznych bodźca oraz od uwagi, np. amplituda załamka N100 wzrasta w stanie skupienia uwagi czy pobudzenia emocjonalnego. Pierwszy i najpopularniejszy całkowicie endogenny załamek to P300, pojawiający się po rozpoznaniu bodźca oczekiwanego, na którym skupiamy uwagę: na przykład, jeśli w serii pojawiających się losowo liter mamy zliczać wystąpienia jednej z nich, to na średniej odpowiedzi na pojawienie się tej litery pojawi się załamek P300. Załamek ten występuje również w odpowiedzi na bodźce wyczekiwane, niespodziewane i ważne dla osoby (np. własne imię). &lt;br /&gt;
&lt;br /&gt;
=== Uśrednianie w dziedzinie czasu ===&lt;br /&gt;
Jak już było wspomniane powyżej podstawową techniką stosowaną do analizy potencjałów wywołanych jest uśrednianie wielu realizacji odpowiedzi na bodziec wyrównanych względem jakiegoś charakterystycznego zdarzenia, np. momentu podania bodźca albo momentu behawioralnej reakcji na bodziec (np. wciśnięcie przycisku). Podejście to bazuje na trzech założeniach:&lt;br /&gt;
* Reakcja jest czasowo związana z bodźcem. Tzn. w kolejnych realizacjach występuje ona zawsze z tym samym opóźnieniem.&lt;br /&gt;
* Reakcja na bodziec skutkuje zawsze pojawieniem się w sygnale składowej o stałym kształcie (mówimy o stałej morfologii).&lt;br /&gt;
* Spontaniczna czynność EEG &amp;amp;mdash; ta która nie dotyczy przetwarzania interesującego nas bodźca &amp;amp;mdash; jest niezależnym, stacjonarnym szumem o średniej zero.&lt;br /&gt;
&lt;br /&gt;
Zgodnie z powyższymi założeniami mierzony w ''i''-tej realizacji sygnał można wyrazić jako:&lt;br /&gt;
: &amp;lt;math&amp;gt;x_i(t) = s(t) + n_i(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
Uśrednianie po ''N'' realizacjach daje:&lt;br /&gt;
: &amp;lt;math&amp;gt;\bar x (t) = \frac{1}{N} \sum_{i=1}^N x_i(t) = \frac{1}{N} \left(N s(t) + \sum_{i=1}^N n_i(t) \right) &amp;lt;/math&amp;gt;&lt;br /&gt;
Wartość oczekiwana średniego sygnału wynosi:&lt;br /&gt;
: &amp;lt;math&amp;gt;\mathrm{E}\left[ \bar x(t) \right] = s(t) &amp;lt;/math&amp;gt;&lt;br /&gt;
gdyż dla szumu o średniej zero mamy:&lt;br /&gt;
: &amp;lt;math&amp;gt;\mathrm{E}\left[\frac{1}{N} \sum_{i=1}^N n_i(t)\right] = 0&amp;lt;/math&amp;gt;.&lt;br /&gt;
Wariancja &amp;lt;math&amp;gt;\bar x(t)&amp;lt;/math&amp;gt; wynosi:&lt;br /&gt;
: &amp;lt;math&amp;gt;\sigma^2_{\bar x(t)} = \mathrm{E} \left[  \left( \frac{1}{N} \sum_{i=1}^N n_i(t)\right)^2 \right] \approx \frac{1}{N} \sigma^2_{n(t)}&amp;lt;/math&amp;gt;&lt;br /&gt;
gdyż &amp;lt;math&amp;gt;s(t)&amp;lt;/math&amp;gt; jest deterministyczne. &lt;br /&gt;
&lt;br /&gt;
Dla potencjałów pojawiających się w pierwszych kilkudziesięciu milisekundach po bodźcu model ten można uznać za poprawny, gdyż wykazują one zależność głównie od parametrów fizycznych bodźca. Dla późniejszych składowych staje się on coraz bardziej wątpliwy ze względu na występujące korelacje ze stanem (np. uwagi) badanego.&lt;br /&gt;
&lt;br /&gt;
Dla późniejszych składowych można by postulować bardziej ogólną wersję modelu potencjału wywołanego:&lt;br /&gt;
: &amp;lt;math&amp;gt;x_i(t) = s_i(t) + n_i(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
Ten model uwidacznia, że do opisu potencjału wywołanego potrzebna jest nie tylko średnia, ale i wyższe momenty rozkładu (np. drugi moment centralny czyli wariancja).&lt;br /&gt;
&lt;br /&gt;
====Wariancja w przypadku szumu skorelowanego ====&lt;br /&gt;
W poprzednim paragrafie pokazaliśmy, że w przypadku niezależnego szumu wariancja uśrednionego sygnału (w danej chwili czasu) maleje jak  &amp;lt;math&amp;gt;\frac{1}{N}&amp;lt;/math&amp;gt;. Jednak w przypadku gdy kolejne próbki szumu są skorelowane (np. występuje silna aktywność rytmiczna alfa) sytuacja się komplikuje. Intuicyjnie łatwo możemy to sobie wyobrazić w granicznym przypadku. Załóżmy, że tło dla  potencjałów o stałej morfologii   stanowi sinusoida. Jeśli będziemy podawać bodźce w odstępach będących wielokrotnością okresu tej sinusoidy to w uśrednianych fragmentach sygnału owa sinusoida jest tak samo powtarzalna jak badany potencjał i uśrednianie nie prowadzi do poprawy stosunku amplitudy sygnału do amplitudy tła. &lt;br /&gt;
&lt;br /&gt;
Stopień zależności pomiędzy próbkami można zmierzyć przy pomocy funkcji autokorelacji. &lt;br /&gt;
Jeśli funkcję autokorelacji przybliżymy przez:&lt;br /&gt;
: &amp;lt;math&amp;gt;R_{xx}(\tau) = \sigma^2 \exp(-\beta |\tau|) \cos(2 \pi f_0 \tau)&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\sigma^2&amp;lt;/math&amp;gt; jest wariancją szumu, &amp;lt;math&amp;gt;f_0&amp;lt;/math&amp;gt; jest średnią częstością aktywności rytmicznej, &amp;lt;math&amp;gt;\beta/ \pi&amp;lt;/math&amp;gt; jest szerokością pasma tej czynności, zaś &amp;lt;math&amp;gt;\tau&amp;lt;/math&amp;gt; opóźnieniem, to wariancję potencjału wywołanego można wyrazić jako&amp;lt;!-- \cite{Spekreijse_1976}--&amp;gt;:&lt;br /&gt;
: &amp;lt;math&amp;gt;\sigma^2_{\bar x(t)} = \frac{\sigma^2}{N} \left[ \frac{1-\exp(-2 \beta T)}{1 - 2 \exp(- \beta T) \cos(2 \pi f_0 T) +\exp(-2 \beta T)} \right]&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; jest odstępem między bodźcami. &lt;br /&gt;
Widać stąd, że obecność czynności rytmicznej w tle wpływa na stosunek sygnału do szumu. Z powyższego równania widać, że stosunek wariancji dąży do &amp;lt;math&amp;gt;\frac{\sigma^2}{N}&amp;lt;/math&amp;gt; gdy &amp;lt;math&amp;gt;\beta T&amp;lt;/math&amp;gt; staje się duże.  &lt;br /&gt;
&lt;br /&gt;
Periodyczna stymulacja może ponadto prowadzić do wzbudzenia czynności rytmicznej o częstości równej częstości pobudzania bądź jej harmonicznej.&lt;br /&gt;
&lt;br /&gt;
===Wariancja latencji===&lt;br /&gt;
&lt;br /&gt;
Jedną z form zmienności potencjału wywołanego w pojedynczych realizacjach jest wariancja latencji. &lt;br /&gt;
[[Grafika:Wariancja_latencji.png|thumb|500px|right|&lt;br /&gt;
Czerwona linia: Uśrednianie 100 potencjałów wywołanych o latncjach z rozkładu normalnego N(300,30 ), Niebieskie linie: przykładowe pojedyncze realizacje wzięte do średniej]]&amp;lt;!--# -*- coding: utf-8 -*-&lt;br /&gt;
from __future__ import division&lt;br /&gt;
import numpy as np&lt;br /&gt;
from matplotlib.pyplot import plot, show ,subplot, figure, title, xlabel, ylabel, ylim&lt;br /&gt;
 &lt;br /&gt;
def fun(t,lat=100):&lt;br /&gt;
    return np.exp(-(t-lat)**2/(2*30**2))&lt;br /&gt;
Fs = 1&lt;br /&gt;
N = 100&lt;br /&gt;
t = np.arange(0,700)&lt;br /&gt;
f = np.zeros((N,700))&lt;br /&gt;
f_sr = np.zeros(t.shape)&lt;br /&gt;
for i in range(N):&lt;br /&gt;
    f[i,:] = fun(t,lat = 300 + 30* np.random.randn())&lt;br /&gt;
for i in range(3):&lt;br /&gt;
    plot(t,f[i,:], 'b')&lt;br /&gt;
plot(t,f.mean(0),'r')&lt;br /&gt;
show()--&amp;gt;&lt;br /&gt;
Zmienność latencji prowadzi do:&lt;br /&gt;
* zmniejszenia amplitudy &amp;lt;math&amp;gt;\bar x&amp;lt;/math&amp;gt;&lt;br /&gt;
* wzrostu rozciągłości czasowej załamka&lt;br /&gt;
&lt;br /&gt;
O tych konsekwencjach zmienności latencji należy w szczególności pamiętać porównując średnie potencjały uzyskane w różnych warunkach eksperymentalnych. Gdy zauważymy, że średnie potencjały różnią się amplitudą należy rozważyć możliwość, że w istocie warunki eksperymentalne wpływają na różnice w wariancji latencji. &lt;br /&gt;
&lt;br /&gt;
Naturalne jest, że zmienność latencji jest bardziej widoczna w przypadku załamków trwających krótko niż w przypadku załamków trwających długo. Wariancja latencji rożnie wraz z jej wartością, stąd wśród późnych składowych potencjałów wywołanych nie obserwuje się komponentów krótkotrwałych.&lt;br /&gt;
&amp;lt;!--====Uśrednianie metodą Woody'ego ====&lt;br /&gt;
&lt;br /&gt;
Model potencjału ze zmienną latencją i sposób na jego efektywniejsze uśrednianie zaproponował Woody (1967). Model ten zakłada, że w każdej realizacji występuje komponent addytywny &amp;lt;math&amp;gt;s_i(t)\;&amp;lt;/math&amp;gt;, który co do kształtu jest stały, a pomiędzy realizacjami różni się tylko latencją:&lt;br /&gt;
: &amp;lt;math&amp;gt; s_i(t) = s(t +\Delta t_i)\;&amp;lt;/math&amp;gt;&lt;br /&gt;
Woody zaproponował aby &amp;lt;math&amp;gt;\Delta t_i\;&amp;lt;/math&amp;gt; szacować na podstawie maksimum funkcji korelacji wzajemnej pomiędzy ''i''-tą realizacją a wzorcem. W pierwszym kroku wzorcem jest średni potencjał uzyskany przez proste uśrednienie realizacji.  Następnie w sposób iteracyjny dokonuje się:&lt;br /&gt;
* poprawek w wyrównaniu poszczególnych realizacji,&lt;br /&gt;
* obliczenia nowego wzorca poprzez uśrednienie realizacji po korekcie wyrównania,&lt;br /&gt;
* obliczenia nowych poprawek do wyrównania realizacji.--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Habituacja ===&lt;br /&gt;
Zmienność w odpowiedziach na kolejno występujące po sobie bodźce można podzielić na komponent stochastyczny i deterministyczny. Komponent deterministyczny odzwierciedla zmianę czułości  układu nerwowego  na kolejne bodźce. Nowy bodziec często wywołuje reakcje pobudzenia widoczną w wielu parametrach takich jak przewodnictwo skóry, rytm serca i reaktywność kory mózgowej. Powszechnie obserwowanym zjawiskiem jest spadek reaktywności na powtarzające się bodźce zwany habituacją. Niekiedy obserwuje się także zjawisko przeciwne &amp;amp;mdash; wzrost reaktywności na bodziec &amp;amp;mdash; zwane sensytyzacją. &lt;br /&gt;
&lt;br /&gt;
Klasycznym sposobem na badanie tych zjawisk w potencjałach wywołanych jest uśrednianie w podzbiorach lub  uśrednianie blokowe. Wymaga ono  zmiany paradygmatu rejestracji danych. Załóżmy, że interesującym nas bodźcem jest błysk światła. Chcemy zaobserwować ewentualne zmiany amplitudy i latencji w ciągu 100 potencjałów będących reakcją na błysk powtarzający się co 500 ms.&lt;br /&gt;
====Uśrednianie w podzbiorach ====&lt;br /&gt;
W metodzie tej musimy założyć, że proces habituacji jest powolny, tzn. zmiany pomiędzy kolejnymi reakcjami są bardzo małe. W takim przypadku możemy podzielić długą serię bodźców na ciąg pod-serii i uśrednienie przeprowadzić dla każdej pod-serii osobno.&lt;br /&gt;
[[Plik:Usrednianie_podzbiory.svg‎|640px|thumb|center|Ilustracja uśredniania w podzbiorach]]&lt;br /&gt;
&lt;br /&gt;
====Uśrednianie blokowe====&lt;br /&gt;
W tym celu eksperyment wykonujemy w wielu seriach. Jedna seria składa się ze 100 błysków powtarzanych co 500 ms.  Po serii następuje przerwa trwająca np. 5 s (długość przerwy wyraża nasze oszacowanie czasu potrzebnego na zanik habituacji). Po przerwie seria jest powtarzana. Powtórzeń serii wykonujemy ''N''.&lt;br /&gt;
Następnie uśredniamy fragmenty sygnałów odpowiadające sobie w kolejnych seriach. &lt;br /&gt;
&lt;br /&gt;
W tym paradygmacie zakładamy, że każda seria rejestrowana jest w tych samych warunkach. Zaniedbujemy efekty związane ze zmęczeniem i zmianami w np. stopniu koncentracji badanego.&lt;br /&gt;
[[Plik:Usrednianie blokowe.svg|Usrednianie blokowe.svg|640px|thumb|center|Ilustracja uśredniania w blokach]]&lt;br /&gt;
&lt;br /&gt;
===Załamki w krzywej potencjału wywołanego vs ukryte komponenty===&lt;br /&gt;
Komponenta potencjału wywołanego to bardzo ważne ale jednocześnie źle określone pojęcie. Krzywa otrzymana w wyniku uśredniania potencjałów wywołanych przedstawia serię załamków dodatnich i ujemnych, ale trzeba być świadomym, że ten przebieg napięcia rejestrowany przez elektrody przedstawia tak naprawdę sumę potencjałów pochodzących od wielu dość niezależnie działających źródeł w mózgu. Przyczynek pochodzący od jednego funkcjonalnego źródła będziemy określać jako komponentę. &lt;br /&gt;
&lt;br /&gt;
Komentarza wymaga też pojęcie źródła funkcjonalnego. Czynność elektryczną synchronicznie działających neuronów piramidalnych w określonym fragmencie kory mózgowej z pewnej odległości można przybliżyć potencjałem dipola prądowego. Taki aktywny fragment kory stanowi źródło dające przyczynek do mierzonego na powierzchni głowy potencjału. W najprostszej sytuacji taki przyczynek może być obserwowany jako komponenta. Mózg jest jednak obiektem niezwykle złożonym i gęsto połączonym. Wiele obszarów korowych może być funkcjonalnie połączonych i aktywowanych synchronicznie w celu realizacji określonego zadania &amp;amp;mdash; o takim funkcjonalnym zespole też możemy myśleć jako o pojedynczym źródle, choć może ono mieć złożoną strukturę przestrzenną. Często zatem myślimy o komponentach ukrytych potencjału wywołanego jako o aktywności takich funkcjonalnych zespołów. &lt;br /&gt;
&lt;br /&gt;
Po tym wstępie widać już chyba, że do zrozumienia co dzieje się w czasie reakcji na bodziec, którą obserwujemy w potencjale wywołanym, bardziej pożądane byłoby badanie komponent ukrytych niż poszczególnych załamków krzywej potencjału wywołanego, która stanowi ważoną sumę owych komponentów. Zanim przejdziemy do omówienia technik służących &amp;amp;bdquo;wyłuskiwaniu&amp;amp;rdquo; komponent prześledźmy kilka symulacji i wnioski z nich płynące.&lt;br /&gt;
&lt;br /&gt;
==== Załamki i komponenty nie są tym samym.====&lt;br /&gt;
Tę samą krzywą można otrzymać na nieskończenie wiele sposobów  przez sumowanie rożnych kombinacji domniemanych komponentów. Przykładowy rysunek pokazuje, jak tę samą krzywą można złożyć z dwóch rożnych zestawów komponentów (kod wytwarzający przykładową symulację pokazany jest poniżej).&lt;br /&gt;
[[Plik:Sumowanie_komponentow1.png|center|thumb|600px| Panel a) przedstawia hipotetyczną krzywą ERP, panel b) jedna z możliwych dekompozycji sygnału w panelu a), panel c) inna możliwa dekompozycja sygnału z panelu a) ]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
from __future__ import division&lt;br /&gt;
import numpy as np&lt;br /&gt;
from matplotlib.pyplot import plot, show ,subplot, figure, title, xlabel, ylabel, ylim&lt;br /&gt;
&lt;br /&gt;
Fs = 1&lt;br /&gt;
t = np.arange(0,700)&lt;br /&gt;
&lt;br /&gt;
C1 = np.exp(-(t-100)**2/(2*30**2))&lt;br /&gt;
C2 = np.exp(-(t-200)**2/(2*50**2))&lt;br /&gt;
C3 = np.exp(-(t-350)**2/(2*100**2))&lt;br /&gt;
ERP = 0.5*C1-C2+C3&lt;br /&gt;
&lt;br /&gt;
C2p = np.concatenate((C2[0:200], np.ones(30), C2[200:700-30] ))&lt;br /&gt;
C3p = ERP - 0.5*C1 + C2p&lt;br /&gt;
ERP_v2 = 0.5*C1-C2p+C3p&lt;br /&gt;
&lt;br /&gt;
subplot(3,1,1)&lt;br /&gt;
plot(t,ERP, t[::10],ERP_v2[::10],'g.')&lt;br /&gt;
ylabel('a)',rotation='horizontal')&lt;br /&gt;
ylim([-1, 1.5])&lt;br /&gt;
&lt;br /&gt;
subplot(3,1,2)&lt;br /&gt;
plot(t,0.5*C1,t,-C2,t,C3)&lt;br /&gt;
ylabel('b)',rotation='horizontal')&lt;br /&gt;
ylim([-1, 1.5])&lt;br /&gt;
&lt;br /&gt;
subplot(3,1,3)&lt;br /&gt;
plot(t,0.5*C1,t,-C2p,t,C3p)&lt;br /&gt;
ylabel('c)',rotation='horizontal')&lt;br /&gt;
ylim([-1, 1.5])&lt;br /&gt;
&lt;br /&gt;
show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Zmiana jednej komponenty może powodować zmiany w amplitudzie i latencji więcej niż jednego załamka.====&lt;br /&gt;
Poniższy rysunek przedstawia sytuację gdy zmiana amplitudy jednego komponentu może znacząco wpływać na amplitudę i latencję innych załamków.&lt;br /&gt;
&lt;br /&gt;
[[Plik:Sumowanie_komponentow2.png|center|thumb|768px| Panel a) przedstawia dwie hipotetyczne krzywe ERP, panel b) panel b i c komponenty z których powstały owe krzywe. Zmiana amplitudy komponentu oznaczonego kolorem powoduje zmianę amplitudy oznaczonych załamków ale także zmianę latencji wcześniejszego załamka. ]]&lt;br /&gt;
Poniżej kod odtwarzający powyższy przykład:&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
from __future__ import division&lt;br /&gt;
import numpy as np&lt;br /&gt;
from matplotlib.pyplot import plot, show, subplot, figure, title, xlabel, ylabel, ylim&lt;br /&gt;
&lt;br /&gt;
Fs = 1&lt;br /&gt;
t = np.arange(0,700)&lt;br /&gt;
&lt;br /&gt;
C1 = np.exp(-(t-100)**2/(2*30**2))&lt;br /&gt;
C2 = np.exp(-(t-200)**2/(2*50**2))&lt;br /&gt;
C3 = np.exp(-(t-350)**2/(2*100**2))&lt;br /&gt;
ERP1 = 0.5*C1-C2+C3&lt;br /&gt;
ERP2 = 0.5*C1-C2+1.5*C3&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
subplot(3,1,1)&lt;br /&gt;
plot(t,ERP1,'b', t,ERP2,'g')&lt;br /&gt;
plot(t[np.argmin(ERP1)],np.min(ERP1),'r.' )&lt;br /&gt;
plot(t[np.argmax(ERP1)],np.max(ERP1),'m.' )&lt;br /&gt;
plot(t[np.argmin(ERP2)],np.min(ERP2),'r.' )&lt;br /&gt;
plot(t[np.argmax(ERP2)],np.max(ERP2),'m.' )&lt;br /&gt;
&lt;br /&gt;
ylabel('a)',rotation='horizontal')&lt;br /&gt;
ylim([-1, 1.6])&lt;br /&gt;
&lt;br /&gt;
subplot(3,1,2)&lt;br /&gt;
plot(t,0.5*C1,'k',t,-C2,'k',t,C3,'b')&lt;br /&gt;
ylabel('b)',rotation='horizontal')&lt;br /&gt;
ylim([-1, 1.6])&lt;br /&gt;
&lt;br /&gt;
subplot(3,1,3)&lt;br /&gt;
plot(t,0.5*C1,'k',t,-C2,'k',t,1.5*C3,'g')&lt;br /&gt;
ylabel('c)',rotation='horizontal')&lt;br /&gt;
ylim([-1, 1.6])&lt;br /&gt;
&lt;br /&gt;
show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Instrukcje do ćwiczeń =&lt;br /&gt;
&lt;br /&gt;
==Zadanie 1: uśrednianie symulowanych sygnałów==&lt;br /&gt;
w tym ćwiczeniu chcemy pokazać efekty:&lt;br /&gt;
# uśredniania sygnałów związanych fazowo z bodźcem i nieskorelowanych z bodźcem / wpływ liczby realizacji,&lt;br /&gt;
# uśredniania sygnałów z fluktuacją latencji,&lt;br /&gt;
# wpływ filtrów o różnych funkcjach odpowiedzi impulsowej na morfologię uśrednionego potencjału.&lt;br /&gt;
&lt;br /&gt;
===Sygnały testowe===&lt;br /&gt;
Proszę zaimplementować funkcje generujące następujące przebiegi czasowe (oznaczenia: ''F&amp;lt;sub&amp;gt;s&amp;lt;/sub&amp;gt;'' &amp;amp;mdash; częstość próbkowania, ''T'' &amp;amp;mdash; czas trwania w sekundach, [[%C4%86wiczenia_1#Sygna.C5.82y_testowe|analogicznie do tego]]):&lt;br /&gt;
* sinusoida o zadanej częstości ''f'' i fazie &amp;lt;math&amp;gt;\phi&amp;lt;/math&amp;gt;: &amp;lt;tt&amp;gt;y = sin(f, phi, Fs, T)&amp;lt;/tt&amp;gt;,&lt;br /&gt;
* funkcja Gaussa o zadanym położeniu i szerokości &amp;lt;tt&amp;gt;y = g_1(t0, sigma, Fs, T) &amp;lt;/tt&amp;gt;&lt;br /&gt;
: &amp;lt;math&amp;gt;g_1(t) = \exp\left(-\frac{(t-t_0)^2}{2 \sigma^2}\right)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* pochodną funkcji Gaussa o zadanym położeniu i szerokości &amp;lt;tt&amp;gt;y = g_2(t0, sigma, Fs, T)&amp;lt;/tt&amp;gt;,&lt;br /&gt;
* połowę funkcji Gaussa o zadanym położeniu i szerokości &amp;lt;tt&amp;gt;y = g_3(t0, sigma, Fs, T)&amp;lt;/tt&amp;gt;,&lt;br /&gt;
: &amp;lt;math&amp;gt;g_{3}(t) = \left\{ &lt;br /&gt;
\begin{array}{lll}&lt;br /&gt;
0 &amp;amp; \mathrm{dla}&amp;amp; t&amp;lt;t_0 \\&lt;br /&gt;
\exp\left(-\frac{(t-t_0)^2}{2 \sigma^2}\right)&amp;amp; \mathrm{dla}&amp;amp; t \ge t_0  &lt;br /&gt;
\end{array}&lt;br /&gt;
\right. &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
W dalszych zadaniach tej sekcji przyjmiemy:&lt;br /&gt;
* ''T'' = 1 s,&lt;br /&gt;
* ''F&amp;lt;sub&amp;gt;s&amp;lt;/sub&amp;gt;'' = 128 Hz,&lt;br /&gt;
* ''t''&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; = 0,3 s,&lt;br /&gt;
* &amp;amp;sigma; = 0,02 s.&lt;br /&gt;
&lt;br /&gt;
===Uśrednianie w modelu addytywnym: sygnał + szum===&lt;br /&gt;
Dla funkcji &amp;lt;math&amp;gt;g_1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;g_2&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;g_3&amp;lt;/math&amp;gt;  wykonaj ''N'' symulacji sygnału opisanego daną funkcją z dodanym szumem gaussowskim (&amp;lt;tt&amp;gt;numpy.random.randn&amp;lt;/tt&amp;gt;). Zaobserwuj zmianę wariancji uśrednianego sygnału wraz z ''N''.&lt;br /&gt;
&lt;br /&gt;
===Uśrednianie w modelu addytywnym: sygnał + szum + niezależna czynność rytmiczna===&lt;br /&gt;
Powtórz poprzednie symulacje dokładając w każdej realizacji sinusoidę o losowo wybranej fazie. Symulacje wykonaj dla różnych częstości sinusoidy, takich których połówka okresu zbliżona jest do szerokości funkcji Gaussa, oraz znacząco od niej różnych.&lt;br /&gt;
&lt;br /&gt;
===Uśrednianie w modelu z resetem fazy===&lt;br /&gt;
Zbuduj sygnał składający się z dwóch fragmentów sinusoidy o częstości ''f'': &lt;br /&gt;
* pierwszy fragment ma losową fazę,&lt;br /&gt;
* drugi fragment ma fazę równą 0.&lt;br /&gt;
Wykonaj ''N'' realizacji takiego sygnału, przy czym każda realizacja ma częstość losowaną z rozkładu Gaussa o średniej 10 i pewnej wariancji (czyli &amp;lt;math&amp;gt;f \in \mathrm{N}(10,\sigma)&amp;lt;/math&amp;gt;). &lt;br /&gt;
Uśrednij otrzymane realizacje. Zaobserwuj zależność średniej od liczby uśrednianych realizacji i od wariancji częstości.&lt;br /&gt;
&lt;br /&gt;
===Uśrednianie potencjału z fluktuacją latencji===&lt;br /&gt;
Wygeneruj sygnały składające się z funkcji &amp;lt;math&amp;gt;g_1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;g_2&amp;lt;/math&amp;gt; albo &amp;lt;math&amp;gt;g_3&amp;lt;/math&amp;gt; z fluktuującą latencją, tzn. z wartością &amp;lt;math&amp;gt;t_0&amp;lt;/math&amp;gt; pochodzącą z jakiegoś rozkładu prawdopodobieństwa. U nas dla ustalenia uwagi niech będzie to rozkład Gaussa. Wykonaj zestaw symulacji obrazujący zależność od liczby realizacji i od wielkości fluktuacji, mierzonej przez wariancję rozkładu. Czy jest związek pomiędzy wariancją fluktuacji &amp;lt;math&amp;gt;t_0&amp;lt;/math&amp;gt; a szerokością załamków?&lt;br /&gt;
&lt;br /&gt;
===Wpływ filtrów===&lt;br /&gt;
# Zaprojektuj następujące filtry (przyjmij częstość próbkowania 128 Hz):&lt;br /&gt;
#* dolnoprzepustowy: Butterwortha z częstością odcięcia: 30, 40, 50 Hz, i rzędach od 1 do 5 (funkcja butter w module scipy.signal),&lt;br /&gt;
#* górnoprzepustowy: Butterwortha z częstością odcięcia: 0,1, 0,5, 2 i 5 Hz, i rzędach od 1 do 5,&lt;br /&gt;
#* notch: Czybyszewa II rodzaju z pasmem zaporowym ustawionym na 50 Hz, i rzędach od 1 do 3 (funkcja cheby2),&lt;br /&gt;
# Zbadaj funkcję odpowiedzi impulsowej i funkcję przenoszenia tych filtrów (w skali dB). Zaobserwuj jak długa jest odpowiedź impulsowa i jak daleko od częstości odcięcia zaburzone jest pasmo przenoszenia.&lt;br /&gt;
# Zastosuj powyższe filtry do funkcji &amp;lt;math&amp;gt;g_1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;g_2&amp;lt;/math&amp;gt; albo &amp;lt;math&amp;gt;g_3&amp;lt;/math&amp;gt;. Filtrowanie przeprowadź w jedną (lfilter) oraz w dwie strony (filtfilt). Zaobserwuj związek między zniekształceniem wprowadzanym przez filtr a funkcją odpowiedzi impulsowej filtru.&lt;br /&gt;
# W ćwiczeniu tym posłuż się symulowanymi sygnałami uzyskanymi z modelu addytywnego: &amp;amp;bdquo;sygnał+szum&amp;amp;rdquo;. Dla funkcji &amp;lt;math&amp;gt;g_1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;g_2&amp;lt;/math&amp;gt; albo &amp;lt;math&amp;gt;g_3&amp;lt;/math&amp;gt;  wykonaj ''N'' = 60 realizacji sygnału opisanego daną funkcją z dodanym szumem gaussowskim (&amp;lt;tt&amp;gt;numpy.random.randn&amp;lt;/tt&amp;gt;). Każdą z realizacji przefiltruj, a następnie uśrednij uzyskane sygnały.&lt;br /&gt;
&lt;br /&gt;
==Zadanie 2: rejestracje i analiza potencjałów wzrokowych==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- ===Synchronizacja występowania bodźców z sygnałem EEG===&lt;br /&gt;
&lt;br /&gt;
Rejestracja potencjałów wywołanych jest przykładem pomiaru czynności elektrycznej mózgu w odpowiedzi na określony bodziec. W przypadku tego rodzaju pomiarów konieczna jest synchronizacja momentu wystąpienia bodźca z sygnałem EEG. Wzmacniacze do pomiaru czynności elektrycznej mózgu wyposażone są w specjalne wejścia, na które można podawać sygnał odpowiadający pojawianiu się bodźca. Jak pamiętamy z zeszłego semestru, wejście to (jak i podawany na nie sygnał) nazywamy trigerem (ang. ''trigger'' &amp;amp;mdash; spust, cyngiel, wyzwalacz). W najprostszym przypadku, bodziec moglibyśmy wyświetlać na monitorze komputerowym, a sygnał związany z jego wystąpieniem wysyłać przez któryś z portów komputera (LPT, COM) na wzmacniacz EEG. Niestety, obecnie dostępne i popularne systemy operacyjne, takie jak Windows czy Linux nie są systemami czasu rzeczywistego (http://pl.wikipedia.org/wiki/System_operacyjny_czasu_rzeczywistego). Od momentu wyświetlania bodźca na ekranie, do pojawiania się sygnału odpowiednim porcie komputerowym może upłynąć kilkadziesiąt milisekund i co gorsza czas ten zwykle jest losowy. W przypadku gdy wzmacniacz próbkuje sygnał z częstością 1000 Hz, moment wystąpienia bodźca możemy określić z dokładnością 1 ms, jednakże wspomniane opóźnienia w systemie operacyjnym uniemożliwiają to. Ponadto, jak dowiedzieliśmy się w rozdziale wstępnym [http://brain.fuw.edu.pl/edu-wiki/action/edit/EEG:Potencja%C5%82y_wywo%C5%82ane?section=T-1], pierwsze załamki związane z potencjałami wywołanymi pojawiają się już 10 ms po wystąpieniu bodźca. W związku z tym, losowe, rzędu kilkudziesięciu milisekund opóźnienia sygnału określającego moment pojawienia się bodźca względem jego rzeczywistego wystąpienia są niedopuszczalne.&lt;br /&gt;
Istnieją pewne techniki programowania, dzięki którym opisywane opóźnienia można zmniejszyć, jednakże są one bardzo trudne  do realizacji. Ponadto, standardowe porty komputera, takie jak LPT, czy COM zostały zaprojektowane przede wszystkim do sterowania urządzeniami zewnętrznymi, a nie ich zasilania. Przykładowo, jedna linia portu drukarkowego (LPT) może być obciążona prądem nie większym niż 5 mA, podczas gdy do zapalenie zwykłej diody LED potrzeba około 10 mA. Taki pobór prądu możliwy jest do uzyskania z portu USB, jednakże  jest on  wyjątkowo trudny do oprogramowania.  &lt;br /&gt;
W celu ominięcia powyższych niedogodności w Zakładzie Fizyki Biomedycznej UW w przeprowadzanych eksperymentach wykorzystywane są  mikrokontrolery [http://pl.wikipedia.org/wiki/Mikrokontroler], w szczególności ATmega16 i ATmega32.  Mikrokontrolery te wyposażone są w procesory o architekturze RISC [http://pl.wikipedia.org/wiki/RISC] i mocy obliczeniowej porównywalnej z szeroko stosowanym kiedyś w komputerach ZX Spectrum, Commodore, Amiga i Atari procesorem Z80. Oprócz jednostki centralnej mikrokontrolery zawierają   stałą pamięć FLASH przeznaczoną do przechowywania kodu programu, pamięć  RAM i pamięć EEPROM, liczniki 8- i 16-bitowe, komparatory, przetworniki analogowo-cyfrowe, porty wejścia/wyjścia, łącze RS232 (popularnie nazywane portem szeregowym) i układy przerwań.&lt;br /&gt;
&lt;br /&gt;
Mikrokontrolery wchodzące w skład zestawów pomiarowych na Pracowni EEG zawierają program, który umożliwia komunikację z nimi poprzez port szeregowy. Obecnie, komputery są coraz rzadziej wyposażane w porty szeregowe. Standard komunikacji RS-232, opracowany w 1962 roku  nadal jest jednak popularny i często wykorzystywany do komunikacji miedzy urządzeniami.  W celu połączenia komputera posiadającego tylko porty USB z mikrokontrolerem zastosowano przejściówkę USB/RS-232. &lt;br /&gt;
&lt;br /&gt;
Jak każde urządzenie w systemie Linuks, przejściówka USB/RS-232 widoczna jest jako plik, znajdujący się w katalogu &amp;lt;tt&amp;gt;/dev&amp;lt;/tt&amp;gt;. Nazwy plików obsługujących urządzenia szeregowe to &amp;lt;tt&amp;gt;ttyXY&amp;lt;/tt&amp;gt;, gdzie &amp;lt;tt&amp;gt;XY&amp;lt;/tt&amp;gt; to kolejny numer przydzielony do urządzenia szeregowego.&lt;br /&gt;
Do komunikacji komputera z mikroknotrolerem  w Zakładzie Fizyki Biomedycznej UW została napisana prosta biblioteka.  Jej użycie jest następujące:&lt;br /&gt;
* Po podłączeniu przejściówki USB/RS232 do komputera mikrokontrolera sprawdź jaki plik w katalogu &amp;lt;tt&amp;gt;/dev&amp;lt;/tt&amp;gt; został utworzony i przydzielony do urządzenia. &lt;br /&gt;
* Zaimportuj bibliotekę do komunikacji z mikrokontrolerem: &lt;br /&gt;
: &amp;lt;tt&amp;gt;import SerialPort as SP&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Otwórz plik powiązany z urządzeniem zewnętrznym:&lt;br /&gt;
: &amp;lt;tt&amp;gt;sp = SP.SerialPort(nazwa_pliku) &amp;lt;/tt&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
: &amp;lt;tt&amp;gt;sp.open()&amp;lt;/tt&amp;gt;&lt;br /&gt;
W naszym przypadku prawidłowa nazwa pliku to &amp;lt;tt&amp;gt;/dev/ttyUSB0&amp;lt;/tt&amp;gt;.&lt;br /&gt;
* Po włączeniu zasilania mikrokontrolera, diody podłączone do niego i wykorzystywane w eksperymencie z potencjałami wywołanymi będą zapalone. Następujące polecenie zgasi obydwie diody:&lt;br /&gt;
: &amp;lt;tt&amp;gt;sp.blinkP300([0, 0])&amp;lt;/tt&amp;gt;&lt;br /&gt;
* Wydanie poniższego polecenia spowoduje, iż mikrokontroler zapali podłączoną do niego diodę numer 1 na czas 100 ms, zaś diodę numer 2 na 200 ms. Jednocześnie, w momencie włączenia jak i wyłączenia diody, sygnał z mikrokontrolera zostanie wysłany na 5-stykowe wejście AUX mikrokontrolera:&lt;br /&gt;
: &amp;lt;tt&amp;gt;sp.blinkP300([100, 200])&amp;lt;/tt&amp;gt;&lt;br /&gt;
* Jeśli chcemy zapalić tylko diodę numer dwa, np. na czas 500 ms w programie podajemy następującą instrukcję:&lt;br /&gt;
: &amp;lt;tt&amp;gt;sp.blinkP300([0, 500])&amp;lt;/tt&amp;gt;&lt;br /&gt;
* Jeśli chcemy zakończyć komunikację z mikrokontrolerem piszemy:&lt;br /&gt;
: &amp;lt;tt&amp;gt;sp.close()&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Kod biblioteki do komunikacji z mikrokontrolerem:&amp;lt;br&amp;gt;&lt;br /&gt;
--&amp;gt;&amp;lt;!--  Kod w Pythonie 2&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# -*- coding: cp1250 -*-&lt;br /&gt;
import serial&lt;br /&gt;
import logging&lt;br /&gt;
import sys&lt;br /&gt;
import os&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def to_hex_word(a):&lt;br /&gt;
    '''encodes a decimal number hexadecimally on two bytes'''&lt;br /&gt;
    return chr(a%256) + chr(a/256)&lt;br /&gt;
&lt;br /&gt;
class SerialPort(object):&lt;br /&gt;
    def __init__(self, port_name):&lt;br /&gt;
        import serial&lt;br /&gt;
        try:&lt;br /&gt;
            self.port = serial.Serial(&lt;br /&gt;
                port=port_name,&lt;br /&gt;
                baudrate=9600,&lt;br /&gt;
                bytesize=serial.EIGHTBITS,&lt;br /&gt;
                parity=serial.PARITY_NONE,&lt;br /&gt;
                stopbits=serial.STOPBITS_ONE,&lt;br /&gt;
                xonxoff=False&lt;br /&gt;
                )&lt;br /&gt;
        except serial.SerialException as e:&lt;br /&gt;
            print(&amp;quot;Nieprawidłowa nazwa portu lub port zajęty.&amp;quot;)&lt;br /&gt;
            raise e&lt;br /&gt;
        self.close()&lt;br /&gt;
        &lt;br /&gt;
    def open(self):&lt;br /&gt;
        self.port.open()&lt;br /&gt;
&lt;br /&gt;
    def close(self):&lt;br /&gt;
        self.port.close()&lt;br /&gt;
&lt;br /&gt;
    def send(self, value):&lt;br /&gt;
        self.port.write(value)&lt;br /&gt;
                           &lt;br /&gt;
    def blinkSSVEP(self,d, p1, p2):&lt;br /&gt;
        '''&lt;br /&gt;
        d = list of frequencies;&lt;br /&gt;
        p1:p2 = ratio LED_on_time/LED_off_time&lt;br /&gt;
        if you want i-th LED to be OFF all the time send  d[i] = 0&lt;br /&gt;
        if you want i-th LED to be ON all the time send  d[i] = -1&lt;br /&gt;
        in these two cases p1 and p2 do not matter&lt;br /&gt;
        '''&lt;br /&gt;
        clock  = 62500&lt;br /&gt;
        factor = float(p1) / float(p1 + p2)&lt;br /&gt;
    &lt;br /&gt;
        str = chr(3) # 'SSVEP_RUN'&lt;br /&gt;
&lt;br /&gt;
        for i in range(len(d)):&lt;br /&gt;
            # i-th LED OFF&lt;br /&gt;
            if d[i] == 0:                       &lt;br /&gt;
                str += to_hex_word(0) + to_hex_word(255) &lt;br /&gt;
            # i-th LED ON&lt;br /&gt;
            elif d[i] == -1:&lt;br /&gt;
                str += to_hex_word(255) + to_hex_word(0)&lt;br /&gt;
                #str = 'S'&lt;br /&gt;
                # i-th LED blinks d[i] times per second&lt;br /&gt;
                # p1:p2 = on_time:off_time in one blink&lt;br /&gt;
            else:&lt;br /&gt;
                period = clock/d[i]&lt;br /&gt;
                bright = int((clock/d[i]) * factor)&lt;br /&gt;
                dark = period - bright&lt;br /&gt;
                str += to_hex_word(bright) + to_hex_word(dark)&lt;br /&gt;
&lt;br /&gt;
        self.send(str)&lt;br /&gt;
&lt;br /&gt;
    def blinkP300(self,d):&lt;br /&gt;
        clock  = 62500&lt;br /&gt;
        str = chr(4) # 'P300_RUN'&lt;br /&gt;
&lt;br /&gt;
        for i in range(len(d)):&lt;br /&gt;
            period = int(clock*d[i]/1000.0)&lt;br /&gt;
            str += to_hex_word(period)&lt;br /&gt;
            print(period)&lt;br /&gt;
&lt;br /&gt;
        self.send(str)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
--&amp;gt;&amp;lt;!-- Kod w Pythonie 3 --&amp;gt;&amp;lt;!-- &amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# -*- coding: cp1250 -*-&lt;br /&gt;
import serial&lt;br /&gt;
import logging&lt;br /&gt;
import sys&lt;br /&gt;
import os&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
def to_hex_word(a):&lt;br /&gt;
    '''encodes a decimal number hexadecimally on two bytes'''&lt;br /&gt;
    return a.to_bytes(2,byteorder=sys.byteorder)&lt;br /&gt;
 &lt;br /&gt;
class SerialPort(object):&lt;br /&gt;
    def __init__(self, port_name):&lt;br /&gt;
        import serial&lt;br /&gt;
        try:&lt;br /&gt;
            self.port = serial.Serial(&lt;br /&gt;
                port=port_name,&lt;br /&gt;
                baudrate=9600,&lt;br /&gt;
                bytesize=serial.EIGHTBITS,&lt;br /&gt;
                parity=serial.PARITY_NONE,&lt;br /&gt;
                stopbits=serial.STOPBITS_ONE,&lt;br /&gt;
                xonxoff=False&lt;br /&gt;
                )&lt;br /&gt;
        except serial.SerialException as e:&lt;br /&gt;
            print(&amp;quot;Nieprawidłowa nazwa portu lub port zajęty.&amp;quot;)&lt;br /&gt;
            raise e&lt;br /&gt;
        self.close()&lt;br /&gt;
 &lt;br /&gt;
    def open(self):&lt;br /&gt;
        self.port.open()&lt;br /&gt;
 &lt;br /&gt;
    def close(self):&lt;br /&gt;
        self.port.close()&lt;br /&gt;
 &lt;br /&gt;
    def send(self, value):&lt;br /&gt;
        self.port.write(value)&lt;br /&gt;
 &lt;br /&gt;
    def blinkSSVEP(self,d, p1, p2):&lt;br /&gt;
        '''&lt;br /&gt;
        d = list of frequencies;&lt;br /&gt;
        p1:p2 = ratio LED_on_time/LED_off_time&lt;br /&gt;
        if you want i-th LED to be OFF all the time send  d[i] = 0&lt;br /&gt;
        if you want i-th LED to be ON all the time send  d[i] = -1&lt;br /&gt;
        in these two cases p1 and p2 do not matter&lt;br /&gt;
        '''&lt;br /&gt;
        clock  = 62500&lt;br /&gt;
        factor = float(p1) / float(p1 + p2)&lt;br /&gt;
 &lt;br /&gt;
        str = (3).to_bytes(1,byteorder=sys.byteorder) # 'SSVEP_RUN'&lt;br /&gt;
 &lt;br /&gt;
        for i in range(len(d)):&lt;br /&gt;
            # i-th LED OFF&lt;br /&gt;
            if d[i] == 0:                       &lt;br /&gt;
                str += to_hex_word(0) + to_hex_word(255) &lt;br /&gt;
            # i-th LED ON&lt;br /&gt;
            elif d[i] == -1:&lt;br /&gt;
                str += to_hex_word(255) + to_hex_word(0)&lt;br /&gt;
                #str = 'S'&lt;br /&gt;
                # i-th LED blinks d[i] times per second&lt;br /&gt;
                # p1:p2 = on_time:off_time in one blink&lt;br /&gt;
            else:&lt;br /&gt;
                period = clock/d[i]&lt;br /&gt;
                bright = int((clock/d[i]) * factor)&lt;br /&gt;
                dark = int(period - bright)&lt;br /&gt;
                str += to_hex_word(bright) + to_hex_word(dark)&lt;br /&gt;
 &lt;br /&gt;
        self.send(str)&lt;br /&gt;
 &lt;br /&gt;
    def blinkP300(self,d):&lt;br /&gt;
        clock  = 62500&lt;br /&gt;
        str = (4).to_bytes(1,byteorder=sys.byteorder) # 'P300_RUN'&lt;br /&gt;
 &lt;br /&gt;
        for i in range(len(d)):&lt;br /&gt;
            period = int(clock*d[i]/1000.0)&lt;br /&gt;
            str += to_hex_word(period)&lt;br /&gt;
 &lt;br /&gt;
        self.send(str)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
--&amp;gt;&amp;lt;!--&lt;br /&gt;
&lt;br /&gt;
===Zestaw eksperymentalny===&lt;br /&gt;
Zestaw składa się ze:&lt;br /&gt;
* wzmacniacza,&lt;br /&gt;
* stymulatora   &lt;br /&gt;
--&amp;gt;&amp;lt;!--* izolowanego galwanicznie układu generującego impulsy odpowiadające gaszeniu i zapalaniu diody,  o wartościach dopasowanych do akceptowalnych przez wejścia AUX wzmacniacza,--&amp;gt;&amp;lt;!--&lt;br /&gt;
* komputera: w tym eksperymencie komputer będzie służył do zaprogramowania stymulatora i do rejestracji sygnałów.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
===Eksperyment 1. Obserwacja bodźca wzrokowego  ===&lt;br /&gt;
&amp;lt;!--Proszę zapoznać się ze standardami rejestracji wzrokowych potencjałów wywołanych [http://www.gcu.ac.uk/media/gcalwebv2/theuniversity/academicschools/sls/psytimetables/SLS%20-%20VEP_Standard_2010.pdf] --&amp;gt;&lt;br /&gt;
Proszę zapoznać się z typowym wyglądem załamków w przypadku potencjałów wzrokowych, jaki jest przedstawiony na [https://link.springer.com/article/10.1007/s10633-009-9195-4/figures/2 rysunku] (cały artykuł jest dostępny [http://link.springer.com/article/10.1007%2Fs10633-009-9195-4 tu]).&lt;br /&gt;
&amp;lt;!--[[Plik:Fig 4 VEP.jpg|thumb|320px|right|&amp;lt;figure id=&amp;quot;fig:zalamki_VEP&amp;quot;&amp;gt;&amp;lt;/figure&amp;gt;&lt;br /&gt;
&amp;lt;xr id=&amp;quot;fig:zalamki_VEP&amp;quot;&amp;gt;Rys. %i.&amp;lt;/xr&amp;gt; Schemat załamków rozpoznawanych we wzrokowych potencjach wywołanych (z pracy: J. V. Odom i in. &amp;amp;bdquo;ISCEV standard for clinical visual evoked potentials&lt;br /&gt;
(2009 update)&amp;amp;rdquo;, Doc Ophthalmol (2010), 120:111–119).]]&lt;br /&gt;
--&amp;gt; &lt;br /&gt;
&lt;br /&gt;
==== Rejestracja ====&lt;br /&gt;
* Paradygmat: z odległości około 40 cm badany obserwuje wyświetalny na ekranie biały kwadrat. Bodźce trwają 300 ms i  powtarzają się co 0.5 sekundy. Bodziec poprzedza punkt fiksacji pokazywany przez 300 ms. Natężenie bodźca ma przyjąć jedną z 4 wartości (manipulujemy jego przeźroczystością: 1, 0.7, 0.3 i 0.1, gdzie 1 oznacza brak przeźroczystości). Każda z intensywności bodźca ma pojawić się 100 razy podczas badania, bodźce podawane mają być w sposób losowy. Zadanie poprzedza krótka instrukcja, kończy podziękowanie. &lt;br /&gt;
&lt;br /&gt;
* Pomiar&lt;br /&gt;
**Zakładamy czepek i elektrody w systemie 10-20, dbamy o to by opory pomiędzy elektrodami były poniżej 10 k&amp;amp;Omega; i różnice pomiędzy oporami różnych elektrod nie przekraczały 20%. [[Plik:Glowka10-20 ERPy.svg|thumb|600px|right]]&lt;br /&gt;
** Elektrodę GND mocujemy w otworze czepka odpowiadającym pozycji AFz (na linii centralnej 10% w stronę nosa od elektrody Fz) &lt;br /&gt;
** Montujemy także elektrody M1 i M2 i FCz.&lt;br /&gt;
&lt;br /&gt;
==== Analiza ====&lt;br /&gt;
# Filtrujemy sygnał w paśmie 1-20 Hz.&lt;br /&gt;
# Z ciągłego zapisu wycinamy fragmenty od &amp;amp;minus;300 ms do +800 ms (zero oznacza moment wystąpienia bodźca). W czasie wycinania badamy wycinane fragmenty pod względem zakresu amplitudy (wszystkie kanały powinny mieć amplitudę w granicach &amp;amp;plusmn;75 &amp;amp;mu;V) i zawartości artefaktów od mrugania (w tym celu trzeba oglądając sygnał w SVAROG-u ustalić próg na amplitudę sygnału w kanałach Fp1 i Fp2).&lt;br /&gt;
# Uśredniamy wycięte sygnały.&lt;br /&gt;
# Rysujemy średni potencjał we wszystkich kanałach.&lt;br /&gt;
# Pierwszy sposób: Identyfikujemy załamki P1 i N2. Mierzymy amplitudę P1 jako różnicę między ekstremalną wartością załamka N2 a ekstremalną wartością załamka N2. &lt;br /&gt;
# Drugi sposób: Identyfikujemy załamki P1 i N2. Mierzymy amplitudę P1 w stosunku do zera. &lt;br /&gt;
#porównujemy uzyskane amplitudy w 4 warunkach za pomocą odpowiedniego testu statystycznego (porównanie warunków ze skrajnymi wartościami amplitudy - zastosuj test permutacyjny (opisany poniżej) lub test t-Studenta/nieparametryczny odpowiednik). &lt;br /&gt;
&lt;br /&gt;
**Opis testu permutacyjnego &lt;br /&gt;
Pytanie: Czy intensywność bodźca wpływa na amplitudę potencjału P1?&lt;br /&gt;
Jak stwierdzić czy amplitudy załamków P1 istotnie różnią się pomiędzy seriami?&lt;br /&gt;
&lt;br /&gt;
Musimy przeprowadzić test statystyczny. Możemy skonstruować go np. tak:&lt;br /&gt;
Mamy dwa warunki I i II. Jako statystykę przyjmiemy różnicę pomiędzy amplitudą załamka zmierzoną w serii z dwoma diodami (P2&amp;lt;sub&amp;gt;II&amp;lt;/sub&amp;gt;) a amplitudą zmierzoną w serii z jedną diodą (P2&amp;lt;sub&amp;gt;I&amp;lt;/sub&amp;gt;):&lt;br /&gt;
: ''S'' = P2&amp;lt;sub&amp;gt;II&amp;lt;/sub&amp;gt; &amp;amp;minus; P2&amp;lt;sub&amp;gt;I&amp;lt;/sub&amp;gt;&lt;br /&gt;
Postawmy hipotezę zerową, że nie ma różnicy w amplitudzie pomiędzy warunkiem II a I oraz hipotezę alternatywną, że różnica taka występuje.&lt;br /&gt;
: H&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;: ''S'' = 0&lt;br /&gt;
: H&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;: ''S'' &amp;amp;ne; 0&lt;br /&gt;
Zgodnie z H&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; dla wartości ''S'' nie ma różnicy czy realizacja została zarejestrowana w warunkach I czy II, zatem można losowo poprzypisywać numery warunków do realizacji i w ten sposób uzyskać rozkład statystyki ''S'' pod warunkiem prawdziwości H&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;, czyli obliczyć średnie potencjały dla &amp;amp;bdquo;pomieszanych&amp;amp;rdquo; tagów, wyliczyć średnie potencjały dla sztucznie wygenerowaych grup, i wyliczyć różnicę amplitud dla tych średnich, czyli wartość statystyki dla hipotezy H&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Zaimplementuj test permutacyjny zgodny z powyższą koncepcją.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- ===Wersja 2: obserwacja habituacji / uśrednianie w blokach ===&lt;br /&gt;
==== Rejestracja ====&lt;br /&gt;
# Paradygmat: &lt;br /&gt;
#* z odległości około 40 cm badany obserwuje błyski diody. &lt;br /&gt;
#* Błyski powtarzają się co 0,5 sekundy. &lt;br /&gt;
#* Rejestrujemy 60 serii po 15 błysków.  &lt;br /&gt;
#* Pomiędzy seriami badany odpoczywa około 10 sekund.&lt;br /&gt;
# Zakładamy czepek i elektrody w systemie 10-20, dbamy o to by opory pomiędzy elektrodami były poniżej 5 k&amp;amp;Omega; i różnice pomiędzy oporami różnych elektrod nie przekraczały 20%.&lt;br /&gt;
#* Elektrodę GND mocujemy w otworze czepka odpowiadającym pozycji AFz (na linii centralnej 10% w stronę nosa od elektrody Fz) &lt;br /&gt;
#* Montujemy także elektrodę FCz (na linii centralnej pomiędzy Fz a Cz), będziemy jej używać w montażu i w czasie analizy jako referencji.&lt;br /&gt;
#* Częstość próbkowania 512 Hz.&lt;br /&gt;
&lt;br /&gt;
==== Analiza ====&lt;br /&gt;
# Filtrujemy sygnał w paśmie 0,1-20 Hz.&lt;br /&gt;
# Z ciągłego zapisu wycinamy fragmenty od &amp;amp;minus;300 ms do +600 ms (zero oznacza moment wystąpienia bodźca). W czasie wycinania badamy wycinane fragmenty pod względem zakresu amplitudy (wszystkie kanały powinny mieć amplitudę w granicach &amp;amp;plusmn;75 &amp;amp;mu;V) i zawartości artefaktów od mrugania (w tym celu trzeba oglądając sygnał w SVAROG-u ustalić próg na amplitudę sygnału w kanałach Fp1 i Fp2).&lt;br /&gt;
# Uśredniamy wycięte sygnały o tym samym numerze wewnątrz serii.&lt;br /&gt;
# Rysujemy serie 15 uśrednionych potencjałów dla tego kanału, który wykazywał najsilniejszy potencjał w pierwszej wersji eksperymentu. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Eksperyment 2: rejestracja i analiza potencjału P3 ===&lt;br /&gt;
====Rejestracja ====&lt;br /&gt;
# Paradygmat: &lt;br /&gt;
#* z odległości około 40 cm badany obserwuje kwadrat, który występuje w dwóch kolorach. &lt;br /&gt;
#* Bodźce trwają 300 ms, poprzedzane punktem fiksacji wyświetlanym na 300 ms, przerwa między próbami jest losowana i wynosi od 0.8-1.2 s.  &lt;br /&gt;
#* Proporcja wystapień bodźców koloru pierwszego i drugiego wynosi 1:5.   &lt;br /&gt;
#* Zadaniem badanego jest liczenie kwadratów w rzadkim kolorze. &lt;br /&gt;
#* Wykonujemy tyle realizacji aby zarejestrować 100 powtórzeń bodźców rzadkich. &lt;br /&gt;
# Zakładamy czepek i elektrody w systemie 10-20, dbamy o to by opory pomiędzy elektrodami były poniżej 5 k&amp;amp;Omega; i różnice pomiędzy oporami różnych elektrod nie przekraczały 20%.&lt;br /&gt;
#* Elektrodę GND mocujemy w otworze czepka odpowiadającym pozycji AFz (na linii centralnej 10% w stronę nosa od elektrody Fz) &lt;br /&gt;
#* Montujemy także elektrody M1 i M2, będziemy ich używać w montażu i w czasie analizy jako referencji typu połączone uszy.&lt;br /&gt;
#* Częstość próbkowania 512 Hz.&lt;br /&gt;
&lt;br /&gt;
==== Analiza ====&lt;br /&gt;
# Filtrujemy sygnał w paśmie 1-20 Hz.&lt;br /&gt;
# Z ciągłego zapisu wycinamy fragmenty od &amp;amp;minus;300 ms do +900 ms (zero oznacza moment wystąpienia bodźca). W czasie wycinania badamy wycinane fragmenty pod względem zakresu amplitudy (wszystkie kanały powinny mieć amplitudę w granicach &amp;amp;plusmn;75 &amp;amp;mu;V) i zawartości artefaktów od mrugania (w tym celu trzeba oglądając sygnał w SVAROG-u ustalić próg na amplitudę sygnału w kanałach Fp1 i Fp2).&lt;br /&gt;
# Uśredniamy osobno realizacje dla każdego koloru kwadratu. &lt;br /&gt;
# Nakładamy na siebie na rysunkach oba typy średnich.&lt;br /&gt;
# wyznaczamy amplitudę P3 i liczymy test statystyczny pomiędzy warunkami&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- ==Ćwiczenie dodatkowe: P300 BCI==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wykorzystujemy elektrody z systemu 10-10 umieszczone nad korą wzrokową: P07, O1, O2, PO8, PO3, PO4, Pz, Cz.&lt;br /&gt;
&lt;br /&gt;
Uruchamiamy &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
obci_gui --presets eeg_workshop&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
i z guzika &amp;amp;bdquo;select amplifier&amp;amp;rdquo; wybieramy właściwy wzmacniacz.&lt;br /&gt;
&lt;br /&gt;
Do kontroli jakości sygnału możemy uruchomić Svaroga.&lt;br /&gt;
&lt;br /&gt;
Dane z kalibracji zapisują się w pliku test1 w katalogu domowym użytkownika, z labiryntu w pliku test2.&lt;br /&gt;
&lt;br /&gt;
Po zakończeniu kalibracji pojawia się napis &amp;amp;bdquo;Trwają obliczenia&amp;amp;rdquo; lub podobny. Odczekujemy kilka minut, aż skończy się peer &amp;amp;bdquo;Calibration&amp;amp;rdquo; (widoczny w obci_gui) i zamykamy okienko klawiszami Alt-F4 lub zatrzymując scenariusz guzikiem &amp;amp;bdquo;Stop&amp;amp;rdquo;. W katalogu domowym pojawi się plik z wynikami kalibracji, co pozwala na uruchomienie scenariusza &amp;amp;bdquo;labirynt&amp;amp;rdquo;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Po zebraniu danych, przed wczytaniem ich do Svaroga należy w tym samym katalogu uruchomić skrypt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
#!/usr/bin/env python&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
&lt;br /&gt;
from obci.analysis.obci_signal_processing.tags import tags_file_writer&lt;br /&gt;
from obci.analysis.obci_signal_processing.read_manager import ReadManager&lt;br /&gt;
&lt;br /&gt;
def main(): &lt;br /&gt;
	file_name = 'test1'&lt;br /&gt;
	&lt;br /&gt;
	mgr = ReadManager(&lt;br /&gt;
		file_name + '.obci.xml',&lt;br /&gt;
		file_name + '.obci.raw',&lt;br /&gt;
		file_name + '.obci.tag')&lt;br /&gt;
	&lt;br /&gt;
	tags = mgr.get_tags()&lt;br /&gt;
	for i in xrange(0, len(tags)):&lt;br /&gt;
		if tags[i]['desc']['index'] == tags[i]['desc']['target']:&lt;br /&gt;
			tags[i]['name'] = 'blink_target'&lt;br /&gt;
		else:&lt;br /&gt;
			tags[i]['name'] = 'blink'&lt;br /&gt;
			&lt;br /&gt;
	tags_writer = tags_file_writer.TagsFileWriter(file_name + '.obci.tag')&lt;br /&gt;
	for tag in tags:&lt;br /&gt;
		tags_writer.tag_received(tag)		&lt;br /&gt;
	tags_writer.finish_saving(0)	&lt;br /&gt;
 &lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Zadanie 3. Analiza Heartbeat-Evoked Potential (HEP)== &lt;br /&gt;
&lt;br /&gt;
Celem tego zadania jest zaobserwowanie występowania ERP związanego z działaniem serca (szczegóły można doczytać tutaj: [https://www.sciencedirect.com/science/article/pii/S1053811919303738?via%3Dihub]. W zadaniu tym wykorzystany dane spoczynkowe zebrane podczas pierwszej rejestracji. &lt;br /&gt;
* w pierwszym kroku signał montujemy i filtrujemy&lt;br /&gt;
* następnie zaznaczamy fragmenty sygnału, w których widzimy artefakty  &lt;br /&gt;
* w drugim robimy detekcję załamków R z EKG - po ich podstawie będziemy cieli sygnał (-200-600ms po R) &lt;br /&gt;
* następnie uśredniamy orzymane odcinki&lt;/div&gt;</summary>
		<author><name>Aduszyk</name></author>
		
	</entry>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=Pracownia_EEG/Potencja%C5%82y_wywo%C5%82ane&amp;diff=8984</id>
		<title>Pracownia EEG/Potencjały wywołane</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=Pracownia_EEG/Potencja%C5%82y_wywo%C5%82ane&amp;diff=8984"/>
		<updated>2022-11-08T11:42:19Z</updated>

		<summary type="html">&lt;p&gt;Aduszyk: /* Instrukcje do ćwiczeń */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Pracownia EEG|Pracownia EEG]] / Potencjały wywołane&lt;br /&gt;
&lt;br /&gt;
=Wstęp=&lt;br /&gt;
==Potencjały wywołane==&lt;br /&gt;
=== Wstęp ===&lt;br /&gt;
Potencjały wywołane EEG (ang. ''evoked potentials'', EP) są śladami odpowiedzi mózgu na bodźce. W przypadku MEG poprawnie mówi się o polach wywołanych (ang. ''evoked fields'', EF).&lt;br /&gt;
Zwykle reakcja ta jest mała (wyjątek stanowią [[Elektroencefalografia/Metody_analizy_sygnałów_EEG_-_analiza_w_dziedzinie_czasu |kompleksy K]]) i w zapisie pojedynczej realizacji reakcji na bodziec najczęściej niewidoczna wśród czynności pochodzącej od wielu innych procesów zachodzących w tym samym czasie w mózgu. &lt;br /&gt;
Ich wyodrębnienie z tak zwanego tła EEG/MEG, czyli manifestacji elektrycznej innych, trwających w tym samym czasie w mózgu procesów (aktywny prąd niezależny), wymaga w dniu dzisiejszym zapisu odpowiedzi na szereg powtórzeń tego samego bodźca (&amp;lt;xr id=&amp;quot;fig:EP&amp;quot;&amp;gt;rys. %i&amp;lt;/xr&amp;gt;). Pierwsze potencjały wywołane pokazał pod koniec lat 40-tych Dawson (Dawson 1947) wykonując superpozycję pojedynczych realizacji na kliszy fotograficznej.&lt;br /&gt;
Z czasem skomplikowane urządzenia analogowe zastąpione zostały przez cyfrowe uśrednianie kolejnych fragmentów EEG, zsynchronizowanych według momentu wystąpienia bodźca, łatwo realizowane za pomocą komputera.&lt;br /&gt;
&lt;br /&gt;
[[Grafika:EP.png|thumb|640px|center|&amp;lt;figure id=&amp;quot;fig:EP&amp;quot;&amp;gt;&amp;lt;/figure&amp;gt;&lt;br /&gt;
Uśrednianie potencjałów wywołanych. a) ciągły zapis EEG z wyróżnionymi momentami wystąpienia bodźca (w tym przypadku słuchowego) b) kilkadziesiąt kolejnych odcinków, wyciętych jako sekunda EEG od momentu wystąpienia kolejnych bodźców, ustawione jeden pod drugim c) uśredniony potencjał wywołany &amp;amp;mdash; widać m. in. załamek P300 ok. 300 milisekund po bodźcu]]&lt;br /&gt;
&lt;br /&gt;
Techniki te opierają się na założeniu, że zawarta w EEG odpowiedź mózgu na każdy z kolejnych bodźców jest niezmienna, a EEG odzwierciedlające pozostałe procesy traktowane jest jak nieskorelowany z nią proces stochastyczny. Zależnie od rodzaju potencjałów wywołanych, założenia te są mniej lub bardziej nieuzasadnione; podważa je choćby powszechnie znany efekt habituacji, polegający na osłabieniu późnych potencjałów wywołanych kolejnymi powtórzeniami bodźca.&lt;br /&gt;
&lt;br /&gt;
Istota potencjałów wywołanych jest przedmiotem otwartej dyskusji i dziesiątków prac, dotykających od lat podstawowych w tej dziedzinie pytań: czym jest potencjał wywołany, który widzimy w uśrednionym przebiegu? Czy naprawdę wynika z deterministycznie powtarzanej, jednakowej odpowiedzi pojawiającej się po każdym powtórzeniu bodźca niezależnie od &amp;amp;bdquo;tła&amp;amp;rdquo;, czy może wynika z reorganizacji faz tego właśnie &amp;amp;bdquo;tła&amp;amp;rdquo; EEG, czy może kombinacji tych dwóch efektów? Jest to wspaniałe pole dla zastosowań zaawansowanych metod modelowania i analizy sygnałów. W ostatnich latach powstają dziesiątki prac na ten temat, a od czasu do czasu również krytyczne artykuły wykazujące, że dotychczasowe odkrycia są raczej artefaktami stosowanych metod a nie wynikają z własności analizowanych danych (Yeung et al., 2004). Jak widać jest tu wciąż bardzo wiele do zrobienia, gdyż zrozumienie tego mechanizmu stoi na drodze do &amp;amp;bdquo;świętego Graala&amp;amp;rdquo;, którym w tej dziedzinie jest wyodrębnienie pojedynczych potencjałów wywołanych.&lt;br /&gt;
&lt;br /&gt;
Niezależnie od tego, w neurofizjologii klinicznej nazwą potencjał wywołany określa się krzywą widoczną po uśrednieniu odpowiedzi na kilkanaście do kilku tysięcy bodźców (Szelenberger 2000). Gromadzona od dziesięcioleci wiedza o behawioralnych i klinicznych korelatach potencjałów wywołanych opiera się na rozpoznawaniu w przebiegach uśrednionych tak zwanych załamków, czyli przejściowych wzrostów lub spadków potencjału (na przykład na &amp;lt;xr id=&amp;quot;fig:EP&amp;quot;&amp;gt;rys. %i&amp;lt;/xr&amp;gt; widać załamek P300). Nazwy załamków składają się zwykle z litery &amp;amp;bdquo;P&amp;amp;rdquo; (od ang. ''positive''), jeśli wychylenie jest dodatnie, lub &amp;amp;bdquo;N&amp;amp;rdquo; (od ang. ''negative''), jeśli wychylenie jest ujemne, oraz liczby. Uwaga: &lt;br /&gt;
* Nie ma niestety jednej ustalonej konwencji prezentacji potencjałów koniecznie trzeba więc zwracać uwagę na orientację wykresu, a wykonując wykres samemu - zamieszczać informację o orientacji kierunku dodatniego,gdyż kierunek dodatni może być wykresie skierowany do góry lub do dołu. &lt;br /&gt;
* Liczba następująca po N lub P określa przybliżoną liczbę milisekund od wystąpienia bodźca, czyli tak zwaną latencję. Nie można jednak ścisłego związku między tą liczbą a liczbą milisekund np. potencjał P300 w zależności od szczegółów paradygmatu doświadczalnego może wystąpić znacznie później. np. w eksperymentach językowych zdarza się że P300 występuje później niż N400 :-).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;xr id=&amp;quot;fig:zalamki&amp;quot;&amp;gt;Rys. %i&amp;lt;/xr&amp;gt; przedstawia schematycznie najważniejsze załamki rozpoznawane w potencjałach słuchowych, czyli wywoływanych bodźcem dźwiękowym. Dla potencjałów wzrokowych i somatosensorycznych istnieją podobne klasyfikacje.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Grafika:Zalamki.png|thumb|320px|right|&amp;lt;figure id=&amp;quot;fig:zalamki&amp;quot;&amp;gt;&amp;lt;/figure&amp;gt;&lt;br /&gt;
Orientacyjny schemat załamków rozpoznawanych w słuchowych potencjach wywołanych, na podstawie (Szelenberger 2000). Skala czasu logarytmiczna. Najszybsze (do 12 ms) składowe egzogenne to potencjały pniowe (BAEP), oznaczane jako fale I-VII. Litery &amp;amp;bdquo;P&amp;amp;rdquo; i &amp;amp;bdquo;N&amp;amp;rdquo; oznaczają dodatnie i ujemne wychylenia związane z dalszymi załamkami]]&lt;br /&gt;
&lt;br /&gt;
Najszybsze (czyli o najmniejszej latencji) składowe to potencjały egzogenne, odzwierciedlające wstępne fazy przekazu informacji. W potencjałach słuchowych są to potencjały pnia (ang. ''brainstem auditory evoked potentials'', BAEP), składające się z siedmiu fal występujących pomiędzy 1 a 12 ms od bodźca. Są one generowane np. w nerwie słuchowym czy pniu mózgu, i wykorzystywane w klinicznej diagnostyce integralności dróg słuchowych. Podobnie jak inne wczesne potencjały o latencjach poniżej 100 ms, są praktycznie niezależne od stanu uwagi.&lt;br /&gt;
&lt;br /&gt;
Po potencjałach o średniej latencji (między 12 a 50 ms) zaczynają się późne potencjały słuchowe (od 100 ms od podania bodźca), odzwierciedlające bardziej złożone reakcje na bodziec. Potencjały ok. 100 ms obserwowane w okolicach sensorycznych odzwierciedlają odpowiedź tejże kory na bodziec. Ich amplituda zależy od parametrów fizycznych bodźca oraz od uwagi, np. amplituda załamka N100 wzrasta w stanie skupienia uwagi czy pobudzenia emocjonalnego. Pierwszy i najpopularniejszy całkowicie endogenny załamek to P300, pojawiający się po rozpoznaniu bodźca oczekiwanego, na którym skupiamy uwagę: na przykład, jeśli w serii pojawiających się losowo liter mamy zliczać wystąpienia jednej z nich, to na średniej odpowiedzi na pojawienie się tej litery pojawi się załamek P300. Załamek ten występuje również w odpowiedzi na bodźce wyczekiwane, niespodziewane i ważne dla osoby (np. własne imię). &lt;br /&gt;
&lt;br /&gt;
=== Uśrednianie w dziedzinie czasu ===&lt;br /&gt;
Jak już było wspomniane powyżej podstawową techniką stosowaną do analizy potencjałów wywołanych jest uśrednianie wielu realizacji odpowiedzi na bodziec wyrównanych względem jakiegoś charakterystycznego zdarzenia, np. momentu podania bodźca albo momentu behawioralnej reakcji na bodziec (np. wciśnięcie przycisku). Podejście to bazuje na trzech założeniach:&lt;br /&gt;
* Reakcja jest czasowo związana z bodźcem. Tzn. w kolejnych realizacjach występuje ona zawsze z tym samym opóźnieniem.&lt;br /&gt;
* Reakcja na bodziec skutkuje zawsze pojawieniem się w sygnale składowej o stałym kształcie (mówimy o stałej morfologii).&lt;br /&gt;
* Spontaniczna czynność EEG &amp;amp;mdash; ta która nie dotyczy przetwarzania interesującego nas bodźca &amp;amp;mdash; jest niezależnym, stacjonarnym szumem o średniej zero.&lt;br /&gt;
&lt;br /&gt;
Zgodnie z powyższymi założeniami mierzony w ''i''-tej realizacji sygnał można wyrazić jako:&lt;br /&gt;
: &amp;lt;math&amp;gt;x_i(t) = s(t) + n_i(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
Uśrednianie po ''N'' realizacjach daje:&lt;br /&gt;
: &amp;lt;math&amp;gt;\bar x (t) = \frac{1}{N} \sum_{i=1}^N x_i(t) = \frac{1}{N} \left(N s(t) + \sum_{i=1}^N n_i(t) \right) &amp;lt;/math&amp;gt;&lt;br /&gt;
Wartość oczekiwana średniego sygnału wynosi:&lt;br /&gt;
: &amp;lt;math&amp;gt;\mathrm{E}\left[ \bar x(t) \right] = s(t) &amp;lt;/math&amp;gt;&lt;br /&gt;
gdyż dla szumu o średniej zero mamy:&lt;br /&gt;
: &amp;lt;math&amp;gt;\mathrm{E}\left[\frac{1}{N} \sum_{i=1}^N n_i(t)\right] = 0&amp;lt;/math&amp;gt;.&lt;br /&gt;
Wariancja &amp;lt;math&amp;gt;\bar x(t)&amp;lt;/math&amp;gt; wynosi:&lt;br /&gt;
: &amp;lt;math&amp;gt;\sigma^2_{\bar x(t)} = \mathrm{E} \left[  \left( \frac{1}{N} \sum_{i=1}^N n_i(t)\right)^2 \right] \approx \frac{1}{N} \sigma^2_{n(t)}&amp;lt;/math&amp;gt;&lt;br /&gt;
gdyż &amp;lt;math&amp;gt;s(t)&amp;lt;/math&amp;gt; jest deterministyczne. &lt;br /&gt;
&lt;br /&gt;
Dla potencjałów pojawiających się w pierwszych kilkudziesięciu milisekundach po bodźcu model ten można uznać za poprawny, gdyż wykazują one zależność głównie od parametrów fizycznych bodźca. Dla późniejszych składowych staje się on coraz bardziej wątpliwy ze względu na występujące korelacje ze stanem (np. uwagi) badanego.&lt;br /&gt;
&lt;br /&gt;
Dla późniejszych składowych można by postulować bardziej ogólną wersję modelu potencjału wywołanego:&lt;br /&gt;
: &amp;lt;math&amp;gt;x_i(t) = s_i(t) + n_i(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
Ten model uwidacznia, że do opisu potencjału wywołanego potrzebna jest nie tylko średnia, ale i wyższe momenty rozkładu (np. drugi moment centralny czyli wariancja).&lt;br /&gt;
&lt;br /&gt;
====Wariancja w przypadku szumu skorelowanego ====&lt;br /&gt;
W poprzednim paragrafie pokazaliśmy, że w przypadku niezależnego szumu wariancja uśrednionego sygnału (w danej chwili czasu) maleje jak  &amp;lt;math&amp;gt;\frac{1}{N}&amp;lt;/math&amp;gt;. Jednak w przypadku gdy kolejne próbki szumu są skorelowane (np. występuje silna aktywność rytmiczna alfa) sytuacja się komplikuje. Intuicyjnie łatwo możemy to sobie wyobrazić w granicznym przypadku. Załóżmy, że tło dla  potencjałów o stałej morfologii   stanowi sinusoida. Jeśli będziemy podawać bodźce w odstępach będących wielokrotnością okresu tej sinusoidy to w uśrednianych fragmentach sygnału owa sinusoida jest tak samo powtarzalna jak badany potencjał i uśrednianie nie prowadzi do poprawy stosunku amplitudy sygnału do amplitudy tła. &lt;br /&gt;
&lt;br /&gt;
Stopień zależności pomiędzy próbkami można zmierzyć przy pomocy funkcji autokorelacji. &lt;br /&gt;
Jeśli funkcję autokorelacji przybliżymy przez:&lt;br /&gt;
: &amp;lt;math&amp;gt;R_{xx}(\tau) = \sigma^2 \exp(-\beta |\tau|) \cos(2 \pi f_0 \tau)&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\sigma^2&amp;lt;/math&amp;gt; jest wariancją szumu, &amp;lt;math&amp;gt;f_0&amp;lt;/math&amp;gt; jest średnią częstością aktywności rytmicznej, &amp;lt;math&amp;gt;\beta/ \pi&amp;lt;/math&amp;gt; jest szerokością pasma tej czynności, zaś &amp;lt;math&amp;gt;\tau&amp;lt;/math&amp;gt; opóźnieniem, to wariancję potencjału wywołanego można wyrazić jako&amp;lt;!-- \cite{Spekreijse_1976}--&amp;gt;:&lt;br /&gt;
: &amp;lt;math&amp;gt;\sigma^2_{\bar x(t)} = \frac{\sigma^2}{N} \left[ \frac{1-\exp(-2 \beta T)}{1 - 2 \exp(- \beta T) \cos(2 \pi f_0 T) +\exp(-2 \beta T)} \right]&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; jest odstępem między bodźcami. &lt;br /&gt;
Widać stąd, że obecność czynności rytmicznej w tle wpływa na stosunek sygnału do szumu. Z powyższego równania widać, że stosunek wariancji dąży do &amp;lt;math&amp;gt;\frac{\sigma^2}{N}&amp;lt;/math&amp;gt; gdy &amp;lt;math&amp;gt;\beta T&amp;lt;/math&amp;gt; staje się duże.  &lt;br /&gt;
&lt;br /&gt;
Periodyczna stymulacja może ponadto prowadzić do wzbudzenia czynności rytmicznej o częstości równej częstości pobudzania bądź jej harmonicznej.&lt;br /&gt;
&lt;br /&gt;
===Wariancja latencji===&lt;br /&gt;
&lt;br /&gt;
Jedną z form zmienności potencjału wywołanego w pojedynczych realizacjach jest wariancja latencji. &lt;br /&gt;
[[Grafika:Wariancja_latencji.png|thumb|500px|right|&lt;br /&gt;
Czerwona linia: Uśrednianie 100 potencjałów wywołanych o latncjach z rozkładu normalnego N(300,30 ), Niebieskie linie: przykładowe pojedyncze realizacje wzięte do średniej]]&amp;lt;!--# -*- coding: utf-8 -*-&lt;br /&gt;
from __future__ import division&lt;br /&gt;
import numpy as np&lt;br /&gt;
from matplotlib.pyplot import plot, show ,subplot, figure, title, xlabel, ylabel, ylim&lt;br /&gt;
 &lt;br /&gt;
def fun(t,lat=100):&lt;br /&gt;
    return np.exp(-(t-lat)**2/(2*30**2))&lt;br /&gt;
Fs = 1&lt;br /&gt;
N = 100&lt;br /&gt;
t = np.arange(0,700)&lt;br /&gt;
f = np.zeros((N,700))&lt;br /&gt;
f_sr = np.zeros(t.shape)&lt;br /&gt;
for i in range(N):&lt;br /&gt;
    f[i,:] = fun(t,lat = 300 + 30* np.random.randn())&lt;br /&gt;
for i in range(3):&lt;br /&gt;
    plot(t,f[i,:], 'b')&lt;br /&gt;
plot(t,f.mean(0),'r')&lt;br /&gt;
show()--&amp;gt;&lt;br /&gt;
Zmienność latencji prowadzi do:&lt;br /&gt;
* zmniejszenia amplitudy &amp;lt;math&amp;gt;\bar x&amp;lt;/math&amp;gt;&lt;br /&gt;
* wzrostu rozciągłości czasowej załamka&lt;br /&gt;
&lt;br /&gt;
O tych konsekwencjach zmienności latencji należy w szczególności pamiętać porównując średnie potencjały uzyskane w różnych warunkach eksperymentalnych. Gdy zauważymy, że średnie potencjały różnią się amplitudą należy rozważyć możliwość, że w istocie warunki eksperymentalne wpływają na różnice w wariancji latencji. &lt;br /&gt;
&lt;br /&gt;
Naturalne jest, że zmienność latencji jest bardziej widoczna w przypadku załamków trwających krótko niż w przypadku załamków trwających długo. Wariancja latencji rożnie wraz z jej wartością, stąd wśród późnych składowych potencjałów wywołanych nie obserwuje się komponentów krótkotrwałych.&lt;br /&gt;
&amp;lt;!--====Uśrednianie metodą Woody'ego ====&lt;br /&gt;
&lt;br /&gt;
Model potencjału ze zmienną latencją i sposób na jego efektywniejsze uśrednianie zaproponował Woody (1967). Model ten zakłada, że w każdej realizacji występuje komponent addytywny &amp;lt;math&amp;gt;s_i(t)\;&amp;lt;/math&amp;gt;, który co do kształtu jest stały, a pomiędzy realizacjami różni się tylko latencją:&lt;br /&gt;
: &amp;lt;math&amp;gt; s_i(t) = s(t +\Delta t_i)\;&amp;lt;/math&amp;gt;&lt;br /&gt;
Woody zaproponował aby &amp;lt;math&amp;gt;\Delta t_i\;&amp;lt;/math&amp;gt; szacować na podstawie maksimum funkcji korelacji wzajemnej pomiędzy ''i''-tą realizacją a wzorcem. W pierwszym kroku wzorcem jest średni potencjał uzyskany przez proste uśrednienie realizacji.  Następnie w sposób iteracyjny dokonuje się:&lt;br /&gt;
* poprawek w wyrównaniu poszczególnych realizacji,&lt;br /&gt;
* obliczenia nowego wzorca poprzez uśrednienie realizacji po korekcie wyrównania,&lt;br /&gt;
* obliczenia nowych poprawek do wyrównania realizacji.--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Habituacja ===&lt;br /&gt;
Zmienność w odpowiedziach na kolejno występujące po sobie bodźce można podzielić na komponent stochastyczny i deterministyczny. Komponent deterministyczny odzwierciedla zmianę czułości  układu nerwowego  na kolejne bodźce. Nowy bodziec często wywołuje reakcje pobudzenia widoczną w wielu parametrach takich jak przewodnictwo skóry, rytm serca i reaktywność kory mózgowej. Powszechnie obserwowanym zjawiskiem jest spadek reaktywności na powtarzające się bodźce zwany habituacją. Niekiedy obserwuje się także zjawisko przeciwne &amp;amp;mdash; wzrost reaktywności na bodziec &amp;amp;mdash; zwane sensytyzacją. &lt;br /&gt;
&lt;br /&gt;
Klasycznym sposobem na badanie tych zjawisk w potencjałach wywołanych jest uśrednianie w podzbiorach lub  uśrednianie blokowe. Wymaga ono  zmiany paradygmatu rejestracji danych. Załóżmy, że interesującym nas bodźcem jest błysk światła. Chcemy zaobserwować ewentualne zmiany amplitudy i latencji w ciągu 100 potencjałów będących reakcją na błysk powtarzający się co 500 ms.&lt;br /&gt;
====Uśrednianie w podzbiorach ====&lt;br /&gt;
W metodzie tej musimy założyć, że proces habituacji jest powolny, tzn. zmiany pomiędzy kolejnymi reakcjami są bardzo małe. W takim przypadku możemy podzielić długą serię bodźców na ciąg pod-serii i uśrednienie przeprowadzić dla każdej pod-serii osobno.&lt;br /&gt;
[[Plik:Usrednianie_podzbiory.svg‎|640px|thumb|center|Ilustracja uśredniania w podzbiorach]]&lt;br /&gt;
&lt;br /&gt;
====Uśrednianie blokowe====&lt;br /&gt;
W tym celu eksperyment wykonujemy w wielu seriach. Jedna seria składa się ze 100 błysków powtarzanych co 500 ms.  Po serii następuje przerwa trwająca np. 5 s (długość przerwy wyraża nasze oszacowanie czasu potrzebnego na zanik habituacji). Po przerwie seria jest powtarzana. Powtórzeń serii wykonujemy ''N''.&lt;br /&gt;
Następnie uśredniamy fragmenty sygnałów odpowiadające sobie w kolejnych seriach. &lt;br /&gt;
&lt;br /&gt;
W tym paradygmacie zakładamy, że każda seria rejestrowana jest w tych samych warunkach. Zaniedbujemy efekty związane ze zmęczeniem i zmianami w np. stopniu koncentracji badanego.&lt;br /&gt;
[[Plik:Usrednianie blokowe.svg|Usrednianie blokowe.svg|640px|thumb|center|Ilustracja uśredniania w blokach]]&lt;br /&gt;
&lt;br /&gt;
===Załamki w krzywej potencjału wywołanego vs ukryte komponenty===&lt;br /&gt;
Komponenta potencjału wywołanego to bardzo ważne ale jednocześnie źle określone pojęcie. Krzywa otrzymana w wyniku uśredniania potencjałów wywołanych przedstawia serię załamków dodatnich i ujemnych, ale trzeba być świadomym, że ten przebieg napięcia rejestrowany przez elektrody przedstawia tak naprawdę sumę potencjałów pochodzących od wielu dość niezależnie działających źródeł w mózgu. Przyczynek pochodzący od jednego funkcjonalnego źródła będziemy określać jako komponentę. &lt;br /&gt;
&lt;br /&gt;
Komentarza wymaga też pojęcie źródła funkcjonalnego. Czynność elektryczną synchronicznie działających neuronów piramidalnych w określonym fragmencie kory mózgowej z pewnej odległości można przybliżyć potencjałem dipola prądowego. Taki aktywny fragment kory stanowi źródło dające przyczynek do mierzonego na powierzchni głowy potencjału. W najprostszej sytuacji taki przyczynek może być obserwowany jako komponenta. Mózg jest jednak obiektem niezwykle złożonym i gęsto połączonym. Wiele obszarów korowych może być funkcjonalnie połączonych i aktywowanych synchronicznie w celu realizacji określonego zadania &amp;amp;mdash; o takim funkcjonalnym zespole też możemy myśleć jako o pojedynczym źródle, choć może ono mieć złożoną strukturę przestrzenną. Często zatem myślimy o komponentach ukrytych potencjału wywołanego jako o aktywności takich funkcjonalnych zespołów. &lt;br /&gt;
&lt;br /&gt;
Po tym wstępie widać już chyba, że do zrozumienia co dzieje się w czasie reakcji na bodziec, którą obserwujemy w potencjale wywołanym, bardziej pożądane byłoby badanie komponent ukrytych niż poszczególnych załamków krzywej potencjału wywołanego, która stanowi ważoną sumę owych komponentów. Zanim przejdziemy do omówienia technik służących &amp;amp;bdquo;wyłuskiwaniu&amp;amp;rdquo; komponent prześledźmy kilka symulacji i wnioski z nich płynące.&lt;br /&gt;
&lt;br /&gt;
==== Załamki i komponenty nie są tym samym.====&lt;br /&gt;
Tę samą krzywą można otrzymać na nieskończenie wiele sposobów  przez sumowanie rożnych kombinacji domniemanych komponentów. Przykładowy rysunek pokazuje, jak tę samą krzywą można złożyć z dwóch rożnych zestawów komponentów (kod wytwarzający przykładową symulację pokazany jest poniżej).&lt;br /&gt;
[[Plik:Sumowanie_komponentow1.png|center|thumb|600px| Panel a) przedstawia hipotetyczną krzywą ERP, panel b) jedna z możliwych dekompozycji sygnału w panelu a), panel c) inna możliwa dekompozycja sygnału z panelu a) ]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
from __future__ import division&lt;br /&gt;
import numpy as np&lt;br /&gt;
from matplotlib.pyplot import plot, show ,subplot, figure, title, xlabel, ylabel, ylim&lt;br /&gt;
&lt;br /&gt;
Fs = 1&lt;br /&gt;
t = np.arange(0,700)&lt;br /&gt;
&lt;br /&gt;
C1 = np.exp(-(t-100)**2/(2*30**2))&lt;br /&gt;
C2 = np.exp(-(t-200)**2/(2*50**2))&lt;br /&gt;
C3 = np.exp(-(t-350)**2/(2*100**2))&lt;br /&gt;
ERP = 0.5*C1-C2+C3&lt;br /&gt;
&lt;br /&gt;
C2p = np.concatenate((C2[0:200], np.ones(30), C2[200:700-30] ))&lt;br /&gt;
C3p = ERP - 0.5*C1 + C2p&lt;br /&gt;
ERP_v2 = 0.5*C1-C2p+C3p&lt;br /&gt;
&lt;br /&gt;
subplot(3,1,1)&lt;br /&gt;
plot(t,ERP, t[::10],ERP_v2[::10],'g.')&lt;br /&gt;
ylabel('a)',rotation='horizontal')&lt;br /&gt;
ylim([-1, 1.5])&lt;br /&gt;
&lt;br /&gt;
subplot(3,1,2)&lt;br /&gt;
plot(t,0.5*C1,t,-C2,t,C3)&lt;br /&gt;
ylabel('b)',rotation='horizontal')&lt;br /&gt;
ylim([-1, 1.5])&lt;br /&gt;
&lt;br /&gt;
subplot(3,1,3)&lt;br /&gt;
plot(t,0.5*C1,t,-C2p,t,C3p)&lt;br /&gt;
ylabel('c)',rotation='horizontal')&lt;br /&gt;
ylim([-1, 1.5])&lt;br /&gt;
&lt;br /&gt;
show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Zmiana jednej komponenty może powodować zmiany w amplitudzie i latencji więcej niż jednego załamka.====&lt;br /&gt;
Poniższy rysunek przedstawia sytuację gdy zmiana amplitudy jednego komponentu może znacząco wpływać na amplitudę i latencję innych załamków.&lt;br /&gt;
&lt;br /&gt;
[[Plik:Sumowanie_komponentow2.png|center|thumb|768px| Panel a) przedstawia dwie hipotetyczne krzywe ERP, panel b) panel b i c komponenty z których powstały owe krzywe. Zmiana amplitudy komponentu oznaczonego kolorem powoduje zmianę amplitudy oznaczonych załamków ale także zmianę latencji wcześniejszego załamka. ]]&lt;br /&gt;
Poniżej kod odtwarzający powyższy przykład:&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
from __future__ import division&lt;br /&gt;
import numpy as np&lt;br /&gt;
from matplotlib.pyplot import plot, show, subplot, figure, title, xlabel, ylabel, ylim&lt;br /&gt;
&lt;br /&gt;
Fs = 1&lt;br /&gt;
t = np.arange(0,700)&lt;br /&gt;
&lt;br /&gt;
C1 = np.exp(-(t-100)**2/(2*30**2))&lt;br /&gt;
C2 = np.exp(-(t-200)**2/(2*50**2))&lt;br /&gt;
C3 = np.exp(-(t-350)**2/(2*100**2))&lt;br /&gt;
ERP1 = 0.5*C1-C2+C3&lt;br /&gt;
ERP2 = 0.5*C1-C2+1.5*C3&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
subplot(3,1,1)&lt;br /&gt;
plot(t,ERP1,'b', t,ERP2,'g')&lt;br /&gt;
plot(t[np.argmin(ERP1)],np.min(ERP1),'r.' )&lt;br /&gt;
plot(t[np.argmax(ERP1)],np.max(ERP1),'m.' )&lt;br /&gt;
plot(t[np.argmin(ERP2)],np.min(ERP2),'r.' )&lt;br /&gt;
plot(t[np.argmax(ERP2)],np.max(ERP2),'m.' )&lt;br /&gt;
&lt;br /&gt;
ylabel('a)',rotation='horizontal')&lt;br /&gt;
ylim([-1, 1.6])&lt;br /&gt;
&lt;br /&gt;
subplot(3,1,2)&lt;br /&gt;
plot(t,0.5*C1,'k',t,-C2,'k',t,C3,'b')&lt;br /&gt;
ylabel('b)',rotation='horizontal')&lt;br /&gt;
ylim([-1, 1.6])&lt;br /&gt;
&lt;br /&gt;
subplot(3,1,3)&lt;br /&gt;
plot(t,0.5*C1,'k',t,-C2,'k',t,1.5*C3,'g')&lt;br /&gt;
ylabel('c)',rotation='horizontal')&lt;br /&gt;
ylim([-1, 1.6])&lt;br /&gt;
&lt;br /&gt;
show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Instrukcje do ćwiczeń =&lt;br /&gt;
&lt;br /&gt;
==Zadanie 1: uśrednianie symulowanych sygnałów==&lt;br /&gt;
w tym ćwiczeniu chcemy pokazać efekty:&lt;br /&gt;
# uśredniania sygnałów związanych fazowo z bodźcem i nieskorelowanych z bodźcem / wpływ liczby realizacji,&lt;br /&gt;
# uśredniania sygnałów z fluktuacją latencji,&lt;br /&gt;
# wpływ filtrów o różnych funkcjach odpowiedzi impulsowej na morfologię uśrednionego potencjału.&lt;br /&gt;
&lt;br /&gt;
===Sygnały testowe===&lt;br /&gt;
Proszę zaimplementować funkcje generujące następujące przebiegi czasowe (oznaczenia: ''F&amp;lt;sub&amp;gt;s&amp;lt;/sub&amp;gt;'' &amp;amp;mdash; częstość próbkowania, ''T'' &amp;amp;mdash; czas trwania w sekundach, [[%C4%86wiczenia_1#Sygna.C5.82y_testowe|analogicznie do tego]]):&lt;br /&gt;
* sinusoida o zadanej częstości ''f'' i fazie &amp;lt;math&amp;gt;\phi&amp;lt;/math&amp;gt;: &amp;lt;tt&amp;gt;y = sin(f, phi, Fs, T)&amp;lt;/tt&amp;gt;,&lt;br /&gt;
* funkcja Gaussa o zadanym położeniu i szerokości &amp;lt;tt&amp;gt;y = g_1(t0, sigma, Fs, T) &amp;lt;/tt&amp;gt;&lt;br /&gt;
: &amp;lt;math&amp;gt;g_1(t) = \exp\left(-\frac{(t-t_0)^2}{2 \sigma^2}\right)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* pochodną funkcji Gaussa o zadanym położeniu i szerokości &amp;lt;tt&amp;gt;y = g_2(t0, sigma, Fs, T)&amp;lt;/tt&amp;gt;,&lt;br /&gt;
* połowę funkcji Gaussa o zadanym położeniu i szerokości &amp;lt;tt&amp;gt;y = g_3(t0, sigma, Fs, T)&amp;lt;/tt&amp;gt;,&lt;br /&gt;
: &amp;lt;math&amp;gt;g_{3}(t) = \left\{ &lt;br /&gt;
\begin{array}{lll}&lt;br /&gt;
0 &amp;amp; \mathrm{dla}&amp;amp; t&amp;lt;t_0 \\&lt;br /&gt;
\exp\left(-\frac{(t-t_0)^2}{2 \sigma^2}\right)&amp;amp; \mathrm{dla}&amp;amp; t \ge t_0  &lt;br /&gt;
\end{array}&lt;br /&gt;
\right. &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
W dalszych zadaniach tej sekcji przyjmiemy:&lt;br /&gt;
* ''T'' = 1 s,&lt;br /&gt;
* ''F&amp;lt;sub&amp;gt;s&amp;lt;/sub&amp;gt;'' = 128 Hz,&lt;br /&gt;
* ''t''&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; = 0,3 s,&lt;br /&gt;
* &amp;amp;sigma; = 0,02 s.&lt;br /&gt;
&lt;br /&gt;
===Uśrednianie w modelu addytywnym: sygnał + szum===&lt;br /&gt;
Dla funkcji &amp;lt;math&amp;gt;g_1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;g_2&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;g_3&amp;lt;/math&amp;gt;  wykonaj ''N'' symulacji sygnału opisanego daną funkcją z dodanym szumem gaussowskim (&amp;lt;tt&amp;gt;numpy.random.randn&amp;lt;/tt&amp;gt;). Zaobserwuj zmianę wariancji uśrednianego sygnału wraz z ''N''.&lt;br /&gt;
&lt;br /&gt;
===Uśrednianie w modelu addytywnym: sygnał + szum + niezależna czynność rytmiczna===&lt;br /&gt;
Powtórz poprzednie symulacje dokładając w każdej realizacji sinusoidę o losowo wybranej fazie. Symulacje wykonaj dla różnych częstości sinusoidy, takich których połówka okresu zbliżona jest do szerokości funkcji Gaussa, oraz znacząco od niej różnych.&lt;br /&gt;
&lt;br /&gt;
===Uśrednianie w modelu z resetem fazy===&lt;br /&gt;
Zbuduj sygnał składający się z dwóch fragmentów sinusoidy o częstości ''f'': &lt;br /&gt;
* pierwszy fragment ma losową fazę,&lt;br /&gt;
* drugi fragment ma fazę równą 0.&lt;br /&gt;
Wykonaj ''N'' realizacji takiego sygnału, przy czym każda realizacja ma częstość losowaną z rozkładu Gaussa o średniej 10 i pewnej wariancji (czyli &amp;lt;math&amp;gt;f \in \mathrm{N}(10,\sigma)&amp;lt;/math&amp;gt;). &lt;br /&gt;
Uśrednij otrzymane realizacje. Zaobserwuj zależność średniej od liczby uśrednianych realizacji i od wariancji częstości.&lt;br /&gt;
&lt;br /&gt;
===Uśrednianie potencjału z fluktuacją latencji===&lt;br /&gt;
Wygeneruj sygnały składające się z funkcji &amp;lt;math&amp;gt;g_1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;g_2&amp;lt;/math&amp;gt; albo &amp;lt;math&amp;gt;g_3&amp;lt;/math&amp;gt; z fluktuującą latencją, tzn. z wartością &amp;lt;math&amp;gt;t_0&amp;lt;/math&amp;gt; pochodzącą z jakiegoś rozkładu prawdopodobieństwa. U nas dla ustalenia uwagi niech będzie to rozkład Gaussa. Wykonaj zestaw symulacji obrazujący zależność od liczby realizacji i od wielkości fluktuacji, mierzonej przez wariancję rozkładu. Czy jest związek pomiędzy wariancją fluktuacji &amp;lt;math&amp;gt;t_0&amp;lt;/math&amp;gt; a szerokością załamków?&lt;br /&gt;
&lt;br /&gt;
===Wpływ filtrów===&lt;br /&gt;
# Zaprojektuj następujące filtry (przyjmij częstość próbkowania 128 Hz):&lt;br /&gt;
#* dolnoprzepustowy: Butterwortha z częstością odcięcia: 30, 40, 50 Hz, i rzędach od 1 do 5 (funkcja butter w module scipy.signal),&lt;br /&gt;
#* górnoprzepustowy: Butterwortha z częstością odcięcia: 0,1, 0,5, 2 i 5 Hz, i rzędach od 1 do 5,&lt;br /&gt;
#* notch: Czybyszewa II rodzaju z pasmem zaporowym ustawionym na 50 Hz, i rzędach od 1 do 3 (funkcja cheby2),&lt;br /&gt;
# Zbadaj funkcję odpowiedzi impulsowej i funkcję przenoszenia tych filtrów (w skali dB). Zaobserwuj jak długa jest odpowiedź impulsowa i jak daleko od częstości odcięcia zaburzone jest pasmo przenoszenia.&lt;br /&gt;
# Zastosuj powyższe filtry do funkcji &amp;lt;math&amp;gt;g_1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;g_2&amp;lt;/math&amp;gt; albo &amp;lt;math&amp;gt;g_3&amp;lt;/math&amp;gt;. Filtrowanie przeprowadź w jedną (lfilter) oraz w dwie strony (filtfilt). Zaobserwuj związek między zniekształceniem wprowadzanym przez filtr a funkcją odpowiedzi impulsowej filtru.&lt;br /&gt;
# W ćwiczeniu tym posłuż się symulowanymi sygnałami uzyskanymi z modelu addytywnego: &amp;amp;bdquo;sygnał+szum&amp;amp;rdquo;. Dla funkcji &amp;lt;math&amp;gt;g_1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;g_2&amp;lt;/math&amp;gt; albo &amp;lt;math&amp;gt;g_3&amp;lt;/math&amp;gt;  wykonaj ''N'' = 60 realizacji sygnału opisanego daną funkcją z dodanym szumem gaussowskim (&amp;lt;tt&amp;gt;numpy.random.randn&amp;lt;/tt&amp;gt;). Każdą z realizacji przefiltruj, a następnie uśrednij uzyskane sygnały.&lt;br /&gt;
&lt;br /&gt;
==Zadanie 2: rejestracje i analiza potencjałów wzrokowych==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- ===Synchronizacja występowania bodźców z sygnałem EEG===&lt;br /&gt;
&lt;br /&gt;
Rejestracja potencjałów wywołanych jest przykładem pomiaru czynności elektrycznej mózgu w odpowiedzi na określony bodziec. W przypadku tego rodzaju pomiarów konieczna jest synchronizacja momentu wystąpienia bodźca z sygnałem EEG. Wzmacniacze do pomiaru czynności elektrycznej mózgu wyposażone są w specjalne wejścia, na które można podawać sygnał odpowiadający pojawianiu się bodźca. Jak pamiętamy z zeszłego semestru, wejście to (jak i podawany na nie sygnał) nazywamy trigerem (ang. ''trigger'' &amp;amp;mdash; spust, cyngiel, wyzwalacz). W najprostszym przypadku, bodziec moglibyśmy wyświetlać na monitorze komputerowym, a sygnał związany z jego wystąpieniem wysyłać przez któryś z portów komputera (LPT, COM) na wzmacniacz EEG. Niestety, obecnie dostępne i popularne systemy operacyjne, takie jak Windows czy Linux nie są systemami czasu rzeczywistego (http://pl.wikipedia.org/wiki/System_operacyjny_czasu_rzeczywistego). Od momentu wyświetlania bodźca na ekranie, do pojawiania się sygnału odpowiednim porcie komputerowym może upłynąć kilkadziesiąt milisekund i co gorsza czas ten zwykle jest losowy. W przypadku gdy wzmacniacz próbkuje sygnał z częstością 1000 Hz, moment wystąpienia bodźca możemy określić z dokładnością 1 ms, jednakże wspomniane opóźnienia w systemie operacyjnym uniemożliwiają to. Ponadto, jak dowiedzieliśmy się w rozdziale wstępnym [http://brain.fuw.edu.pl/edu-wiki/action/edit/EEG:Potencja%C5%82y_wywo%C5%82ane?section=T-1], pierwsze załamki związane z potencjałami wywołanymi pojawiają się już 10 ms po wystąpieniu bodźca. W związku z tym, losowe, rzędu kilkudziesięciu milisekund opóźnienia sygnału określającego moment pojawienia się bodźca względem jego rzeczywistego wystąpienia są niedopuszczalne.&lt;br /&gt;
Istnieją pewne techniki programowania, dzięki którym opisywane opóźnienia można zmniejszyć, jednakże są one bardzo trudne  do realizacji. Ponadto, standardowe porty komputera, takie jak LPT, czy COM zostały zaprojektowane przede wszystkim do sterowania urządzeniami zewnętrznymi, a nie ich zasilania. Przykładowo, jedna linia portu drukarkowego (LPT) może być obciążona prądem nie większym niż 5 mA, podczas gdy do zapalenie zwykłej diody LED potrzeba około 10 mA. Taki pobór prądu możliwy jest do uzyskania z portu USB, jednakże  jest on  wyjątkowo trudny do oprogramowania.  &lt;br /&gt;
W celu ominięcia powyższych niedogodności w Zakładzie Fizyki Biomedycznej UW w przeprowadzanych eksperymentach wykorzystywane są  mikrokontrolery [http://pl.wikipedia.org/wiki/Mikrokontroler], w szczególności ATmega16 i ATmega32.  Mikrokontrolery te wyposażone są w procesory o architekturze RISC [http://pl.wikipedia.org/wiki/RISC] i mocy obliczeniowej porównywalnej z szeroko stosowanym kiedyś w komputerach ZX Spectrum, Commodore, Amiga i Atari procesorem Z80. Oprócz jednostki centralnej mikrokontrolery zawierają   stałą pamięć FLASH przeznaczoną do przechowywania kodu programu, pamięć  RAM i pamięć EEPROM, liczniki 8- i 16-bitowe, komparatory, przetworniki analogowo-cyfrowe, porty wejścia/wyjścia, łącze RS232 (popularnie nazywane portem szeregowym) i układy przerwań.&lt;br /&gt;
&lt;br /&gt;
Mikrokontrolery wchodzące w skład zestawów pomiarowych na Pracowni EEG zawierają program, który umożliwia komunikację z nimi poprzez port szeregowy. Obecnie, komputery są coraz rzadziej wyposażane w porty szeregowe. Standard komunikacji RS-232, opracowany w 1962 roku  nadal jest jednak popularny i często wykorzystywany do komunikacji miedzy urządzeniami.  W celu połączenia komputera posiadającego tylko porty USB z mikrokontrolerem zastosowano przejściówkę USB/RS-232. &lt;br /&gt;
&lt;br /&gt;
Jak każde urządzenie w systemie Linuks, przejściówka USB/RS-232 widoczna jest jako plik, znajdujący się w katalogu &amp;lt;tt&amp;gt;/dev&amp;lt;/tt&amp;gt;. Nazwy plików obsługujących urządzenia szeregowe to &amp;lt;tt&amp;gt;ttyXY&amp;lt;/tt&amp;gt;, gdzie &amp;lt;tt&amp;gt;XY&amp;lt;/tt&amp;gt; to kolejny numer przydzielony do urządzenia szeregowego.&lt;br /&gt;
Do komunikacji komputera z mikroknotrolerem  w Zakładzie Fizyki Biomedycznej UW została napisana prosta biblioteka.  Jej użycie jest następujące:&lt;br /&gt;
* Po podłączeniu przejściówki USB/RS232 do komputera mikrokontrolera sprawdź jaki plik w katalogu &amp;lt;tt&amp;gt;/dev&amp;lt;/tt&amp;gt; został utworzony i przydzielony do urządzenia. &lt;br /&gt;
* Zaimportuj bibliotekę do komunikacji z mikrokontrolerem: &lt;br /&gt;
: &amp;lt;tt&amp;gt;import SerialPort as SP&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Otwórz plik powiązany z urządzeniem zewnętrznym:&lt;br /&gt;
: &amp;lt;tt&amp;gt;sp = SP.SerialPort(nazwa_pliku) &amp;lt;/tt&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
: &amp;lt;tt&amp;gt;sp.open()&amp;lt;/tt&amp;gt;&lt;br /&gt;
W naszym przypadku prawidłowa nazwa pliku to &amp;lt;tt&amp;gt;/dev/ttyUSB0&amp;lt;/tt&amp;gt;.&lt;br /&gt;
* Po włączeniu zasilania mikrokontrolera, diody podłączone do niego i wykorzystywane w eksperymencie z potencjałami wywołanymi będą zapalone. Następujące polecenie zgasi obydwie diody:&lt;br /&gt;
: &amp;lt;tt&amp;gt;sp.blinkP300([0, 0])&amp;lt;/tt&amp;gt;&lt;br /&gt;
* Wydanie poniższego polecenia spowoduje, iż mikrokontroler zapali podłączoną do niego diodę numer 1 na czas 100 ms, zaś diodę numer 2 na 200 ms. Jednocześnie, w momencie włączenia jak i wyłączenia diody, sygnał z mikrokontrolera zostanie wysłany na 5-stykowe wejście AUX mikrokontrolera:&lt;br /&gt;
: &amp;lt;tt&amp;gt;sp.blinkP300([100, 200])&amp;lt;/tt&amp;gt;&lt;br /&gt;
* Jeśli chcemy zapalić tylko diodę numer dwa, np. na czas 500 ms w programie podajemy następującą instrukcję:&lt;br /&gt;
: &amp;lt;tt&amp;gt;sp.blinkP300([0, 500])&amp;lt;/tt&amp;gt;&lt;br /&gt;
* Jeśli chcemy zakończyć komunikację z mikrokontrolerem piszemy:&lt;br /&gt;
: &amp;lt;tt&amp;gt;sp.close()&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Kod biblioteki do komunikacji z mikrokontrolerem:&amp;lt;br&amp;gt;&lt;br /&gt;
--&amp;gt;&amp;lt;!--  Kod w Pythonie 2&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# -*- coding: cp1250 -*-&lt;br /&gt;
import serial&lt;br /&gt;
import logging&lt;br /&gt;
import sys&lt;br /&gt;
import os&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def to_hex_word(a):&lt;br /&gt;
    '''encodes a decimal number hexadecimally on two bytes'''&lt;br /&gt;
    return chr(a%256) + chr(a/256)&lt;br /&gt;
&lt;br /&gt;
class SerialPort(object):&lt;br /&gt;
    def __init__(self, port_name):&lt;br /&gt;
        import serial&lt;br /&gt;
        try:&lt;br /&gt;
            self.port = serial.Serial(&lt;br /&gt;
                port=port_name,&lt;br /&gt;
                baudrate=9600,&lt;br /&gt;
                bytesize=serial.EIGHTBITS,&lt;br /&gt;
                parity=serial.PARITY_NONE,&lt;br /&gt;
                stopbits=serial.STOPBITS_ONE,&lt;br /&gt;
                xonxoff=False&lt;br /&gt;
                )&lt;br /&gt;
        except serial.SerialException as e:&lt;br /&gt;
            print(&amp;quot;Nieprawidłowa nazwa portu lub port zajęty.&amp;quot;)&lt;br /&gt;
            raise e&lt;br /&gt;
        self.close()&lt;br /&gt;
        &lt;br /&gt;
    def open(self):&lt;br /&gt;
        self.port.open()&lt;br /&gt;
&lt;br /&gt;
    def close(self):&lt;br /&gt;
        self.port.close()&lt;br /&gt;
&lt;br /&gt;
    def send(self, value):&lt;br /&gt;
        self.port.write(value)&lt;br /&gt;
                           &lt;br /&gt;
    def blinkSSVEP(self,d, p1, p2):&lt;br /&gt;
        '''&lt;br /&gt;
        d = list of frequencies;&lt;br /&gt;
        p1:p2 = ratio LED_on_time/LED_off_time&lt;br /&gt;
        if you want i-th LED to be OFF all the time send  d[i] = 0&lt;br /&gt;
        if you want i-th LED to be ON all the time send  d[i] = -1&lt;br /&gt;
        in these two cases p1 and p2 do not matter&lt;br /&gt;
        '''&lt;br /&gt;
        clock  = 62500&lt;br /&gt;
        factor = float(p1) / float(p1 + p2)&lt;br /&gt;
    &lt;br /&gt;
        str = chr(3) # 'SSVEP_RUN'&lt;br /&gt;
&lt;br /&gt;
        for i in range(len(d)):&lt;br /&gt;
            # i-th LED OFF&lt;br /&gt;
            if d[i] == 0:                       &lt;br /&gt;
                str += to_hex_word(0) + to_hex_word(255) &lt;br /&gt;
            # i-th LED ON&lt;br /&gt;
            elif d[i] == -1:&lt;br /&gt;
                str += to_hex_word(255) + to_hex_word(0)&lt;br /&gt;
                #str = 'S'&lt;br /&gt;
                # i-th LED blinks d[i] times per second&lt;br /&gt;
                # p1:p2 = on_time:off_time in one blink&lt;br /&gt;
            else:&lt;br /&gt;
                period = clock/d[i]&lt;br /&gt;
                bright = int((clock/d[i]) * factor)&lt;br /&gt;
                dark = period - bright&lt;br /&gt;
                str += to_hex_word(bright) + to_hex_word(dark)&lt;br /&gt;
&lt;br /&gt;
        self.send(str)&lt;br /&gt;
&lt;br /&gt;
    def blinkP300(self,d):&lt;br /&gt;
        clock  = 62500&lt;br /&gt;
        str = chr(4) # 'P300_RUN'&lt;br /&gt;
&lt;br /&gt;
        for i in range(len(d)):&lt;br /&gt;
            period = int(clock*d[i]/1000.0)&lt;br /&gt;
            str += to_hex_word(period)&lt;br /&gt;
            print(period)&lt;br /&gt;
&lt;br /&gt;
        self.send(str)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
--&amp;gt;&amp;lt;!-- Kod w Pythonie 3 --&amp;gt;&amp;lt;!-- &amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# -*- coding: cp1250 -*-&lt;br /&gt;
import serial&lt;br /&gt;
import logging&lt;br /&gt;
import sys&lt;br /&gt;
import os&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
def to_hex_word(a):&lt;br /&gt;
    '''encodes a decimal number hexadecimally on two bytes'''&lt;br /&gt;
    return a.to_bytes(2,byteorder=sys.byteorder)&lt;br /&gt;
 &lt;br /&gt;
class SerialPort(object):&lt;br /&gt;
    def __init__(self, port_name):&lt;br /&gt;
        import serial&lt;br /&gt;
        try:&lt;br /&gt;
            self.port = serial.Serial(&lt;br /&gt;
                port=port_name,&lt;br /&gt;
                baudrate=9600,&lt;br /&gt;
                bytesize=serial.EIGHTBITS,&lt;br /&gt;
                parity=serial.PARITY_NONE,&lt;br /&gt;
                stopbits=serial.STOPBITS_ONE,&lt;br /&gt;
                xonxoff=False&lt;br /&gt;
                )&lt;br /&gt;
        except serial.SerialException as e:&lt;br /&gt;
            print(&amp;quot;Nieprawidłowa nazwa portu lub port zajęty.&amp;quot;)&lt;br /&gt;
            raise e&lt;br /&gt;
        self.close()&lt;br /&gt;
 &lt;br /&gt;
    def open(self):&lt;br /&gt;
        self.port.open()&lt;br /&gt;
 &lt;br /&gt;
    def close(self):&lt;br /&gt;
        self.port.close()&lt;br /&gt;
 &lt;br /&gt;
    def send(self, value):&lt;br /&gt;
        self.port.write(value)&lt;br /&gt;
 &lt;br /&gt;
    def blinkSSVEP(self,d, p1, p2):&lt;br /&gt;
        '''&lt;br /&gt;
        d = list of frequencies;&lt;br /&gt;
        p1:p2 = ratio LED_on_time/LED_off_time&lt;br /&gt;
        if you want i-th LED to be OFF all the time send  d[i] = 0&lt;br /&gt;
        if you want i-th LED to be ON all the time send  d[i] = -1&lt;br /&gt;
        in these two cases p1 and p2 do not matter&lt;br /&gt;
        '''&lt;br /&gt;
        clock  = 62500&lt;br /&gt;
        factor = float(p1) / float(p1 + p2)&lt;br /&gt;
 &lt;br /&gt;
        str = (3).to_bytes(1,byteorder=sys.byteorder) # 'SSVEP_RUN'&lt;br /&gt;
 &lt;br /&gt;
        for i in range(len(d)):&lt;br /&gt;
            # i-th LED OFF&lt;br /&gt;
            if d[i] == 0:                       &lt;br /&gt;
                str += to_hex_word(0) + to_hex_word(255) &lt;br /&gt;
            # i-th LED ON&lt;br /&gt;
            elif d[i] == -1:&lt;br /&gt;
                str += to_hex_word(255) + to_hex_word(0)&lt;br /&gt;
                #str = 'S'&lt;br /&gt;
                # i-th LED blinks d[i] times per second&lt;br /&gt;
                # p1:p2 = on_time:off_time in one blink&lt;br /&gt;
            else:&lt;br /&gt;
                period = clock/d[i]&lt;br /&gt;
                bright = int((clock/d[i]) * factor)&lt;br /&gt;
                dark = int(period - bright)&lt;br /&gt;
                str += to_hex_word(bright) + to_hex_word(dark)&lt;br /&gt;
 &lt;br /&gt;
        self.send(str)&lt;br /&gt;
 &lt;br /&gt;
    def blinkP300(self,d):&lt;br /&gt;
        clock  = 62500&lt;br /&gt;
        str = (4).to_bytes(1,byteorder=sys.byteorder) # 'P300_RUN'&lt;br /&gt;
 &lt;br /&gt;
        for i in range(len(d)):&lt;br /&gt;
            period = int(clock*d[i]/1000.0)&lt;br /&gt;
            str += to_hex_word(period)&lt;br /&gt;
 &lt;br /&gt;
        self.send(str)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
--&amp;gt;&amp;lt;!--&lt;br /&gt;
&lt;br /&gt;
===Zestaw eksperymentalny===&lt;br /&gt;
Zestaw składa się ze:&lt;br /&gt;
* wzmacniacza,&lt;br /&gt;
* stymulatora   &lt;br /&gt;
--&amp;gt;&amp;lt;!--* izolowanego galwanicznie układu generującego impulsy odpowiadające gaszeniu i zapalaniu diody,  o wartościach dopasowanych do akceptowalnych przez wejścia AUX wzmacniacza,--&amp;gt;&amp;lt;!--&lt;br /&gt;
* komputera: w tym eksperymencie komputer będzie służył do zaprogramowania stymulatora i do rejestracji sygnałów.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
===Eksperyment 1. Obserwacja bodźca wzrokowego  ===&lt;br /&gt;
&amp;lt;!--Proszę zapoznać się ze standardami rejestracji wzrokowych potencjałów wywołanych [http://www.gcu.ac.uk/media/gcalwebv2/theuniversity/academicschools/sls/psytimetables/SLS%20-%20VEP_Standard_2010.pdf] --&amp;gt;&lt;br /&gt;
Proszę zapoznać się z typowym wyglądem załamków w przypadku potencjałów wzrokowych, jaki jest przedstawiony na [https://link.springer.com/article/10.1007/s10633-009-9195-4/figures/2 rysunku] (cały artykuł jest dostępny [http://link.springer.com/article/10.1007%2Fs10633-009-9195-4 tu]).&lt;br /&gt;
&amp;lt;!--[[Plik:Fig 4 VEP.jpg|thumb|320px|right|&amp;lt;figure id=&amp;quot;fig:zalamki_VEP&amp;quot;&amp;gt;&amp;lt;/figure&amp;gt;&lt;br /&gt;
&amp;lt;xr id=&amp;quot;fig:zalamki_VEP&amp;quot;&amp;gt;Rys. %i.&amp;lt;/xr&amp;gt; Schemat załamków rozpoznawanych we wzrokowych potencjach wywołanych (z pracy: J. V. Odom i in. &amp;amp;bdquo;ISCEV standard for clinical visual evoked potentials&lt;br /&gt;
(2009 update)&amp;amp;rdquo;, Doc Ophthalmol (2010), 120:111–119).]]&lt;br /&gt;
--&amp;gt; &lt;br /&gt;
&lt;br /&gt;
==== Rejestracja ====&lt;br /&gt;
* Paradygmat: z odległości około 40 cm badany obserwuje wyświetalny na ekranie biały kwadrat. Bodźce trwają 300 ms i  powtarzają się co 0.5 sekundy. Bodziec poprzedza punkt fiksacji pokazywany przez 300 ms. Natężenie bodźca ma przyjąć jedną z 4 wartości (manipulujemy jego przeźroczystością: 1, 0.7, 0.3 i 0.1, gdzie 1 oznacza brak przeźroczystości). Każda z intensywności bodźca ma pojawić się 100 razy podczas badania, bodźce podawane mają być w sposób losowy. Zadanie poprzedza krótka instrukcja, kończy podziękowanie. &lt;br /&gt;
&lt;br /&gt;
* Pomiar&lt;br /&gt;
**Zakładamy czepek i elektrody w systemie 10-20, dbamy o to by opory pomiędzy elektrodami były poniżej 10 k&amp;amp;Omega; i różnice pomiędzy oporami różnych elektrod nie przekraczały 20%. [[Plik:Glowka10-20 ERPy.svg|thumb|600px|right]]&lt;br /&gt;
** Elektrodę GND mocujemy w otworze czepka odpowiadającym pozycji AFz (na linii centralnej 10% w stronę nosa od elektrody Fz) &lt;br /&gt;
** Montujemy także elektrody M1 i M2 i FCz.&lt;br /&gt;
&lt;br /&gt;
==== Analiza ====&lt;br /&gt;
# Filtrujemy sygnał w paśmie 1-20 Hz.&lt;br /&gt;
# Z ciągłego zapisu wycinamy fragmenty od &amp;amp;minus;300 ms do +800 ms (zero oznacza moment wystąpienia bodźca). W czasie wycinania badamy wycinane fragmenty pod względem zakresu amplitudy (wszystkie kanały powinny mieć amplitudę w granicach &amp;amp;plusmn;75 &amp;amp;mu;V) i zawartości artefaktów od mrugania (w tym celu trzeba oglądając sygnał w SVAROG-u ustalić próg na amplitudę sygnału w kanałach Fp1 i Fp2).&lt;br /&gt;
# Uśredniamy wycięte sygnały.&lt;br /&gt;
# Rysujemy średni potencjał we wszystkich kanałach.&lt;br /&gt;
# Pierwszy sposób: Identyfikujemy załamki P1 i N2. Mierzymy amplitudę P1 jako różnicę między ekstremalną wartością załamka N2 a ekstremalną wartością załamka N2. &lt;br /&gt;
# Drugi sposób: Identyfikujemy załamki P1 i N2. Mierzymy amplitudę P1 w stosunku do zera. &lt;br /&gt;
#porównujemy uzyskane amplitudy w 4 warunkach za pomocą odpowiedniego testu statystycznego (porównanie warunków ze skrajnymi wartościami amplitudy - zastosuj test permutacyjny (opisany poniżej) lub test t-Studenta/nieparametryczny odpowiednik). &lt;br /&gt;
&lt;br /&gt;
**Opis testu permutacyjnego &lt;br /&gt;
Pytanie: Czy intensywność bodźca wpływa na amplitudę potencjału P1?&lt;br /&gt;
Jak stwierdzić czy amplitudy załamków P1 istotnie różnią się pomiędzy seriami?&lt;br /&gt;
&lt;br /&gt;
Musimy przeprowadzić test statystyczny. Możemy skonstruować go np. tak:&lt;br /&gt;
Mamy dwa warunki I i II. Jako statystykę przyjmiemy różnicę pomiędzy amplitudą załamka zmierzoną w serii z dwoma diodami (P2&amp;lt;sub&amp;gt;II&amp;lt;/sub&amp;gt;) a amplitudą zmierzoną w serii z jedną diodą (P2&amp;lt;sub&amp;gt;I&amp;lt;/sub&amp;gt;):&lt;br /&gt;
: ''S'' = P2&amp;lt;sub&amp;gt;II&amp;lt;/sub&amp;gt; &amp;amp;minus; P2&amp;lt;sub&amp;gt;I&amp;lt;/sub&amp;gt;&lt;br /&gt;
Postawmy hipotezę zerową, że nie ma różnicy w amplitudzie pomiędzy warunkiem II a I oraz hipotezę alternatywną, że różnica taka występuje.&lt;br /&gt;
: H&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;: ''S'' = 0&lt;br /&gt;
: H&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;: ''S'' &amp;amp;ne; 0&lt;br /&gt;
Zgodnie z H&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; dla wartości ''S'' nie ma różnicy czy realizacja została zarejestrowana w warunkach I czy II, zatem można losowo poprzypisywać numery warunków do realizacji i w ten sposób uzyskać rozkład statystyki ''S'' pod warunkiem prawdziwości H&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;, czyli obliczyć średnie potencjały dla &amp;amp;bdquo;pomieszanych&amp;amp;rdquo; tagów, wyliczyć średnie potencjały dla sztucznie wygenerowaych grup, i wyliczyć różnicę amplitud dla tych średnich, czyli wartość statystyki dla hipotezy H&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Zaimplementuj test permutacyjny zgodny z powyższą koncepcją.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- ===Wersja 2: obserwacja habituacji / uśrednianie w blokach ===&lt;br /&gt;
==== Rejestracja ====&lt;br /&gt;
# Paradygmat: &lt;br /&gt;
#* z odległości około 40 cm badany obserwuje błyski diody. &lt;br /&gt;
#* Błyski powtarzają się co 0,5 sekundy. &lt;br /&gt;
#* Rejestrujemy 60 serii po 15 błysków.  &lt;br /&gt;
#* Pomiędzy seriami badany odpoczywa około 10 sekund.&lt;br /&gt;
# Zakładamy czepek i elektrody w systemie 10-20, dbamy o to by opory pomiędzy elektrodami były poniżej 5 k&amp;amp;Omega; i różnice pomiędzy oporami różnych elektrod nie przekraczały 20%.&lt;br /&gt;
#* Elektrodę GND mocujemy w otworze czepka odpowiadającym pozycji AFz (na linii centralnej 10% w stronę nosa od elektrody Fz) &lt;br /&gt;
#* Montujemy także elektrodę FCz (na linii centralnej pomiędzy Fz a Cz), będziemy jej używać w montażu i w czasie analizy jako referencji.&lt;br /&gt;
#* Częstość próbkowania 512 Hz.&lt;br /&gt;
&lt;br /&gt;
==== Analiza ====&lt;br /&gt;
# Filtrujemy sygnał w paśmie 0,1-20 Hz.&lt;br /&gt;
# Z ciągłego zapisu wycinamy fragmenty od &amp;amp;minus;300 ms do +600 ms (zero oznacza moment wystąpienia bodźca). W czasie wycinania badamy wycinane fragmenty pod względem zakresu amplitudy (wszystkie kanały powinny mieć amplitudę w granicach &amp;amp;plusmn;75 &amp;amp;mu;V) i zawartości artefaktów od mrugania (w tym celu trzeba oglądając sygnał w SVAROG-u ustalić próg na amplitudę sygnału w kanałach Fp1 i Fp2).&lt;br /&gt;
# Uśredniamy wycięte sygnały o tym samym numerze wewnątrz serii.&lt;br /&gt;
# Rysujemy serie 15 uśrednionych potencjałów dla tego kanału, który wykazywał najsilniejszy potencjał w pierwszej wersji eksperymentu. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Eksperyment 2: rejestracja i analiza potencjału P3 ===&lt;br /&gt;
====Rejestracja ====&lt;br /&gt;
# Paradygmat: &lt;br /&gt;
#* z odległości około 40 cm badany obserwuje kwadrat, który występuje w dwóch kolorach. &lt;br /&gt;
#* Bodźce trwają 300 ms, poprzedzane punktem fiksacji wyświetlanym na 300 ms, przerwa między próbami jest losowana i wynosi od 0.8-1.2 s.  &lt;br /&gt;
#* Proporcja wystapień bodźców koloru pierwszego i drugiego wynosi 1:5.   &lt;br /&gt;
#* Zadaniem badanego jest liczenie kwadratów w rzadkim kolorze. &lt;br /&gt;
#* Wykonujemy tyle realizacji aby zarejestrować 100 powtórzeń bodźców rzadkich. &lt;br /&gt;
# Zakładamy czepek i elektrody w systemie 10-20, dbamy o to by opory pomiędzy elektrodami były poniżej 5 k&amp;amp;Omega; i różnice pomiędzy oporami różnych elektrod nie przekraczały 20%.&lt;br /&gt;
#* Elektrodę GND mocujemy w otworze czepka odpowiadającym pozycji AFz (na linii centralnej 10% w stronę nosa od elektrody Fz) &lt;br /&gt;
#* Montujemy także elektrody M1 i M2, będziemy ich używać w montażu i w czasie analizy jako referencji typu połączone uszy.&lt;br /&gt;
#* Częstość próbkowania 512 Hz.&lt;br /&gt;
&lt;br /&gt;
==== Analiza ====&lt;br /&gt;
# Filtrujemy sygnał w paśmie 1-20 Hz.&lt;br /&gt;
# Z ciągłego zapisu wycinamy fragmenty od &amp;amp;minus;300 ms do +900 ms (zero oznacza moment wystąpienia bodźca). W czasie wycinania badamy wycinane fragmenty pod względem zakresu amplitudy (wszystkie kanały powinny mieć amplitudę w granicach &amp;amp;plusmn;75 &amp;amp;mu;V) i zawartości artefaktów od mrugania (w tym celu trzeba oglądając sygnał w SVAROG-u ustalić próg na amplitudę sygnału w kanałach Fp1 i Fp2).&lt;br /&gt;
# Uśredniamy osobno realizacje dla każdego koloru kwadratu. &lt;br /&gt;
# Nakładamy na siebie na rysunkach oba typy średnich.&lt;br /&gt;
# wyznaczamy amplitudę P3 i liczymy test statystyczny pomiędzy warunkami&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- ==Ćwiczenie dodatkowe: P300 BCI==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wykorzystujemy elektrody z systemu 10-10 umieszczone nad korą wzrokową: P07, O1, O2, PO8, PO3, PO4, Pz, Cz.&lt;br /&gt;
&lt;br /&gt;
Uruchamiamy &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
obci_gui --presets eeg_workshop&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
i z guzika &amp;amp;bdquo;select amplifier&amp;amp;rdquo; wybieramy właściwy wzmacniacz.&lt;br /&gt;
&lt;br /&gt;
Do kontroli jakości sygnału możemy uruchomić Svaroga.&lt;br /&gt;
&lt;br /&gt;
Dane z kalibracji zapisują się w pliku test1 w katalogu domowym użytkownika, z labiryntu w pliku test2.&lt;br /&gt;
&lt;br /&gt;
Po zakończeniu kalibracji pojawia się napis &amp;amp;bdquo;Trwają obliczenia&amp;amp;rdquo; lub podobny. Odczekujemy kilka minut, aż skończy się peer &amp;amp;bdquo;Calibration&amp;amp;rdquo; (widoczny w obci_gui) i zamykamy okienko klawiszami Alt-F4 lub zatrzymując scenariusz guzikiem &amp;amp;bdquo;Stop&amp;amp;rdquo;. W katalogu domowym pojawi się plik z wynikami kalibracji, co pozwala na uruchomienie scenariusza &amp;amp;bdquo;labirynt&amp;amp;rdquo;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Po zebraniu danych, przed wczytaniem ich do Svaroga należy w tym samym katalogu uruchomić skrypt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
#!/usr/bin/env python&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
&lt;br /&gt;
from obci.analysis.obci_signal_processing.tags import tags_file_writer&lt;br /&gt;
from obci.analysis.obci_signal_processing.read_manager import ReadManager&lt;br /&gt;
&lt;br /&gt;
def main(): &lt;br /&gt;
	file_name = 'test1'&lt;br /&gt;
	&lt;br /&gt;
	mgr = ReadManager(&lt;br /&gt;
		file_name + '.obci.xml',&lt;br /&gt;
		file_name + '.obci.raw',&lt;br /&gt;
		file_name + '.obci.tag')&lt;br /&gt;
	&lt;br /&gt;
	tags = mgr.get_tags()&lt;br /&gt;
	for i in xrange(0, len(tags)):&lt;br /&gt;
		if tags[i]['desc']['index'] == tags[i]['desc']['target']:&lt;br /&gt;
			tags[i]['name'] = 'blink_target'&lt;br /&gt;
		else:&lt;br /&gt;
			tags[i]['name'] = 'blink'&lt;br /&gt;
			&lt;br /&gt;
	tags_writer = tags_file_writer.TagsFileWriter(file_name + '.obci.tag')&lt;br /&gt;
	for tag in tags:&lt;br /&gt;
		tags_writer.tag_received(tag)		&lt;br /&gt;
	tags_writer.finish_saving(0)	&lt;br /&gt;
 &lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Zadanie 3. Analiza Heartbeat-Evoked Potential (HEP)== &lt;br /&gt;
&lt;br /&gt;
Celem tego zadania jest zaobserwowanie występowania ERP związanego z działaniem serca (szczegóły można doczytać tutaj: [https://www.sciencedirect.com/science/article/pii/S1053811919303738?via%3Dihub]. W zadaniu tym wykorzystany dane spoczynkowe zebrane podczas pierwszej rejestracji. &lt;br /&gt;
* w pierwszym kroku signał montujemy i filtrujemy&lt;br /&gt;
* następnie zaznaczamy fragmenty sygnału, w których widzimy artefakty  &lt;br /&gt;
* w drugim robimy detekcję załamków R z EKG - po ich podestawie będziemy cieli sygnał (-200 - 600ms po R) &lt;br /&gt;
* następnie uśredniamy orzymane odcinki&lt;/div&gt;</summary>
		<author><name>Aduszyk</name></author>
		
	</entry>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=Pracownia_EEG/Potencja%C5%82y_wywo%C5%82ane&amp;diff=8983</id>
		<title>Pracownia EEG/Potencjały wywołane</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=Pracownia_EEG/Potencja%C5%82y_wywo%C5%82ane&amp;diff=8983"/>
		<updated>2022-11-08T11:19:33Z</updated>

		<summary type="html">&lt;p&gt;Aduszyk: /* Zadanie 2: rejestracje i analiza potencjałów wzrokowych */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Pracownia EEG|Pracownia EEG]] / Potencjały wywołane&lt;br /&gt;
&lt;br /&gt;
=Wstęp=&lt;br /&gt;
==Potencjały wywołane==&lt;br /&gt;
=== Wstęp ===&lt;br /&gt;
Potencjały wywołane EEG (ang. ''evoked potentials'', EP) są śladami odpowiedzi mózgu na bodźce. W przypadku MEG poprawnie mówi się o polach wywołanych (ang. ''evoked fields'', EF).&lt;br /&gt;
Zwykle reakcja ta jest mała (wyjątek stanowią [[Elektroencefalografia/Metody_analizy_sygnałów_EEG_-_analiza_w_dziedzinie_czasu |kompleksy K]]) i w zapisie pojedynczej realizacji reakcji na bodziec najczęściej niewidoczna wśród czynności pochodzącej od wielu innych procesów zachodzących w tym samym czasie w mózgu. &lt;br /&gt;
Ich wyodrębnienie z tak zwanego tła EEG/MEG, czyli manifestacji elektrycznej innych, trwających w tym samym czasie w mózgu procesów (aktywny prąd niezależny), wymaga w dniu dzisiejszym zapisu odpowiedzi na szereg powtórzeń tego samego bodźca (&amp;lt;xr id=&amp;quot;fig:EP&amp;quot;&amp;gt;rys. %i&amp;lt;/xr&amp;gt;). Pierwsze potencjały wywołane pokazał pod koniec lat 40-tych Dawson (Dawson 1947) wykonując superpozycję pojedynczych realizacji na kliszy fotograficznej.&lt;br /&gt;
Z czasem skomplikowane urządzenia analogowe zastąpione zostały przez cyfrowe uśrednianie kolejnych fragmentów EEG, zsynchronizowanych według momentu wystąpienia bodźca, łatwo realizowane za pomocą komputera.&lt;br /&gt;
&lt;br /&gt;
[[Grafika:EP.png|thumb|640px|center|&amp;lt;figure id=&amp;quot;fig:EP&amp;quot;&amp;gt;&amp;lt;/figure&amp;gt;&lt;br /&gt;
Uśrednianie potencjałów wywołanych. a) ciągły zapis EEG z wyróżnionymi momentami wystąpienia bodźca (w tym przypadku słuchowego) b) kilkadziesiąt kolejnych odcinków, wyciętych jako sekunda EEG od momentu wystąpienia kolejnych bodźców, ustawione jeden pod drugim c) uśredniony potencjał wywołany &amp;amp;mdash; widać m. in. załamek P300 ok. 300 milisekund po bodźcu]]&lt;br /&gt;
&lt;br /&gt;
Techniki te opierają się na założeniu, że zawarta w EEG odpowiedź mózgu na każdy z kolejnych bodźców jest niezmienna, a EEG odzwierciedlające pozostałe procesy traktowane jest jak nieskorelowany z nią proces stochastyczny. Zależnie od rodzaju potencjałów wywołanych, założenia te są mniej lub bardziej nieuzasadnione; podważa je choćby powszechnie znany efekt habituacji, polegający na osłabieniu późnych potencjałów wywołanych kolejnymi powtórzeniami bodźca.&lt;br /&gt;
&lt;br /&gt;
Istota potencjałów wywołanych jest przedmiotem otwartej dyskusji i dziesiątków prac, dotykających od lat podstawowych w tej dziedzinie pytań: czym jest potencjał wywołany, który widzimy w uśrednionym przebiegu? Czy naprawdę wynika z deterministycznie powtarzanej, jednakowej odpowiedzi pojawiającej się po każdym powtórzeniu bodźca niezależnie od &amp;amp;bdquo;tła&amp;amp;rdquo;, czy może wynika z reorganizacji faz tego właśnie &amp;amp;bdquo;tła&amp;amp;rdquo; EEG, czy może kombinacji tych dwóch efektów? Jest to wspaniałe pole dla zastosowań zaawansowanych metod modelowania i analizy sygnałów. W ostatnich latach powstają dziesiątki prac na ten temat, a od czasu do czasu również krytyczne artykuły wykazujące, że dotychczasowe odkrycia są raczej artefaktami stosowanych metod a nie wynikają z własności analizowanych danych (Yeung et al., 2004). Jak widać jest tu wciąż bardzo wiele do zrobienia, gdyż zrozumienie tego mechanizmu stoi na drodze do &amp;amp;bdquo;świętego Graala&amp;amp;rdquo;, którym w tej dziedzinie jest wyodrębnienie pojedynczych potencjałów wywołanych.&lt;br /&gt;
&lt;br /&gt;
Niezależnie od tego, w neurofizjologii klinicznej nazwą potencjał wywołany określa się krzywą widoczną po uśrednieniu odpowiedzi na kilkanaście do kilku tysięcy bodźców (Szelenberger 2000). Gromadzona od dziesięcioleci wiedza o behawioralnych i klinicznych korelatach potencjałów wywołanych opiera się na rozpoznawaniu w przebiegach uśrednionych tak zwanych załamków, czyli przejściowych wzrostów lub spadków potencjału (na przykład na &amp;lt;xr id=&amp;quot;fig:EP&amp;quot;&amp;gt;rys. %i&amp;lt;/xr&amp;gt; widać załamek P300). Nazwy załamków składają się zwykle z litery &amp;amp;bdquo;P&amp;amp;rdquo; (od ang. ''positive''), jeśli wychylenie jest dodatnie, lub &amp;amp;bdquo;N&amp;amp;rdquo; (od ang. ''negative''), jeśli wychylenie jest ujemne, oraz liczby. Uwaga: &lt;br /&gt;
* Nie ma niestety jednej ustalonej konwencji prezentacji potencjałów koniecznie trzeba więc zwracać uwagę na orientację wykresu, a wykonując wykres samemu - zamieszczać informację o orientacji kierunku dodatniego,gdyż kierunek dodatni może być wykresie skierowany do góry lub do dołu. &lt;br /&gt;
* Liczba następująca po N lub P określa przybliżoną liczbę milisekund od wystąpienia bodźca, czyli tak zwaną latencję. Nie można jednak ścisłego związku między tą liczbą a liczbą milisekund np. potencjał P300 w zależności od szczegółów paradygmatu doświadczalnego może wystąpić znacznie później. np. w eksperymentach językowych zdarza się że P300 występuje później niż N400 :-).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;xr id=&amp;quot;fig:zalamki&amp;quot;&amp;gt;Rys. %i&amp;lt;/xr&amp;gt; przedstawia schematycznie najważniejsze załamki rozpoznawane w potencjałach słuchowych, czyli wywoływanych bodźcem dźwiękowym. Dla potencjałów wzrokowych i somatosensorycznych istnieją podobne klasyfikacje.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Grafika:Zalamki.png|thumb|320px|right|&amp;lt;figure id=&amp;quot;fig:zalamki&amp;quot;&amp;gt;&amp;lt;/figure&amp;gt;&lt;br /&gt;
Orientacyjny schemat załamków rozpoznawanych w słuchowych potencjach wywołanych, na podstawie (Szelenberger 2000). Skala czasu logarytmiczna. Najszybsze (do 12 ms) składowe egzogenne to potencjały pniowe (BAEP), oznaczane jako fale I-VII. Litery &amp;amp;bdquo;P&amp;amp;rdquo; i &amp;amp;bdquo;N&amp;amp;rdquo; oznaczają dodatnie i ujemne wychylenia związane z dalszymi załamkami]]&lt;br /&gt;
&lt;br /&gt;
Najszybsze (czyli o najmniejszej latencji) składowe to potencjały egzogenne, odzwierciedlające wstępne fazy przekazu informacji. W potencjałach słuchowych są to potencjały pnia (ang. ''brainstem auditory evoked potentials'', BAEP), składające się z siedmiu fal występujących pomiędzy 1 a 12 ms od bodźca. Są one generowane np. w nerwie słuchowym czy pniu mózgu, i wykorzystywane w klinicznej diagnostyce integralności dróg słuchowych. Podobnie jak inne wczesne potencjały o latencjach poniżej 100 ms, są praktycznie niezależne od stanu uwagi.&lt;br /&gt;
&lt;br /&gt;
Po potencjałach o średniej latencji (między 12 a 50 ms) zaczynają się późne potencjały słuchowe (od 100 ms od podania bodźca), odzwierciedlające bardziej złożone reakcje na bodziec. Potencjały ok. 100 ms obserwowane w okolicach sensorycznych odzwierciedlają odpowiedź tejże kory na bodziec. Ich amplituda zależy od parametrów fizycznych bodźca oraz od uwagi, np. amplituda załamka N100 wzrasta w stanie skupienia uwagi czy pobudzenia emocjonalnego. Pierwszy i najpopularniejszy całkowicie endogenny załamek to P300, pojawiający się po rozpoznaniu bodźca oczekiwanego, na którym skupiamy uwagę: na przykład, jeśli w serii pojawiających się losowo liter mamy zliczać wystąpienia jednej z nich, to na średniej odpowiedzi na pojawienie się tej litery pojawi się załamek P300. Załamek ten występuje również w odpowiedzi na bodźce wyczekiwane, niespodziewane i ważne dla osoby (np. własne imię). &lt;br /&gt;
&lt;br /&gt;
=== Uśrednianie w dziedzinie czasu ===&lt;br /&gt;
Jak już było wspomniane powyżej podstawową techniką stosowaną do analizy potencjałów wywołanych jest uśrednianie wielu realizacji odpowiedzi na bodziec wyrównanych względem jakiegoś charakterystycznego zdarzenia, np. momentu podania bodźca albo momentu behawioralnej reakcji na bodziec (np. wciśnięcie przycisku). Podejście to bazuje na trzech założeniach:&lt;br /&gt;
* Reakcja jest czasowo związana z bodźcem. Tzn. w kolejnych realizacjach występuje ona zawsze z tym samym opóźnieniem.&lt;br /&gt;
* Reakcja na bodziec skutkuje zawsze pojawieniem się w sygnale składowej o stałym kształcie (mówimy o stałej morfologii).&lt;br /&gt;
* Spontaniczna czynność EEG &amp;amp;mdash; ta która nie dotyczy przetwarzania interesującego nas bodźca &amp;amp;mdash; jest niezależnym, stacjonarnym szumem o średniej zero.&lt;br /&gt;
&lt;br /&gt;
Zgodnie z powyższymi założeniami mierzony w ''i''-tej realizacji sygnał można wyrazić jako:&lt;br /&gt;
: &amp;lt;math&amp;gt;x_i(t) = s(t) + n_i(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
Uśrednianie po ''N'' realizacjach daje:&lt;br /&gt;
: &amp;lt;math&amp;gt;\bar x (t) = \frac{1}{N} \sum_{i=1}^N x_i(t) = \frac{1}{N} \left(N s(t) + \sum_{i=1}^N n_i(t) \right) &amp;lt;/math&amp;gt;&lt;br /&gt;
Wartość oczekiwana średniego sygnału wynosi:&lt;br /&gt;
: &amp;lt;math&amp;gt;\mathrm{E}\left[ \bar x(t) \right] = s(t) &amp;lt;/math&amp;gt;&lt;br /&gt;
gdyż dla szumu o średniej zero mamy:&lt;br /&gt;
: &amp;lt;math&amp;gt;\mathrm{E}\left[\frac{1}{N} \sum_{i=1}^N n_i(t)\right] = 0&amp;lt;/math&amp;gt;.&lt;br /&gt;
Wariancja &amp;lt;math&amp;gt;\bar x(t)&amp;lt;/math&amp;gt; wynosi:&lt;br /&gt;
: &amp;lt;math&amp;gt;\sigma^2_{\bar x(t)} = \mathrm{E} \left[  \left( \frac{1}{N} \sum_{i=1}^N n_i(t)\right)^2 \right] \approx \frac{1}{N} \sigma^2_{n(t)}&amp;lt;/math&amp;gt;&lt;br /&gt;
gdyż &amp;lt;math&amp;gt;s(t)&amp;lt;/math&amp;gt; jest deterministyczne. &lt;br /&gt;
&lt;br /&gt;
Dla potencjałów pojawiających się w pierwszych kilkudziesięciu milisekundach po bodźcu model ten można uznać za poprawny, gdyż wykazują one zależność głównie od parametrów fizycznych bodźca. Dla późniejszych składowych staje się on coraz bardziej wątpliwy ze względu na występujące korelacje ze stanem (np. uwagi) badanego.&lt;br /&gt;
&lt;br /&gt;
Dla późniejszych składowych można by postulować bardziej ogólną wersję modelu potencjału wywołanego:&lt;br /&gt;
: &amp;lt;math&amp;gt;x_i(t) = s_i(t) + n_i(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
Ten model uwidacznia, że do opisu potencjału wywołanego potrzebna jest nie tylko średnia, ale i wyższe momenty rozkładu (np. drugi moment centralny czyli wariancja).&lt;br /&gt;
&lt;br /&gt;
====Wariancja w przypadku szumu skorelowanego ====&lt;br /&gt;
W poprzednim paragrafie pokazaliśmy, że w przypadku niezależnego szumu wariancja uśrednionego sygnału (w danej chwili czasu) maleje jak  &amp;lt;math&amp;gt;\frac{1}{N}&amp;lt;/math&amp;gt;. Jednak w przypadku gdy kolejne próbki szumu są skorelowane (np. występuje silna aktywność rytmiczna alfa) sytuacja się komplikuje. Intuicyjnie łatwo możemy to sobie wyobrazić w granicznym przypadku. Załóżmy, że tło dla  potencjałów o stałej morfologii   stanowi sinusoida. Jeśli będziemy podawać bodźce w odstępach będących wielokrotnością okresu tej sinusoidy to w uśrednianych fragmentach sygnału owa sinusoida jest tak samo powtarzalna jak badany potencjał i uśrednianie nie prowadzi do poprawy stosunku amplitudy sygnału do amplitudy tła. &lt;br /&gt;
&lt;br /&gt;
Stopień zależności pomiędzy próbkami można zmierzyć przy pomocy funkcji autokorelacji. &lt;br /&gt;
Jeśli funkcję autokorelacji przybliżymy przez:&lt;br /&gt;
: &amp;lt;math&amp;gt;R_{xx}(\tau) = \sigma^2 \exp(-\beta |\tau|) \cos(2 \pi f_0 \tau)&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\sigma^2&amp;lt;/math&amp;gt; jest wariancją szumu, &amp;lt;math&amp;gt;f_0&amp;lt;/math&amp;gt; jest średnią częstością aktywności rytmicznej, &amp;lt;math&amp;gt;\beta/ \pi&amp;lt;/math&amp;gt; jest szerokością pasma tej czynności, zaś &amp;lt;math&amp;gt;\tau&amp;lt;/math&amp;gt; opóźnieniem, to wariancję potencjału wywołanego można wyrazić jako&amp;lt;!-- \cite{Spekreijse_1976}--&amp;gt;:&lt;br /&gt;
: &amp;lt;math&amp;gt;\sigma^2_{\bar x(t)} = \frac{\sigma^2}{N} \left[ \frac{1-\exp(-2 \beta T)}{1 - 2 \exp(- \beta T) \cos(2 \pi f_0 T) +\exp(-2 \beta T)} \right]&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; jest odstępem między bodźcami. &lt;br /&gt;
Widać stąd, że obecność czynności rytmicznej w tle wpływa na stosunek sygnału do szumu. Z powyższego równania widać, że stosunek wariancji dąży do &amp;lt;math&amp;gt;\frac{\sigma^2}{N}&amp;lt;/math&amp;gt; gdy &amp;lt;math&amp;gt;\beta T&amp;lt;/math&amp;gt; staje się duże.  &lt;br /&gt;
&lt;br /&gt;
Periodyczna stymulacja może ponadto prowadzić do wzbudzenia czynności rytmicznej o częstości równej częstości pobudzania bądź jej harmonicznej.&lt;br /&gt;
&lt;br /&gt;
===Wariancja latencji===&lt;br /&gt;
&lt;br /&gt;
Jedną z form zmienności potencjału wywołanego w pojedynczych realizacjach jest wariancja latencji. &lt;br /&gt;
[[Grafika:Wariancja_latencji.png|thumb|500px|right|&lt;br /&gt;
Czerwona linia: Uśrednianie 100 potencjałów wywołanych o latncjach z rozkładu normalnego N(300,30 ), Niebieskie linie: przykładowe pojedyncze realizacje wzięte do średniej]]&amp;lt;!--# -*- coding: utf-8 -*-&lt;br /&gt;
from __future__ import division&lt;br /&gt;
import numpy as np&lt;br /&gt;
from matplotlib.pyplot import plot, show ,subplot, figure, title, xlabel, ylabel, ylim&lt;br /&gt;
 &lt;br /&gt;
def fun(t,lat=100):&lt;br /&gt;
    return np.exp(-(t-lat)**2/(2*30**2))&lt;br /&gt;
Fs = 1&lt;br /&gt;
N = 100&lt;br /&gt;
t = np.arange(0,700)&lt;br /&gt;
f = np.zeros((N,700))&lt;br /&gt;
f_sr = np.zeros(t.shape)&lt;br /&gt;
for i in range(N):&lt;br /&gt;
    f[i,:] = fun(t,lat = 300 + 30* np.random.randn())&lt;br /&gt;
for i in range(3):&lt;br /&gt;
    plot(t,f[i,:], 'b')&lt;br /&gt;
plot(t,f.mean(0),'r')&lt;br /&gt;
show()--&amp;gt;&lt;br /&gt;
Zmienność latencji prowadzi do:&lt;br /&gt;
* zmniejszenia amplitudy &amp;lt;math&amp;gt;\bar x&amp;lt;/math&amp;gt;&lt;br /&gt;
* wzrostu rozciągłości czasowej załamka&lt;br /&gt;
&lt;br /&gt;
O tych konsekwencjach zmienności latencji należy w szczególności pamiętać porównując średnie potencjały uzyskane w różnych warunkach eksperymentalnych. Gdy zauważymy, że średnie potencjały różnią się amplitudą należy rozważyć możliwość, że w istocie warunki eksperymentalne wpływają na różnice w wariancji latencji. &lt;br /&gt;
&lt;br /&gt;
Naturalne jest, że zmienność latencji jest bardziej widoczna w przypadku załamków trwających krótko niż w przypadku załamków trwających długo. Wariancja latencji rożnie wraz z jej wartością, stąd wśród późnych składowych potencjałów wywołanych nie obserwuje się komponentów krótkotrwałych.&lt;br /&gt;
&amp;lt;!--====Uśrednianie metodą Woody'ego ====&lt;br /&gt;
&lt;br /&gt;
Model potencjału ze zmienną latencją i sposób na jego efektywniejsze uśrednianie zaproponował Woody (1967). Model ten zakłada, że w każdej realizacji występuje komponent addytywny &amp;lt;math&amp;gt;s_i(t)\;&amp;lt;/math&amp;gt;, który co do kształtu jest stały, a pomiędzy realizacjami różni się tylko latencją:&lt;br /&gt;
: &amp;lt;math&amp;gt; s_i(t) = s(t +\Delta t_i)\;&amp;lt;/math&amp;gt;&lt;br /&gt;
Woody zaproponował aby &amp;lt;math&amp;gt;\Delta t_i\;&amp;lt;/math&amp;gt; szacować na podstawie maksimum funkcji korelacji wzajemnej pomiędzy ''i''-tą realizacją a wzorcem. W pierwszym kroku wzorcem jest średni potencjał uzyskany przez proste uśrednienie realizacji.  Następnie w sposób iteracyjny dokonuje się:&lt;br /&gt;
* poprawek w wyrównaniu poszczególnych realizacji,&lt;br /&gt;
* obliczenia nowego wzorca poprzez uśrednienie realizacji po korekcie wyrównania,&lt;br /&gt;
* obliczenia nowych poprawek do wyrównania realizacji.--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Habituacja ===&lt;br /&gt;
Zmienność w odpowiedziach na kolejno występujące po sobie bodźce można podzielić na komponent stochastyczny i deterministyczny. Komponent deterministyczny odzwierciedla zmianę czułości  układu nerwowego  na kolejne bodźce. Nowy bodziec często wywołuje reakcje pobudzenia widoczną w wielu parametrach takich jak przewodnictwo skóry, rytm serca i reaktywność kory mózgowej. Powszechnie obserwowanym zjawiskiem jest spadek reaktywności na powtarzające się bodźce zwany habituacją. Niekiedy obserwuje się także zjawisko przeciwne &amp;amp;mdash; wzrost reaktywności na bodziec &amp;amp;mdash; zwane sensytyzacją. &lt;br /&gt;
&lt;br /&gt;
Klasycznym sposobem na badanie tych zjawisk w potencjałach wywołanych jest uśrednianie w podzbiorach lub  uśrednianie blokowe. Wymaga ono  zmiany paradygmatu rejestracji danych. Załóżmy, że interesującym nas bodźcem jest błysk światła. Chcemy zaobserwować ewentualne zmiany amplitudy i latencji w ciągu 100 potencjałów będących reakcją na błysk powtarzający się co 500 ms.&lt;br /&gt;
====Uśrednianie w podzbiorach ====&lt;br /&gt;
W metodzie tej musimy założyć, że proces habituacji jest powolny, tzn. zmiany pomiędzy kolejnymi reakcjami są bardzo małe. W takim przypadku możemy podzielić długą serię bodźców na ciąg pod-serii i uśrednienie przeprowadzić dla każdej pod-serii osobno.&lt;br /&gt;
[[Plik:Usrednianie_podzbiory.svg‎|640px|thumb|center|Ilustracja uśredniania w podzbiorach]]&lt;br /&gt;
&lt;br /&gt;
====Uśrednianie blokowe====&lt;br /&gt;
W tym celu eksperyment wykonujemy w wielu seriach. Jedna seria składa się ze 100 błysków powtarzanych co 500 ms.  Po serii następuje przerwa trwająca np. 5 s (długość przerwy wyraża nasze oszacowanie czasu potrzebnego na zanik habituacji). Po przerwie seria jest powtarzana. Powtórzeń serii wykonujemy ''N''.&lt;br /&gt;
Następnie uśredniamy fragmenty sygnałów odpowiadające sobie w kolejnych seriach. &lt;br /&gt;
&lt;br /&gt;
W tym paradygmacie zakładamy, że każda seria rejestrowana jest w tych samych warunkach. Zaniedbujemy efekty związane ze zmęczeniem i zmianami w np. stopniu koncentracji badanego.&lt;br /&gt;
[[Plik:Usrednianie blokowe.svg|Usrednianie blokowe.svg|640px|thumb|center|Ilustracja uśredniania w blokach]]&lt;br /&gt;
&lt;br /&gt;
===Załamki w krzywej potencjału wywołanego vs ukryte komponenty===&lt;br /&gt;
Komponenta potencjału wywołanego to bardzo ważne ale jednocześnie źle określone pojęcie. Krzywa otrzymana w wyniku uśredniania potencjałów wywołanych przedstawia serię załamków dodatnich i ujemnych, ale trzeba być świadomym, że ten przebieg napięcia rejestrowany przez elektrody przedstawia tak naprawdę sumę potencjałów pochodzących od wielu dość niezależnie działających źródeł w mózgu. Przyczynek pochodzący od jednego funkcjonalnego źródła będziemy określać jako komponentę. &lt;br /&gt;
&lt;br /&gt;
Komentarza wymaga też pojęcie źródła funkcjonalnego. Czynność elektryczną synchronicznie działających neuronów piramidalnych w określonym fragmencie kory mózgowej z pewnej odległości można przybliżyć potencjałem dipola prądowego. Taki aktywny fragment kory stanowi źródło dające przyczynek do mierzonego na powierzchni głowy potencjału. W najprostszej sytuacji taki przyczynek może być obserwowany jako komponenta. Mózg jest jednak obiektem niezwykle złożonym i gęsto połączonym. Wiele obszarów korowych może być funkcjonalnie połączonych i aktywowanych synchronicznie w celu realizacji określonego zadania &amp;amp;mdash; o takim funkcjonalnym zespole też możemy myśleć jako o pojedynczym źródle, choć może ono mieć złożoną strukturę przestrzenną. Często zatem myślimy o komponentach ukrytych potencjału wywołanego jako o aktywności takich funkcjonalnych zespołów. &lt;br /&gt;
&lt;br /&gt;
Po tym wstępie widać już chyba, że do zrozumienia co dzieje się w czasie reakcji na bodziec, którą obserwujemy w potencjale wywołanym, bardziej pożądane byłoby badanie komponent ukrytych niż poszczególnych załamków krzywej potencjału wywołanego, która stanowi ważoną sumę owych komponentów. Zanim przejdziemy do omówienia technik służących &amp;amp;bdquo;wyłuskiwaniu&amp;amp;rdquo; komponent prześledźmy kilka symulacji i wnioski z nich płynące.&lt;br /&gt;
&lt;br /&gt;
==== Załamki i komponenty nie są tym samym.====&lt;br /&gt;
Tę samą krzywą można otrzymać na nieskończenie wiele sposobów  przez sumowanie rożnych kombinacji domniemanych komponentów. Przykładowy rysunek pokazuje, jak tę samą krzywą można złożyć z dwóch rożnych zestawów komponentów (kod wytwarzający przykładową symulację pokazany jest poniżej).&lt;br /&gt;
[[Plik:Sumowanie_komponentow1.png|center|thumb|600px| Panel a) przedstawia hipotetyczną krzywą ERP, panel b) jedna z możliwych dekompozycji sygnału w panelu a), panel c) inna możliwa dekompozycja sygnału z panelu a) ]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
from __future__ import division&lt;br /&gt;
import numpy as np&lt;br /&gt;
from matplotlib.pyplot import plot, show ,subplot, figure, title, xlabel, ylabel, ylim&lt;br /&gt;
&lt;br /&gt;
Fs = 1&lt;br /&gt;
t = np.arange(0,700)&lt;br /&gt;
&lt;br /&gt;
C1 = np.exp(-(t-100)**2/(2*30**2))&lt;br /&gt;
C2 = np.exp(-(t-200)**2/(2*50**2))&lt;br /&gt;
C3 = np.exp(-(t-350)**2/(2*100**2))&lt;br /&gt;
ERP = 0.5*C1-C2+C3&lt;br /&gt;
&lt;br /&gt;
C2p = np.concatenate((C2[0:200], np.ones(30), C2[200:700-30] ))&lt;br /&gt;
C3p = ERP - 0.5*C1 + C2p&lt;br /&gt;
ERP_v2 = 0.5*C1-C2p+C3p&lt;br /&gt;
&lt;br /&gt;
subplot(3,1,1)&lt;br /&gt;
plot(t,ERP, t[::10],ERP_v2[::10],'g.')&lt;br /&gt;
ylabel('a)',rotation='horizontal')&lt;br /&gt;
ylim([-1, 1.5])&lt;br /&gt;
&lt;br /&gt;
subplot(3,1,2)&lt;br /&gt;
plot(t,0.5*C1,t,-C2,t,C3)&lt;br /&gt;
ylabel('b)',rotation='horizontal')&lt;br /&gt;
ylim([-1, 1.5])&lt;br /&gt;
&lt;br /&gt;
subplot(3,1,3)&lt;br /&gt;
plot(t,0.5*C1,t,-C2p,t,C3p)&lt;br /&gt;
ylabel('c)',rotation='horizontal')&lt;br /&gt;
ylim([-1, 1.5])&lt;br /&gt;
&lt;br /&gt;
show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Zmiana jednej komponenty może powodować zmiany w amplitudzie i latencji więcej niż jednego załamka.====&lt;br /&gt;
Poniższy rysunek przedstawia sytuację gdy zmiana amplitudy jednego komponentu może znacząco wpływać na amplitudę i latencję innych załamków.&lt;br /&gt;
&lt;br /&gt;
[[Plik:Sumowanie_komponentow2.png|center|thumb|768px| Panel a) przedstawia dwie hipotetyczne krzywe ERP, panel b) panel b i c komponenty z których powstały owe krzywe. Zmiana amplitudy komponentu oznaczonego kolorem powoduje zmianę amplitudy oznaczonych załamków ale także zmianę latencji wcześniejszego załamka. ]]&lt;br /&gt;
Poniżej kod odtwarzający powyższy przykład:&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
from __future__ import division&lt;br /&gt;
import numpy as np&lt;br /&gt;
from matplotlib.pyplot import plot, show, subplot, figure, title, xlabel, ylabel, ylim&lt;br /&gt;
&lt;br /&gt;
Fs = 1&lt;br /&gt;
t = np.arange(0,700)&lt;br /&gt;
&lt;br /&gt;
C1 = np.exp(-(t-100)**2/(2*30**2))&lt;br /&gt;
C2 = np.exp(-(t-200)**2/(2*50**2))&lt;br /&gt;
C3 = np.exp(-(t-350)**2/(2*100**2))&lt;br /&gt;
ERP1 = 0.5*C1-C2+C3&lt;br /&gt;
ERP2 = 0.5*C1-C2+1.5*C3&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
subplot(3,1,1)&lt;br /&gt;
plot(t,ERP1,'b', t,ERP2,'g')&lt;br /&gt;
plot(t[np.argmin(ERP1)],np.min(ERP1),'r.' )&lt;br /&gt;
plot(t[np.argmax(ERP1)],np.max(ERP1),'m.' )&lt;br /&gt;
plot(t[np.argmin(ERP2)],np.min(ERP2),'r.' )&lt;br /&gt;
plot(t[np.argmax(ERP2)],np.max(ERP2),'m.' )&lt;br /&gt;
&lt;br /&gt;
ylabel('a)',rotation='horizontal')&lt;br /&gt;
ylim([-1, 1.6])&lt;br /&gt;
&lt;br /&gt;
subplot(3,1,2)&lt;br /&gt;
plot(t,0.5*C1,'k',t,-C2,'k',t,C3,'b')&lt;br /&gt;
ylabel('b)',rotation='horizontal')&lt;br /&gt;
ylim([-1, 1.6])&lt;br /&gt;
&lt;br /&gt;
subplot(3,1,3)&lt;br /&gt;
plot(t,0.5*C1,'k',t,-C2,'k',t,1.5*C3,'g')&lt;br /&gt;
ylabel('c)',rotation='horizontal')&lt;br /&gt;
ylim([-1, 1.6])&lt;br /&gt;
&lt;br /&gt;
show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Instrukcje do ćwiczeń =&lt;br /&gt;
&lt;br /&gt;
==Zadanie 1: uśrednianie symulowanych sygnałów==&lt;br /&gt;
w tym ćwiczeniu chcemy pokazać efekty:&lt;br /&gt;
# uśredniania sygnałów związanych fazowo z bodźcem i nieskorelowanych z bodźcem / wpływ liczby realizacji,&lt;br /&gt;
# uśredniania sygnałów z fluktuacją latencji,&lt;br /&gt;
# wpływ filtrów o różnych funkcjach odpowiedzi impulsowej na morfologię uśrednionego potencjału.&lt;br /&gt;
&lt;br /&gt;
===Sygnały testowe===&lt;br /&gt;
Proszę zaimplementować funkcje generujące następujące przebiegi czasowe (oznaczenia: ''F&amp;lt;sub&amp;gt;s&amp;lt;/sub&amp;gt;'' &amp;amp;mdash; częstość próbkowania, ''T'' &amp;amp;mdash; czas trwania w sekundach, [[%C4%86wiczenia_1#Sygna.C5.82y_testowe|analogicznie do tego]]):&lt;br /&gt;
* sinusoida o zadanej częstości ''f'' i fazie &amp;lt;math&amp;gt;\phi&amp;lt;/math&amp;gt;: &amp;lt;tt&amp;gt;y = sin(f, phi, Fs, T)&amp;lt;/tt&amp;gt;,&lt;br /&gt;
* funkcja Gaussa o zadanym położeniu i szerokości &amp;lt;tt&amp;gt;y = g_1(t0, sigma, Fs, T) &amp;lt;/tt&amp;gt;&lt;br /&gt;
: &amp;lt;math&amp;gt;g_1(t) = \exp\left(-\frac{(t-t_0)^2}{2 \sigma^2}\right)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* pochodną funkcji Gaussa o zadanym położeniu i szerokości &amp;lt;tt&amp;gt;y = g_2(t0, sigma, Fs, T)&amp;lt;/tt&amp;gt;,&lt;br /&gt;
* połowę funkcji Gaussa o zadanym położeniu i szerokości &amp;lt;tt&amp;gt;y = g_3(t0, sigma, Fs, T)&amp;lt;/tt&amp;gt;,&lt;br /&gt;
: &amp;lt;math&amp;gt;g_{3}(t) = \left\{ &lt;br /&gt;
\begin{array}{lll}&lt;br /&gt;
0 &amp;amp; \mathrm{dla}&amp;amp; t&amp;lt;t_0 \\&lt;br /&gt;
\exp\left(-\frac{(t-t_0)^2}{2 \sigma^2}\right)&amp;amp; \mathrm{dla}&amp;amp; t \ge t_0  &lt;br /&gt;
\end{array}&lt;br /&gt;
\right. &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
W dalszych zadaniach tej sekcji przyjmiemy:&lt;br /&gt;
* ''T'' = 1 s,&lt;br /&gt;
* ''F&amp;lt;sub&amp;gt;s&amp;lt;/sub&amp;gt;'' = 128 Hz,&lt;br /&gt;
* ''t''&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; = 0,3 s,&lt;br /&gt;
* &amp;amp;sigma; = 0,02 s.&lt;br /&gt;
&lt;br /&gt;
===Uśrednianie w modelu addytywnym: sygnał + szum===&lt;br /&gt;
Dla funkcji &amp;lt;math&amp;gt;g_1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;g_2&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;g_3&amp;lt;/math&amp;gt;  wykonaj ''N'' symulacji sygnału opisanego daną funkcją z dodanym szumem gaussowskim (&amp;lt;tt&amp;gt;numpy.random.randn&amp;lt;/tt&amp;gt;). Zaobserwuj zmianę wariancji uśrednianego sygnału wraz z ''N''.&lt;br /&gt;
&lt;br /&gt;
===Uśrednianie w modelu addytywnym: sygnał + szum + niezależna czynność rytmiczna===&lt;br /&gt;
Powtórz poprzednie symulacje dokładając w każdej realizacji sinusoidę o losowo wybranej fazie. Symulacje wykonaj dla różnych częstości sinusoidy, takich których połówka okresu zbliżona jest do szerokości funkcji Gaussa, oraz znacząco od niej różnych.&lt;br /&gt;
&lt;br /&gt;
===Uśrednianie w modelu z resetem fazy===&lt;br /&gt;
Zbuduj sygnał składający się z dwóch fragmentów sinusoidy o częstości ''f'': &lt;br /&gt;
* pierwszy fragment ma losową fazę,&lt;br /&gt;
* drugi fragment ma fazę równą 0.&lt;br /&gt;
Wykonaj ''N'' realizacji takiego sygnału, przy czym każda realizacja ma częstość losowaną z rozkładu Gaussa o średniej 10 i pewnej wariancji (czyli &amp;lt;math&amp;gt;f \in \mathrm{N}(10,\sigma)&amp;lt;/math&amp;gt;). &lt;br /&gt;
Uśrednij otrzymane realizacje. Zaobserwuj zależność średniej od liczby uśrednianych realizacji i od wariancji częstości.&lt;br /&gt;
&lt;br /&gt;
===Uśrednianie potencjału z fluktuacją latencji===&lt;br /&gt;
Wygeneruj sygnały składające się z funkcji &amp;lt;math&amp;gt;g_1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;g_2&amp;lt;/math&amp;gt; albo &amp;lt;math&amp;gt;g_3&amp;lt;/math&amp;gt; z fluktuującą latencją, tzn. z wartością &amp;lt;math&amp;gt;t_0&amp;lt;/math&amp;gt; pochodzącą z jakiegoś rozkładu prawdopodobieństwa. U nas dla ustalenia uwagi niech będzie to rozkład Gaussa. Wykonaj zestaw symulacji obrazujący zależność od liczby realizacji i od wielkości fluktuacji, mierzonej przez wariancję rozkładu. Czy jest związek pomiędzy wariancją fluktuacji &amp;lt;math&amp;gt;t_0&amp;lt;/math&amp;gt; a szerokością załamków?&lt;br /&gt;
&lt;br /&gt;
===Wpływ filtrów===&lt;br /&gt;
# Zaprojektuj następujące filtry (przyjmij częstość próbkowania 128 Hz):&lt;br /&gt;
#* dolnoprzepustowy: Butterwortha z częstością odcięcia: 30, 40, 50 Hz, i rzędach od 1 do 5 (funkcja butter w module scipy.signal),&lt;br /&gt;
#* górnoprzepustowy: Butterwortha z częstością odcięcia: 0,1, 0,5, 2 i 5 Hz, i rzędach od 1 do 5,&lt;br /&gt;
#* notch: Czybyszewa II rodzaju z pasmem zaporowym ustawionym na 50 Hz, i rzędach od 1 do 3 (funkcja cheby2),&lt;br /&gt;
# Zbadaj funkcję odpowiedzi impulsowej i funkcję przenoszenia tych filtrów (w skali dB). Zaobserwuj jak długa jest odpowiedź impulsowa i jak daleko od częstości odcięcia zaburzone jest pasmo przenoszenia.&lt;br /&gt;
# Zastosuj powyższe filtry do funkcji &amp;lt;math&amp;gt;g_1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;g_2&amp;lt;/math&amp;gt; albo &amp;lt;math&amp;gt;g_3&amp;lt;/math&amp;gt;. Filtrowanie przeprowadź w jedną (lfilter) oraz w dwie strony (filtfilt). Zaobserwuj związek między zniekształceniem wprowadzanym przez filtr a funkcją odpowiedzi impulsowej filtru.&lt;br /&gt;
# W ćwiczeniu tym posłuż się symulowanymi sygnałami uzyskanymi z modelu addytywnego: &amp;amp;bdquo;sygnał+szum&amp;amp;rdquo;. Dla funkcji &amp;lt;math&amp;gt;g_1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;g_2&amp;lt;/math&amp;gt; albo &amp;lt;math&amp;gt;g_3&amp;lt;/math&amp;gt;  wykonaj ''N'' = 60 realizacji sygnału opisanego daną funkcją z dodanym szumem gaussowskim (&amp;lt;tt&amp;gt;numpy.random.randn&amp;lt;/tt&amp;gt;). Każdą z realizacji przefiltruj, a następnie uśrednij uzyskane sygnały.&lt;br /&gt;
&lt;br /&gt;
==Zadanie 2: rejestracje i analiza potencjałów wzrokowych==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- ===Synchronizacja występowania bodźców z sygnałem EEG===&lt;br /&gt;
&lt;br /&gt;
Rejestracja potencjałów wywołanych jest przykładem pomiaru czynności elektrycznej mózgu w odpowiedzi na określony bodziec. W przypadku tego rodzaju pomiarów konieczna jest synchronizacja momentu wystąpienia bodźca z sygnałem EEG. Wzmacniacze do pomiaru czynności elektrycznej mózgu wyposażone są w specjalne wejścia, na które można podawać sygnał odpowiadający pojawianiu się bodźca. Jak pamiętamy z zeszłego semestru, wejście to (jak i podawany na nie sygnał) nazywamy trigerem (ang. ''trigger'' &amp;amp;mdash; spust, cyngiel, wyzwalacz). W najprostszym przypadku, bodziec moglibyśmy wyświetlać na monitorze komputerowym, a sygnał związany z jego wystąpieniem wysyłać przez któryś z portów komputera (LPT, COM) na wzmacniacz EEG. Niestety, obecnie dostępne i popularne systemy operacyjne, takie jak Windows czy Linux nie są systemami czasu rzeczywistego (http://pl.wikipedia.org/wiki/System_operacyjny_czasu_rzeczywistego). Od momentu wyświetlania bodźca na ekranie, do pojawiania się sygnału odpowiednim porcie komputerowym może upłynąć kilkadziesiąt milisekund i co gorsza czas ten zwykle jest losowy. W przypadku gdy wzmacniacz próbkuje sygnał z częstością 1000 Hz, moment wystąpienia bodźca możemy określić z dokładnością 1 ms, jednakże wspomniane opóźnienia w systemie operacyjnym uniemożliwiają to. Ponadto, jak dowiedzieliśmy się w rozdziale wstępnym [http://brain.fuw.edu.pl/edu-wiki/action/edit/EEG:Potencja%C5%82y_wywo%C5%82ane?section=T-1], pierwsze załamki związane z potencjałami wywołanymi pojawiają się już 10 ms po wystąpieniu bodźca. W związku z tym, losowe, rzędu kilkudziesięciu milisekund opóźnienia sygnału określającego moment pojawienia się bodźca względem jego rzeczywistego wystąpienia są niedopuszczalne.&lt;br /&gt;
Istnieją pewne techniki programowania, dzięki którym opisywane opóźnienia można zmniejszyć, jednakże są one bardzo trudne  do realizacji. Ponadto, standardowe porty komputera, takie jak LPT, czy COM zostały zaprojektowane przede wszystkim do sterowania urządzeniami zewnętrznymi, a nie ich zasilania. Przykładowo, jedna linia portu drukarkowego (LPT) może być obciążona prądem nie większym niż 5 mA, podczas gdy do zapalenie zwykłej diody LED potrzeba około 10 mA. Taki pobór prądu możliwy jest do uzyskania z portu USB, jednakże  jest on  wyjątkowo trudny do oprogramowania.  &lt;br /&gt;
W celu ominięcia powyższych niedogodności w Zakładzie Fizyki Biomedycznej UW w przeprowadzanych eksperymentach wykorzystywane są  mikrokontrolery [http://pl.wikipedia.org/wiki/Mikrokontroler], w szczególności ATmega16 i ATmega32.  Mikrokontrolery te wyposażone są w procesory o architekturze RISC [http://pl.wikipedia.org/wiki/RISC] i mocy obliczeniowej porównywalnej z szeroko stosowanym kiedyś w komputerach ZX Spectrum, Commodore, Amiga i Atari procesorem Z80. Oprócz jednostki centralnej mikrokontrolery zawierają   stałą pamięć FLASH przeznaczoną do przechowywania kodu programu, pamięć  RAM i pamięć EEPROM, liczniki 8- i 16-bitowe, komparatory, przetworniki analogowo-cyfrowe, porty wejścia/wyjścia, łącze RS232 (popularnie nazywane portem szeregowym) i układy przerwań.&lt;br /&gt;
&lt;br /&gt;
Mikrokontrolery wchodzące w skład zestawów pomiarowych na Pracowni EEG zawierają program, który umożliwia komunikację z nimi poprzez port szeregowy. Obecnie, komputery są coraz rzadziej wyposażane w porty szeregowe. Standard komunikacji RS-232, opracowany w 1962 roku  nadal jest jednak popularny i często wykorzystywany do komunikacji miedzy urządzeniami.  W celu połączenia komputera posiadającego tylko porty USB z mikrokontrolerem zastosowano przejściówkę USB/RS-232. &lt;br /&gt;
&lt;br /&gt;
Jak każde urządzenie w systemie Linuks, przejściówka USB/RS-232 widoczna jest jako plik, znajdujący się w katalogu &amp;lt;tt&amp;gt;/dev&amp;lt;/tt&amp;gt;. Nazwy plików obsługujących urządzenia szeregowe to &amp;lt;tt&amp;gt;ttyXY&amp;lt;/tt&amp;gt;, gdzie &amp;lt;tt&amp;gt;XY&amp;lt;/tt&amp;gt; to kolejny numer przydzielony do urządzenia szeregowego.&lt;br /&gt;
Do komunikacji komputera z mikroknotrolerem  w Zakładzie Fizyki Biomedycznej UW została napisana prosta biblioteka.  Jej użycie jest następujące:&lt;br /&gt;
* Po podłączeniu przejściówki USB/RS232 do komputera mikrokontrolera sprawdź jaki plik w katalogu &amp;lt;tt&amp;gt;/dev&amp;lt;/tt&amp;gt; został utworzony i przydzielony do urządzenia. &lt;br /&gt;
* Zaimportuj bibliotekę do komunikacji z mikrokontrolerem: &lt;br /&gt;
: &amp;lt;tt&amp;gt;import SerialPort as SP&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Otwórz plik powiązany z urządzeniem zewnętrznym:&lt;br /&gt;
: &amp;lt;tt&amp;gt;sp = SP.SerialPort(nazwa_pliku) &amp;lt;/tt&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
: &amp;lt;tt&amp;gt;sp.open()&amp;lt;/tt&amp;gt;&lt;br /&gt;
W naszym przypadku prawidłowa nazwa pliku to &amp;lt;tt&amp;gt;/dev/ttyUSB0&amp;lt;/tt&amp;gt;.&lt;br /&gt;
* Po włączeniu zasilania mikrokontrolera, diody podłączone do niego i wykorzystywane w eksperymencie z potencjałami wywołanymi będą zapalone. Następujące polecenie zgasi obydwie diody:&lt;br /&gt;
: &amp;lt;tt&amp;gt;sp.blinkP300([0, 0])&amp;lt;/tt&amp;gt;&lt;br /&gt;
* Wydanie poniższego polecenia spowoduje, iż mikrokontroler zapali podłączoną do niego diodę numer 1 na czas 100 ms, zaś diodę numer 2 na 200 ms. Jednocześnie, w momencie włączenia jak i wyłączenia diody, sygnał z mikrokontrolera zostanie wysłany na 5-stykowe wejście AUX mikrokontrolera:&lt;br /&gt;
: &amp;lt;tt&amp;gt;sp.blinkP300([100, 200])&amp;lt;/tt&amp;gt;&lt;br /&gt;
* Jeśli chcemy zapalić tylko diodę numer dwa, np. na czas 500 ms w programie podajemy następującą instrukcję:&lt;br /&gt;
: &amp;lt;tt&amp;gt;sp.blinkP300([0, 500])&amp;lt;/tt&amp;gt;&lt;br /&gt;
* Jeśli chcemy zakończyć komunikację z mikrokontrolerem piszemy:&lt;br /&gt;
: &amp;lt;tt&amp;gt;sp.close()&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Kod biblioteki do komunikacji z mikrokontrolerem:&amp;lt;br&amp;gt;&lt;br /&gt;
--&amp;gt;&amp;lt;!--  Kod w Pythonie 2&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# -*- coding: cp1250 -*-&lt;br /&gt;
import serial&lt;br /&gt;
import logging&lt;br /&gt;
import sys&lt;br /&gt;
import os&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def to_hex_word(a):&lt;br /&gt;
    '''encodes a decimal number hexadecimally on two bytes'''&lt;br /&gt;
    return chr(a%256) + chr(a/256)&lt;br /&gt;
&lt;br /&gt;
class SerialPort(object):&lt;br /&gt;
    def __init__(self, port_name):&lt;br /&gt;
        import serial&lt;br /&gt;
        try:&lt;br /&gt;
            self.port = serial.Serial(&lt;br /&gt;
                port=port_name,&lt;br /&gt;
                baudrate=9600,&lt;br /&gt;
                bytesize=serial.EIGHTBITS,&lt;br /&gt;
                parity=serial.PARITY_NONE,&lt;br /&gt;
                stopbits=serial.STOPBITS_ONE,&lt;br /&gt;
                xonxoff=False&lt;br /&gt;
                )&lt;br /&gt;
        except serial.SerialException as e:&lt;br /&gt;
            print(&amp;quot;Nieprawidłowa nazwa portu lub port zajęty.&amp;quot;)&lt;br /&gt;
            raise e&lt;br /&gt;
        self.close()&lt;br /&gt;
        &lt;br /&gt;
    def open(self):&lt;br /&gt;
        self.port.open()&lt;br /&gt;
&lt;br /&gt;
    def close(self):&lt;br /&gt;
        self.port.close()&lt;br /&gt;
&lt;br /&gt;
    def send(self, value):&lt;br /&gt;
        self.port.write(value)&lt;br /&gt;
                           &lt;br /&gt;
    def blinkSSVEP(self,d, p1, p2):&lt;br /&gt;
        '''&lt;br /&gt;
        d = list of frequencies;&lt;br /&gt;
        p1:p2 = ratio LED_on_time/LED_off_time&lt;br /&gt;
        if you want i-th LED to be OFF all the time send  d[i] = 0&lt;br /&gt;
        if you want i-th LED to be ON all the time send  d[i] = -1&lt;br /&gt;
        in these two cases p1 and p2 do not matter&lt;br /&gt;
        '''&lt;br /&gt;
        clock  = 62500&lt;br /&gt;
        factor = float(p1) / float(p1 + p2)&lt;br /&gt;
    &lt;br /&gt;
        str = chr(3) # 'SSVEP_RUN'&lt;br /&gt;
&lt;br /&gt;
        for i in range(len(d)):&lt;br /&gt;
            # i-th LED OFF&lt;br /&gt;
            if d[i] == 0:                       &lt;br /&gt;
                str += to_hex_word(0) + to_hex_word(255) &lt;br /&gt;
            # i-th LED ON&lt;br /&gt;
            elif d[i] == -1:&lt;br /&gt;
                str += to_hex_word(255) + to_hex_word(0)&lt;br /&gt;
                #str = 'S'&lt;br /&gt;
                # i-th LED blinks d[i] times per second&lt;br /&gt;
                # p1:p2 = on_time:off_time in one blink&lt;br /&gt;
            else:&lt;br /&gt;
                period = clock/d[i]&lt;br /&gt;
                bright = int((clock/d[i]) * factor)&lt;br /&gt;
                dark = period - bright&lt;br /&gt;
                str += to_hex_word(bright) + to_hex_word(dark)&lt;br /&gt;
&lt;br /&gt;
        self.send(str)&lt;br /&gt;
&lt;br /&gt;
    def blinkP300(self,d):&lt;br /&gt;
        clock  = 62500&lt;br /&gt;
        str = chr(4) # 'P300_RUN'&lt;br /&gt;
&lt;br /&gt;
        for i in range(len(d)):&lt;br /&gt;
            period = int(clock*d[i]/1000.0)&lt;br /&gt;
            str += to_hex_word(period)&lt;br /&gt;
            print(period)&lt;br /&gt;
&lt;br /&gt;
        self.send(str)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
--&amp;gt;&amp;lt;!-- Kod w Pythonie 3 --&amp;gt;&amp;lt;!-- &amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# -*- coding: cp1250 -*-&lt;br /&gt;
import serial&lt;br /&gt;
import logging&lt;br /&gt;
import sys&lt;br /&gt;
import os&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
def to_hex_word(a):&lt;br /&gt;
    '''encodes a decimal number hexadecimally on two bytes'''&lt;br /&gt;
    return a.to_bytes(2,byteorder=sys.byteorder)&lt;br /&gt;
 &lt;br /&gt;
class SerialPort(object):&lt;br /&gt;
    def __init__(self, port_name):&lt;br /&gt;
        import serial&lt;br /&gt;
        try:&lt;br /&gt;
            self.port = serial.Serial(&lt;br /&gt;
                port=port_name,&lt;br /&gt;
                baudrate=9600,&lt;br /&gt;
                bytesize=serial.EIGHTBITS,&lt;br /&gt;
                parity=serial.PARITY_NONE,&lt;br /&gt;
                stopbits=serial.STOPBITS_ONE,&lt;br /&gt;
                xonxoff=False&lt;br /&gt;
                )&lt;br /&gt;
        except serial.SerialException as e:&lt;br /&gt;
            print(&amp;quot;Nieprawidłowa nazwa portu lub port zajęty.&amp;quot;)&lt;br /&gt;
            raise e&lt;br /&gt;
        self.close()&lt;br /&gt;
 &lt;br /&gt;
    def open(self):&lt;br /&gt;
        self.port.open()&lt;br /&gt;
 &lt;br /&gt;
    def close(self):&lt;br /&gt;
        self.port.close()&lt;br /&gt;
 &lt;br /&gt;
    def send(self, value):&lt;br /&gt;
        self.port.write(value)&lt;br /&gt;
 &lt;br /&gt;
    def blinkSSVEP(self,d, p1, p2):&lt;br /&gt;
        '''&lt;br /&gt;
        d = list of frequencies;&lt;br /&gt;
        p1:p2 = ratio LED_on_time/LED_off_time&lt;br /&gt;
        if you want i-th LED to be OFF all the time send  d[i] = 0&lt;br /&gt;
        if you want i-th LED to be ON all the time send  d[i] = -1&lt;br /&gt;
        in these two cases p1 and p2 do not matter&lt;br /&gt;
        '''&lt;br /&gt;
        clock  = 62500&lt;br /&gt;
        factor = float(p1) / float(p1 + p2)&lt;br /&gt;
 &lt;br /&gt;
        str = (3).to_bytes(1,byteorder=sys.byteorder) # 'SSVEP_RUN'&lt;br /&gt;
 &lt;br /&gt;
        for i in range(len(d)):&lt;br /&gt;
            # i-th LED OFF&lt;br /&gt;
            if d[i] == 0:                       &lt;br /&gt;
                str += to_hex_word(0) + to_hex_word(255) &lt;br /&gt;
            # i-th LED ON&lt;br /&gt;
            elif d[i] == -1:&lt;br /&gt;
                str += to_hex_word(255) + to_hex_word(0)&lt;br /&gt;
                #str = 'S'&lt;br /&gt;
                # i-th LED blinks d[i] times per second&lt;br /&gt;
                # p1:p2 = on_time:off_time in one blink&lt;br /&gt;
            else:&lt;br /&gt;
                period = clock/d[i]&lt;br /&gt;
                bright = int((clock/d[i]) * factor)&lt;br /&gt;
                dark = int(period - bright)&lt;br /&gt;
                str += to_hex_word(bright) + to_hex_word(dark)&lt;br /&gt;
 &lt;br /&gt;
        self.send(str)&lt;br /&gt;
 &lt;br /&gt;
    def blinkP300(self,d):&lt;br /&gt;
        clock  = 62500&lt;br /&gt;
        str = (4).to_bytes(1,byteorder=sys.byteorder) # 'P300_RUN'&lt;br /&gt;
 &lt;br /&gt;
        for i in range(len(d)):&lt;br /&gt;
            period = int(clock*d[i]/1000.0)&lt;br /&gt;
            str += to_hex_word(period)&lt;br /&gt;
 &lt;br /&gt;
        self.send(str)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
--&amp;gt;&amp;lt;!--&lt;br /&gt;
&lt;br /&gt;
===Zestaw eksperymentalny===&lt;br /&gt;
Zestaw składa się ze:&lt;br /&gt;
* wzmacniacza,&lt;br /&gt;
* stymulatora   &lt;br /&gt;
--&amp;gt;&amp;lt;!--* izolowanego galwanicznie układu generującego impulsy odpowiadające gaszeniu i zapalaniu diody,  o wartościach dopasowanych do akceptowalnych przez wejścia AUX wzmacniacza,--&amp;gt;&amp;lt;!--&lt;br /&gt;
* komputera: w tym eksperymencie komputer będzie służył do zaprogramowania stymulatora i do rejestracji sygnałów.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
===Eksperyment 1. Obserwacja bodźca wzrokowego  ===&lt;br /&gt;
&amp;lt;!--Proszę zapoznać się ze standardami rejestracji wzrokowych potencjałów wywołanych [http://www.gcu.ac.uk/media/gcalwebv2/theuniversity/academicschools/sls/psytimetables/SLS%20-%20VEP_Standard_2010.pdf] --&amp;gt;&lt;br /&gt;
Proszę zapoznać się z typowym wyglądem załamków w przypadku potencjałów wzrokowych, jaki jest przedstawiony na [https://link.springer.com/article/10.1007/s10633-009-9195-4/figures/2 rysunku] (cały artykuł jest dostępny [http://link.springer.com/article/10.1007%2Fs10633-009-9195-4 tu]).&lt;br /&gt;
&amp;lt;!--[[Plik:Fig 4 VEP.jpg|thumb|320px|right|&amp;lt;figure id=&amp;quot;fig:zalamki_VEP&amp;quot;&amp;gt;&amp;lt;/figure&amp;gt;&lt;br /&gt;
&amp;lt;xr id=&amp;quot;fig:zalamki_VEP&amp;quot;&amp;gt;Rys. %i.&amp;lt;/xr&amp;gt; Schemat załamków rozpoznawanych we wzrokowych potencjach wywołanych (z pracy: J. V. Odom i in. &amp;amp;bdquo;ISCEV standard for clinical visual evoked potentials&lt;br /&gt;
(2009 update)&amp;amp;rdquo;, Doc Ophthalmol (2010), 120:111–119).]]&lt;br /&gt;
--&amp;gt; &lt;br /&gt;
&lt;br /&gt;
==== Rejestracja ====&lt;br /&gt;
* Paradygmat: z odległości około 40 cm badany obserwuje wyświetalny na ekranie biały kwadrat. Bodźce trwają 300 ms i  powtarzają się co 0.5 sekundy. Bodziec poprzedza punkt fiksacji pokazywany przez 300 ms. Natężenie bodźca ma przyjąć jedną z 4 wartości (manipulujemy jego przeźroczystością: 1, 0.7, 0.3 i 0.1, gdzie 1 oznacza brak przeźroczystości). Każda z intensywności bodźca ma pojawić się 100 razy podczas badania, bodźce podawane mają być w sposób losowy. Zadanie poprzedza krótka instrukcja, kończy podziękowanie. &lt;br /&gt;
&lt;br /&gt;
* Pomiar&lt;br /&gt;
**Zakładamy czepek i elektrody w systemie 10-20, dbamy o to by opory pomiędzy elektrodami były poniżej 10 k&amp;amp;Omega; i różnice pomiędzy oporami różnych elektrod nie przekraczały 20%. [[Plik:Glowka10-20 ERPy.svg|thumb|600px|right]]&lt;br /&gt;
** Elektrodę GND mocujemy w otworze czepka odpowiadającym pozycji AFz (na linii centralnej 10% w stronę nosa od elektrody Fz) &lt;br /&gt;
** Montujemy także elektrody M1 i M2 i FCz.&lt;br /&gt;
&lt;br /&gt;
==== Analiza ====&lt;br /&gt;
# Filtrujemy sygnał w paśmie 1-20 Hz.&lt;br /&gt;
# Z ciągłego zapisu wycinamy fragmenty od &amp;amp;minus;300 ms do +800 ms (zero oznacza moment wystąpienia bodźca). W czasie wycinania badamy wycinane fragmenty pod względem zakresu amplitudy (wszystkie kanały powinny mieć amplitudę w granicach &amp;amp;plusmn;75 &amp;amp;mu;V) i zawartości artefaktów od mrugania (w tym celu trzeba oglądając sygnał w SVAROG-u ustalić próg na amplitudę sygnału w kanałach Fp1 i Fp2).&lt;br /&gt;
# Uśredniamy wycięte sygnały.&lt;br /&gt;
# Rysujemy średni potencjał we wszystkich kanałach.&lt;br /&gt;
# Pierwszy sposób: Identyfikujemy załamki P1 i N2. Mierzymy amplitudę P1 jako różnicę między ekstremalną wartością załamka N2 a ekstremalną wartością załamka N2. &lt;br /&gt;
# Drugi sposób: Identyfikujemy załamki P1 i N2. Mierzymy amplitudę P1 w stosunku do zera. &lt;br /&gt;
#porównujemy uzyskane amplitudy w 4 warunkach za pomocą odpowiedniego testu statystycznego (porównanie warunków ze skrajnymi wartościami amplitudy - zastosuj test permutacyjny (opisany poniżej) lub test t-Studenta/nieparametryczny odpowiednik). &lt;br /&gt;
&lt;br /&gt;
**Opis testu permutacyjnego &lt;br /&gt;
Pytanie: Czy intensywność bodźca wpływa na amplitudę potencjału P1?&lt;br /&gt;
Jak stwierdzić czy amplitudy załamków P1 istotnie różnią się pomiędzy seriami?&lt;br /&gt;
&lt;br /&gt;
Musimy przeprowadzić test statystyczny. Możemy skonstruować go np. tak:&lt;br /&gt;
Mamy dwa warunki I i II. Jako statystykę przyjmiemy różnicę pomiędzy amplitudą załamka zmierzoną w serii z dwoma diodami (P2&amp;lt;sub&amp;gt;II&amp;lt;/sub&amp;gt;) a amplitudą zmierzoną w serii z jedną diodą (P2&amp;lt;sub&amp;gt;I&amp;lt;/sub&amp;gt;):&lt;br /&gt;
: ''S'' = P2&amp;lt;sub&amp;gt;II&amp;lt;/sub&amp;gt; &amp;amp;minus; P2&amp;lt;sub&amp;gt;I&amp;lt;/sub&amp;gt;&lt;br /&gt;
Postawmy hipotezę zerową, że nie ma różnicy w amplitudzie pomiędzy warunkiem II a I oraz hipotezę alternatywną, że różnica taka występuje.&lt;br /&gt;
: H&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;: ''S'' = 0&lt;br /&gt;
: H&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;: ''S'' &amp;amp;ne; 0&lt;br /&gt;
Zgodnie z H&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; dla wartości ''S'' nie ma różnicy czy realizacja została zarejestrowana w warunkach I czy II, zatem można losowo poprzypisywać numery warunków do realizacji i w ten sposób uzyskać rozkład statystyki ''S'' pod warunkiem prawdziwości H&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;, czyli obliczyć średnie potencjały dla &amp;amp;bdquo;pomieszanych&amp;amp;rdquo; tagów, wyliczyć średnie potencjały dla sztucznie wygenerowaych grup, i wyliczyć różnicę amplitud dla tych średnich, czyli wartość statystyki dla hipotezy H&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Zaimplementuj test permutacyjny zgodny z powyższą koncepcją.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- ===Wersja 2: obserwacja habituacji / uśrednianie w blokach ===&lt;br /&gt;
==== Rejestracja ====&lt;br /&gt;
# Paradygmat: &lt;br /&gt;
#* z odległości około 40 cm badany obserwuje błyski diody. &lt;br /&gt;
#* Błyski powtarzają się co 0,5 sekundy. &lt;br /&gt;
#* Rejestrujemy 60 serii po 15 błysków.  &lt;br /&gt;
#* Pomiędzy seriami badany odpoczywa około 10 sekund.&lt;br /&gt;
# Zakładamy czepek i elektrody w systemie 10-20, dbamy o to by opory pomiędzy elektrodami były poniżej 5 k&amp;amp;Omega; i różnice pomiędzy oporami różnych elektrod nie przekraczały 20%.&lt;br /&gt;
#* Elektrodę GND mocujemy w otworze czepka odpowiadającym pozycji AFz (na linii centralnej 10% w stronę nosa od elektrody Fz) &lt;br /&gt;
#* Montujemy także elektrodę FCz (na linii centralnej pomiędzy Fz a Cz), będziemy jej używać w montażu i w czasie analizy jako referencji.&lt;br /&gt;
#* Częstość próbkowania 512 Hz.&lt;br /&gt;
&lt;br /&gt;
==== Analiza ====&lt;br /&gt;
# Filtrujemy sygnał w paśmie 0,1-20 Hz.&lt;br /&gt;
# Z ciągłego zapisu wycinamy fragmenty od &amp;amp;minus;300 ms do +600 ms (zero oznacza moment wystąpienia bodźca). W czasie wycinania badamy wycinane fragmenty pod względem zakresu amplitudy (wszystkie kanały powinny mieć amplitudę w granicach &amp;amp;plusmn;75 &amp;amp;mu;V) i zawartości artefaktów od mrugania (w tym celu trzeba oglądając sygnał w SVAROG-u ustalić próg na amplitudę sygnału w kanałach Fp1 i Fp2).&lt;br /&gt;
# Uśredniamy wycięte sygnały o tym samym numerze wewnątrz serii.&lt;br /&gt;
# Rysujemy serie 15 uśrednionych potencjałów dla tego kanału, który wykazywał najsilniejszy potencjał w pierwszej wersji eksperymentu. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Eksperyment 2: rejestracja i analiza potencjału P3 ===&lt;br /&gt;
====Rejestracja ====&lt;br /&gt;
# Paradygmat: &lt;br /&gt;
#* z odległości około 40 cm badany obserwuje kwadrat, który występuje w dwóch kolorach. &lt;br /&gt;
#* Bodźce trwają 300 ms, poprzedzane punktem fiksacji wyświetlanym na 300 ms, przerwa między próbami jest losowana i wynosi od 0.8-1.2 s.  &lt;br /&gt;
#* Proporcja wystapień bodźców koloru pierwszego i drugiego wynosi 1:5.   &lt;br /&gt;
#* Zadaniem badanego jest liczenie kwadratów w rzadkim kolorze. &lt;br /&gt;
#* Wykonujemy tyle realizacji aby zarejestrować 100 powtórzeń bodźców rzadkich. &lt;br /&gt;
# Zakładamy czepek i elektrody w systemie 10-20, dbamy o to by opory pomiędzy elektrodami były poniżej 5 k&amp;amp;Omega; i różnice pomiędzy oporami różnych elektrod nie przekraczały 20%.&lt;br /&gt;
#* Elektrodę GND mocujemy w otworze czepka odpowiadającym pozycji AFz (na linii centralnej 10% w stronę nosa od elektrody Fz) &lt;br /&gt;
#* Montujemy także elektrody M1 i M2, będziemy ich używać w montażu i w czasie analizy jako referencji typu połączone uszy.&lt;br /&gt;
#* Częstość próbkowania 512 Hz.&lt;br /&gt;
&lt;br /&gt;
==== Analiza ====&lt;br /&gt;
# Filtrujemy sygnał w paśmie 1-20 Hz.&lt;br /&gt;
# Z ciągłego zapisu wycinamy fragmenty od &amp;amp;minus;300 ms do +900 ms (zero oznacza moment wystąpienia bodźca). W czasie wycinania badamy wycinane fragmenty pod względem zakresu amplitudy (wszystkie kanały powinny mieć amplitudę w granicach &amp;amp;plusmn;75 &amp;amp;mu;V) i zawartości artefaktów od mrugania (w tym celu trzeba oglądając sygnał w SVAROG-u ustalić próg na amplitudę sygnału w kanałach Fp1 i Fp2).&lt;br /&gt;
# Uśredniamy osobno realizacje dla każdego koloru kwadratu. &lt;br /&gt;
# Nakładamy na siebie na rysunkach oba typy średnich.&lt;br /&gt;
# wyznaczamy amplitudę P3 i liczymy test statystyczny pomiędzy warunkami&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- ==Ćwiczenie dodatkowe: P300 BCI==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wykorzystujemy elektrody z systemu 10-10 umieszczone nad korą wzrokową: P07, O1, O2, PO8, PO3, PO4, Pz, Cz.&lt;br /&gt;
&lt;br /&gt;
Uruchamiamy &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
obci_gui --presets eeg_workshop&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
i z guzika &amp;amp;bdquo;select amplifier&amp;amp;rdquo; wybieramy właściwy wzmacniacz.&lt;br /&gt;
&lt;br /&gt;
Do kontroli jakości sygnału możemy uruchomić Svaroga.&lt;br /&gt;
&lt;br /&gt;
Dane z kalibracji zapisują się w pliku test1 w katalogu domowym użytkownika, z labiryntu w pliku test2.&lt;br /&gt;
&lt;br /&gt;
Po zakończeniu kalibracji pojawia się napis &amp;amp;bdquo;Trwają obliczenia&amp;amp;rdquo; lub podobny. Odczekujemy kilka minut, aż skończy się peer &amp;amp;bdquo;Calibration&amp;amp;rdquo; (widoczny w obci_gui) i zamykamy okienko klawiszami Alt-F4 lub zatrzymując scenariusz guzikiem &amp;amp;bdquo;Stop&amp;amp;rdquo;. W katalogu domowym pojawi się plik z wynikami kalibracji, co pozwala na uruchomienie scenariusza &amp;amp;bdquo;labirynt&amp;amp;rdquo;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Po zebraniu danych, przed wczytaniem ich do Svaroga należy w tym samym katalogu uruchomić skrypt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
#!/usr/bin/env python&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
&lt;br /&gt;
from obci.analysis.obci_signal_processing.tags import tags_file_writer&lt;br /&gt;
from obci.analysis.obci_signal_processing.read_manager import ReadManager&lt;br /&gt;
&lt;br /&gt;
def main(): &lt;br /&gt;
	file_name = 'test1'&lt;br /&gt;
	&lt;br /&gt;
	mgr = ReadManager(&lt;br /&gt;
		file_name + '.obci.xml',&lt;br /&gt;
		file_name + '.obci.raw',&lt;br /&gt;
		file_name + '.obci.tag')&lt;br /&gt;
	&lt;br /&gt;
	tags = mgr.get_tags()&lt;br /&gt;
	for i in xrange(0, len(tags)):&lt;br /&gt;
		if tags[i]['desc']['index'] == tags[i]['desc']['target']:&lt;br /&gt;
			tags[i]['name'] = 'blink_target'&lt;br /&gt;
		else:&lt;br /&gt;
			tags[i]['name'] = 'blink'&lt;br /&gt;
			&lt;br /&gt;
	tags_writer = tags_file_writer.TagsFileWriter(file_name + '.obci.tag')&lt;br /&gt;
	for tag in tags:&lt;br /&gt;
		tags_writer.tag_received(tag)		&lt;br /&gt;
	tags_writer.finish_saving(0)	&lt;br /&gt;
 &lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Aduszyk</name></author>
		
	</entry>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=Pracownia_EEG/Potencja%C5%82y_wywo%C5%82ane&amp;diff=8982</id>
		<title>Pracownia EEG/Potencjały wywołane</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=Pracownia_EEG/Potencja%C5%82y_wywo%C5%82ane&amp;diff=8982"/>
		<updated>2022-11-08T11:18:51Z</updated>

		<summary type="html">&lt;p&gt;Aduszyk: /* Zadanie 2: rejestracje i analiza potencjałów wzrokowych */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Pracownia EEG|Pracownia EEG]] / Potencjały wywołane&lt;br /&gt;
&lt;br /&gt;
=Wstęp=&lt;br /&gt;
==Potencjały wywołane==&lt;br /&gt;
=== Wstęp ===&lt;br /&gt;
Potencjały wywołane EEG (ang. ''evoked potentials'', EP) są śladami odpowiedzi mózgu na bodźce. W przypadku MEG poprawnie mówi się o polach wywołanych (ang. ''evoked fields'', EF).&lt;br /&gt;
Zwykle reakcja ta jest mała (wyjątek stanowią [[Elektroencefalografia/Metody_analizy_sygnałów_EEG_-_analiza_w_dziedzinie_czasu |kompleksy K]]) i w zapisie pojedynczej realizacji reakcji na bodziec najczęściej niewidoczna wśród czynności pochodzącej od wielu innych procesów zachodzących w tym samym czasie w mózgu. &lt;br /&gt;
Ich wyodrębnienie z tak zwanego tła EEG/MEG, czyli manifestacji elektrycznej innych, trwających w tym samym czasie w mózgu procesów (aktywny prąd niezależny), wymaga w dniu dzisiejszym zapisu odpowiedzi na szereg powtórzeń tego samego bodźca (&amp;lt;xr id=&amp;quot;fig:EP&amp;quot;&amp;gt;rys. %i&amp;lt;/xr&amp;gt;). Pierwsze potencjały wywołane pokazał pod koniec lat 40-tych Dawson (Dawson 1947) wykonując superpozycję pojedynczych realizacji na kliszy fotograficznej.&lt;br /&gt;
Z czasem skomplikowane urządzenia analogowe zastąpione zostały przez cyfrowe uśrednianie kolejnych fragmentów EEG, zsynchronizowanych według momentu wystąpienia bodźca, łatwo realizowane za pomocą komputera.&lt;br /&gt;
&lt;br /&gt;
[[Grafika:EP.png|thumb|640px|center|&amp;lt;figure id=&amp;quot;fig:EP&amp;quot;&amp;gt;&amp;lt;/figure&amp;gt;&lt;br /&gt;
Uśrednianie potencjałów wywołanych. a) ciągły zapis EEG z wyróżnionymi momentami wystąpienia bodźca (w tym przypadku słuchowego) b) kilkadziesiąt kolejnych odcinków, wyciętych jako sekunda EEG od momentu wystąpienia kolejnych bodźców, ustawione jeden pod drugim c) uśredniony potencjał wywołany &amp;amp;mdash; widać m. in. załamek P300 ok. 300 milisekund po bodźcu]]&lt;br /&gt;
&lt;br /&gt;
Techniki te opierają się na założeniu, że zawarta w EEG odpowiedź mózgu na każdy z kolejnych bodźców jest niezmienna, a EEG odzwierciedlające pozostałe procesy traktowane jest jak nieskorelowany z nią proces stochastyczny. Zależnie od rodzaju potencjałów wywołanych, założenia te są mniej lub bardziej nieuzasadnione; podważa je choćby powszechnie znany efekt habituacji, polegający na osłabieniu późnych potencjałów wywołanych kolejnymi powtórzeniami bodźca.&lt;br /&gt;
&lt;br /&gt;
Istota potencjałów wywołanych jest przedmiotem otwartej dyskusji i dziesiątków prac, dotykających od lat podstawowych w tej dziedzinie pytań: czym jest potencjał wywołany, który widzimy w uśrednionym przebiegu? Czy naprawdę wynika z deterministycznie powtarzanej, jednakowej odpowiedzi pojawiającej się po każdym powtórzeniu bodźca niezależnie od &amp;amp;bdquo;tła&amp;amp;rdquo;, czy może wynika z reorganizacji faz tego właśnie &amp;amp;bdquo;tła&amp;amp;rdquo; EEG, czy może kombinacji tych dwóch efektów? Jest to wspaniałe pole dla zastosowań zaawansowanych metod modelowania i analizy sygnałów. W ostatnich latach powstają dziesiątki prac na ten temat, a od czasu do czasu również krytyczne artykuły wykazujące, że dotychczasowe odkrycia są raczej artefaktami stosowanych metod a nie wynikają z własności analizowanych danych (Yeung et al., 2004). Jak widać jest tu wciąż bardzo wiele do zrobienia, gdyż zrozumienie tego mechanizmu stoi na drodze do &amp;amp;bdquo;świętego Graala&amp;amp;rdquo;, którym w tej dziedzinie jest wyodrębnienie pojedynczych potencjałów wywołanych.&lt;br /&gt;
&lt;br /&gt;
Niezależnie od tego, w neurofizjologii klinicznej nazwą potencjał wywołany określa się krzywą widoczną po uśrednieniu odpowiedzi na kilkanaście do kilku tysięcy bodźców (Szelenberger 2000). Gromadzona od dziesięcioleci wiedza o behawioralnych i klinicznych korelatach potencjałów wywołanych opiera się na rozpoznawaniu w przebiegach uśrednionych tak zwanych załamków, czyli przejściowych wzrostów lub spadków potencjału (na przykład na &amp;lt;xr id=&amp;quot;fig:EP&amp;quot;&amp;gt;rys. %i&amp;lt;/xr&amp;gt; widać załamek P300). Nazwy załamków składają się zwykle z litery &amp;amp;bdquo;P&amp;amp;rdquo; (od ang. ''positive''), jeśli wychylenie jest dodatnie, lub &amp;amp;bdquo;N&amp;amp;rdquo; (od ang. ''negative''), jeśli wychylenie jest ujemne, oraz liczby. Uwaga: &lt;br /&gt;
* Nie ma niestety jednej ustalonej konwencji prezentacji potencjałów koniecznie trzeba więc zwracać uwagę na orientację wykresu, a wykonując wykres samemu - zamieszczać informację o orientacji kierunku dodatniego,gdyż kierunek dodatni może być wykresie skierowany do góry lub do dołu. &lt;br /&gt;
* Liczba następująca po N lub P określa przybliżoną liczbę milisekund od wystąpienia bodźca, czyli tak zwaną latencję. Nie można jednak ścisłego związku między tą liczbą a liczbą milisekund np. potencjał P300 w zależności od szczegółów paradygmatu doświadczalnego może wystąpić znacznie później. np. w eksperymentach językowych zdarza się że P300 występuje później niż N400 :-).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;xr id=&amp;quot;fig:zalamki&amp;quot;&amp;gt;Rys. %i&amp;lt;/xr&amp;gt; przedstawia schematycznie najważniejsze załamki rozpoznawane w potencjałach słuchowych, czyli wywoływanych bodźcem dźwiękowym. Dla potencjałów wzrokowych i somatosensorycznych istnieją podobne klasyfikacje.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Grafika:Zalamki.png|thumb|320px|right|&amp;lt;figure id=&amp;quot;fig:zalamki&amp;quot;&amp;gt;&amp;lt;/figure&amp;gt;&lt;br /&gt;
Orientacyjny schemat załamków rozpoznawanych w słuchowych potencjach wywołanych, na podstawie (Szelenberger 2000). Skala czasu logarytmiczna. Najszybsze (do 12 ms) składowe egzogenne to potencjały pniowe (BAEP), oznaczane jako fale I-VII. Litery &amp;amp;bdquo;P&amp;amp;rdquo; i &amp;amp;bdquo;N&amp;amp;rdquo; oznaczają dodatnie i ujemne wychylenia związane z dalszymi załamkami]]&lt;br /&gt;
&lt;br /&gt;
Najszybsze (czyli o najmniejszej latencji) składowe to potencjały egzogenne, odzwierciedlające wstępne fazy przekazu informacji. W potencjałach słuchowych są to potencjały pnia (ang. ''brainstem auditory evoked potentials'', BAEP), składające się z siedmiu fal występujących pomiędzy 1 a 12 ms od bodźca. Są one generowane np. w nerwie słuchowym czy pniu mózgu, i wykorzystywane w klinicznej diagnostyce integralności dróg słuchowych. Podobnie jak inne wczesne potencjały o latencjach poniżej 100 ms, są praktycznie niezależne od stanu uwagi.&lt;br /&gt;
&lt;br /&gt;
Po potencjałach o średniej latencji (między 12 a 50 ms) zaczynają się późne potencjały słuchowe (od 100 ms od podania bodźca), odzwierciedlające bardziej złożone reakcje na bodziec. Potencjały ok. 100 ms obserwowane w okolicach sensorycznych odzwierciedlają odpowiedź tejże kory na bodziec. Ich amplituda zależy od parametrów fizycznych bodźca oraz od uwagi, np. amplituda załamka N100 wzrasta w stanie skupienia uwagi czy pobudzenia emocjonalnego. Pierwszy i najpopularniejszy całkowicie endogenny załamek to P300, pojawiający się po rozpoznaniu bodźca oczekiwanego, na którym skupiamy uwagę: na przykład, jeśli w serii pojawiających się losowo liter mamy zliczać wystąpienia jednej z nich, to na średniej odpowiedzi na pojawienie się tej litery pojawi się załamek P300. Załamek ten występuje również w odpowiedzi na bodźce wyczekiwane, niespodziewane i ważne dla osoby (np. własne imię). &lt;br /&gt;
&lt;br /&gt;
=== Uśrednianie w dziedzinie czasu ===&lt;br /&gt;
Jak już było wspomniane powyżej podstawową techniką stosowaną do analizy potencjałów wywołanych jest uśrednianie wielu realizacji odpowiedzi na bodziec wyrównanych względem jakiegoś charakterystycznego zdarzenia, np. momentu podania bodźca albo momentu behawioralnej reakcji na bodziec (np. wciśnięcie przycisku). Podejście to bazuje na trzech założeniach:&lt;br /&gt;
* Reakcja jest czasowo związana z bodźcem. Tzn. w kolejnych realizacjach występuje ona zawsze z tym samym opóźnieniem.&lt;br /&gt;
* Reakcja na bodziec skutkuje zawsze pojawieniem się w sygnale składowej o stałym kształcie (mówimy o stałej morfologii).&lt;br /&gt;
* Spontaniczna czynność EEG &amp;amp;mdash; ta która nie dotyczy przetwarzania interesującego nas bodźca &amp;amp;mdash; jest niezależnym, stacjonarnym szumem o średniej zero.&lt;br /&gt;
&lt;br /&gt;
Zgodnie z powyższymi założeniami mierzony w ''i''-tej realizacji sygnał można wyrazić jako:&lt;br /&gt;
: &amp;lt;math&amp;gt;x_i(t) = s(t) + n_i(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
Uśrednianie po ''N'' realizacjach daje:&lt;br /&gt;
: &amp;lt;math&amp;gt;\bar x (t) = \frac{1}{N} \sum_{i=1}^N x_i(t) = \frac{1}{N} \left(N s(t) + \sum_{i=1}^N n_i(t) \right) &amp;lt;/math&amp;gt;&lt;br /&gt;
Wartość oczekiwana średniego sygnału wynosi:&lt;br /&gt;
: &amp;lt;math&amp;gt;\mathrm{E}\left[ \bar x(t) \right] = s(t) &amp;lt;/math&amp;gt;&lt;br /&gt;
gdyż dla szumu o średniej zero mamy:&lt;br /&gt;
: &amp;lt;math&amp;gt;\mathrm{E}\left[\frac{1}{N} \sum_{i=1}^N n_i(t)\right] = 0&amp;lt;/math&amp;gt;.&lt;br /&gt;
Wariancja &amp;lt;math&amp;gt;\bar x(t)&amp;lt;/math&amp;gt; wynosi:&lt;br /&gt;
: &amp;lt;math&amp;gt;\sigma^2_{\bar x(t)} = \mathrm{E} \left[  \left( \frac{1}{N} \sum_{i=1}^N n_i(t)\right)^2 \right] \approx \frac{1}{N} \sigma^2_{n(t)}&amp;lt;/math&amp;gt;&lt;br /&gt;
gdyż &amp;lt;math&amp;gt;s(t)&amp;lt;/math&amp;gt; jest deterministyczne. &lt;br /&gt;
&lt;br /&gt;
Dla potencjałów pojawiających się w pierwszych kilkudziesięciu milisekundach po bodźcu model ten można uznać za poprawny, gdyż wykazują one zależność głównie od parametrów fizycznych bodźca. Dla późniejszych składowych staje się on coraz bardziej wątpliwy ze względu na występujące korelacje ze stanem (np. uwagi) badanego.&lt;br /&gt;
&lt;br /&gt;
Dla późniejszych składowych można by postulować bardziej ogólną wersję modelu potencjału wywołanego:&lt;br /&gt;
: &amp;lt;math&amp;gt;x_i(t) = s_i(t) + n_i(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
Ten model uwidacznia, że do opisu potencjału wywołanego potrzebna jest nie tylko średnia, ale i wyższe momenty rozkładu (np. drugi moment centralny czyli wariancja).&lt;br /&gt;
&lt;br /&gt;
====Wariancja w przypadku szumu skorelowanego ====&lt;br /&gt;
W poprzednim paragrafie pokazaliśmy, że w przypadku niezależnego szumu wariancja uśrednionego sygnału (w danej chwili czasu) maleje jak  &amp;lt;math&amp;gt;\frac{1}{N}&amp;lt;/math&amp;gt;. Jednak w przypadku gdy kolejne próbki szumu są skorelowane (np. występuje silna aktywność rytmiczna alfa) sytuacja się komplikuje. Intuicyjnie łatwo możemy to sobie wyobrazić w granicznym przypadku. Załóżmy, że tło dla  potencjałów o stałej morfologii   stanowi sinusoida. Jeśli będziemy podawać bodźce w odstępach będących wielokrotnością okresu tej sinusoidy to w uśrednianych fragmentach sygnału owa sinusoida jest tak samo powtarzalna jak badany potencjał i uśrednianie nie prowadzi do poprawy stosunku amplitudy sygnału do amplitudy tła. &lt;br /&gt;
&lt;br /&gt;
Stopień zależności pomiędzy próbkami można zmierzyć przy pomocy funkcji autokorelacji. &lt;br /&gt;
Jeśli funkcję autokorelacji przybliżymy przez:&lt;br /&gt;
: &amp;lt;math&amp;gt;R_{xx}(\tau) = \sigma^2 \exp(-\beta |\tau|) \cos(2 \pi f_0 \tau)&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\sigma^2&amp;lt;/math&amp;gt; jest wariancją szumu, &amp;lt;math&amp;gt;f_0&amp;lt;/math&amp;gt; jest średnią częstością aktywności rytmicznej, &amp;lt;math&amp;gt;\beta/ \pi&amp;lt;/math&amp;gt; jest szerokością pasma tej czynności, zaś &amp;lt;math&amp;gt;\tau&amp;lt;/math&amp;gt; opóźnieniem, to wariancję potencjału wywołanego można wyrazić jako&amp;lt;!-- \cite{Spekreijse_1976}--&amp;gt;:&lt;br /&gt;
: &amp;lt;math&amp;gt;\sigma^2_{\bar x(t)} = \frac{\sigma^2}{N} \left[ \frac{1-\exp(-2 \beta T)}{1 - 2 \exp(- \beta T) \cos(2 \pi f_0 T) +\exp(-2 \beta T)} \right]&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; jest odstępem między bodźcami. &lt;br /&gt;
Widać stąd, że obecność czynności rytmicznej w tle wpływa na stosunek sygnału do szumu. Z powyższego równania widać, że stosunek wariancji dąży do &amp;lt;math&amp;gt;\frac{\sigma^2}{N}&amp;lt;/math&amp;gt; gdy &amp;lt;math&amp;gt;\beta T&amp;lt;/math&amp;gt; staje się duże.  &lt;br /&gt;
&lt;br /&gt;
Periodyczna stymulacja może ponadto prowadzić do wzbudzenia czynności rytmicznej o częstości równej częstości pobudzania bądź jej harmonicznej.&lt;br /&gt;
&lt;br /&gt;
===Wariancja latencji===&lt;br /&gt;
&lt;br /&gt;
Jedną z form zmienności potencjału wywołanego w pojedynczych realizacjach jest wariancja latencji. &lt;br /&gt;
[[Grafika:Wariancja_latencji.png|thumb|500px|right|&lt;br /&gt;
Czerwona linia: Uśrednianie 100 potencjałów wywołanych o latncjach z rozkładu normalnego N(300,30 ), Niebieskie linie: przykładowe pojedyncze realizacje wzięte do średniej]]&amp;lt;!--# -*- coding: utf-8 -*-&lt;br /&gt;
from __future__ import division&lt;br /&gt;
import numpy as np&lt;br /&gt;
from matplotlib.pyplot import plot, show ,subplot, figure, title, xlabel, ylabel, ylim&lt;br /&gt;
 &lt;br /&gt;
def fun(t,lat=100):&lt;br /&gt;
    return np.exp(-(t-lat)**2/(2*30**2))&lt;br /&gt;
Fs = 1&lt;br /&gt;
N = 100&lt;br /&gt;
t = np.arange(0,700)&lt;br /&gt;
f = np.zeros((N,700))&lt;br /&gt;
f_sr = np.zeros(t.shape)&lt;br /&gt;
for i in range(N):&lt;br /&gt;
    f[i,:] = fun(t,lat = 300 + 30* np.random.randn())&lt;br /&gt;
for i in range(3):&lt;br /&gt;
    plot(t,f[i,:], 'b')&lt;br /&gt;
plot(t,f.mean(0),'r')&lt;br /&gt;
show()--&amp;gt;&lt;br /&gt;
Zmienność latencji prowadzi do:&lt;br /&gt;
* zmniejszenia amplitudy &amp;lt;math&amp;gt;\bar x&amp;lt;/math&amp;gt;&lt;br /&gt;
* wzrostu rozciągłości czasowej załamka&lt;br /&gt;
&lt;br /&gt;
O tych konsekwencjach zmienności latencji należy w szczególności pamiętać porównując średnie potencjały uzyskane w różnych warunkach eksperymentalnych. Gdy zauważymy, że średnie potencjały różnią się amplitudą należy rozważyć możliwość, że w istocie warunki eksperymentalne wpływają na różnice w wariancji latencji. &lt;br /&gt;
&lt;br /&gt;
Naturalne jest, że zmienność latencji jest bardziej widoczna w przypadku załamków trwających krótko niż w przypadku załamków trwających długo. Wariancja latencji rożnie wraz z jej wartością, stąd wśród późnych składowych potencjałów wywołanych nie obserwuje się komponentów krótkotrwałych.&lt;br /&gt;
&amp;lt;!--====Uśrednianie metodą Woody'ego ====&lt;br /&gt;
&lt;br /&gt;
Model potencjału ze zmienną latencją i sposób na jego efektywniejsze uśrednianie zaproponował Woody (1967). Model ten zakłada, że w każdej realizacji występuje komponent addytywny &amp;lt;math&amp;gt;s_i(t)\;&amp;lt;/math&amp;gt;, który co do kształtu jest stały, a pomiędzy realizacjami różni się tylko latencją:&lt;br /&gt;
: &amp;lt;math&amp;gt; s_i(t) = s(t +\Delta t_i)\;&amp;lt;/math&amp;gt;&lt;br /&gt;
Woody zaproponował aby &amp;lt;math&amp;gt;\Delta t_i\;&amp;lt;/math&amp;gt; szacować na podstawie maksimum funkcji korelacji wzajemnej pomiędzy ''i''-tą realizacją a wzorcem. W pierwszym kroku wzorcem jest średni potencjał uzyskany przez proste uśrednienie realizacji.  Następnie w sposób iteracyjny dokonuje się:&lt;br /&gt;
* poprawek w wyrównaniu poszczególnych realizacji,&lt;br /&gt;
* obliczenia nowego wzorca poprzez uśrednienie realizacji po korekcie wyrównania,&lt;br /&gt;
* obliczenia nowych poprawek do wyrównania realizacji.--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Habituacja ===&lt;br /&gt;
Zmienność w odpowiedziach na kolejno występujące po sobie bodźce można podzielić na komponent stochastyczny i deterministyczny. Komponent deterministyczny odzwierciedla zmianę czułości  układu nerwowego  na kolejne bodźce. Nowy bodziec często wywołuje reakcje pobudzenia widoczną w wielu parametrach takich jak przewodnictwo skóry, rytm serca i reaktywność kory mózgowej. Powszechnie obserwowanym zjawiskiem jest spadek reaktywności na powtarzające się bodźce zwany habituacją. Niekiedy obserwuje się także zjawisko przeciwne &amp;amp;mdash; wzrost reaktywności na bodziec &amp;amp;mdash; zwane sensytyzacją. &lt;br /&gt;
&lt;br /&gt;
Klasycznym sposobem na badanie tych zjawisk w potencjałach wywołanych jest uśrednianie w podzbiorach lub  uśrednianie blokowe. Wymaga ono  zmiany paradygmatu rejestracji danych. Załóżmy, że interesującym nas bodźcem jest błysk światła. Chcemy zaobserwować ewentualne zmiany amplitudy i latencji w ciągu 100 potencjałów będących reakcją na błysk powtarzający się co 500 ms.&lt;br /&gt;
====Uśrednianie w podzbiorach ====&lt;br /&gt;
W metodzie tej musimy założyć, że proces habituacji jest powolny, tzn. zmiany pomiędzy kolejnymi reakcjami są bardzo małe. W takim przypadku możemy podzielić długą serię bodźców na ciąg pod-serii i uśrednienie przeprowadzić dla każdej pod-serii osobno.&lt;br /&gt;
[[Plik:Usrednianie_podzbiory.svg‎|640px|thumb|center|Ilustracja uśredniania w podzbiorach]]&lt;br /&gt;
&lt;br /&gt;
====Uśrednianie blokowe====&lt;br /&gt;
W tym celu eksperyment wykonujemy w wielu seriach. Jedna seria składa się ze 100 błysków powtarzanych co 500 ms.  Po serii następuje przerwa trwająca np. 5 s (długość przerwy wyraża nasze oszacowanie czasu potrzebnego na zanik habituacji). Po przerwie seria jest powtarzana. Powtórzeń serii wykonujemy ''N''.&lt;br /&gt;
Następnie uśredniamy fragmenty sygnałów odpowiadające sobie w kolejnych seriach. &lt;br /&gt;
&lt;br /&gt;
W tym paradygmacie zakładamy, że każda seria rejestrowana jest w tych samych warunkach. Zaniedbujemy efekty związane ze zmęczeniem i zmianami w np. stopniu koncentracji badanego.&lt;br /&gt;
[[Plik:Usrednianie blokowe.svg|Usrednianie blokowe.svg|640px|thumb|center|Ilustracja uśredniania w blokach]]&lt;br /&gt;
&lt;br /&gt;
===Załamki w krzywej potencjału wywołanego vs ukryte komponenty===&lt;br /&gt;
Komponenta potencjału wywołanego to bardzo ważne ale jednocześnie źle określone pojęcie. Krzywa otrzymana w wyniku uśredniania potencjałów wywołanych przedstawia serię załamków dodatnich i ujemnych, ale trzeba być świadomym, że ten przebieg napięcia rejestrowany przez elektrody przedstawia tak naprawdę sumę potencjałów pochodzących od wielu dość niezależnie działających źródeł w mózgu. Przyczynek pochodzący od jednego funkcjonalnego źródła będziemy określać jako komponentę. &lt;br /&gt;
&lt;br /&gt;
Komentarza wymaga też pojęcie źródła funkcjonalnego. Czynność elektryczną synchronicznie działających neuronów piramidalnych w określonym fragmencie kory mózgowej z pewnej odległości można przybliżyć potencjałem dipola prądowego. Taki aktywny fragment kory stanowi źródło dające przyczynek do mierzonego na powierzchni głowy potencjału. W najprostszej sytuacji taki przyczynek może być obserwowany jako komponenta. Mózg jest jednak obiektem niezwykle złożonym i gęsto połączonym. Wiele obszarów korowych może być funkcjonalnie połączonych i aktywowanych synchronicznie w celu realizacji określonego zadania &amp;amp;mdash; o takim funkcjonalnym zespole też możemy myśleć jako o pojedynczym źródle, choć może ono mieć złożoną strukturę przestrzenną. Często zatem myślimy o komponentach ukrytych potencjału wywołanego jako o aktywności takich funkcjonalnych zespołów. &lt;br /&gt;
&lt;br /&gt;
Po tym wstępie widać już chyba, że do zrozumienia co dzieje się w czasie reakcji na bodziec, którą obserwujemy w potencjale wywołanym, bardziej pożądane byłoby badanie komponent ukrytych niż poszczególnych załamków krzywej potencjału wywołanego, która stanowi ważoną sumę owych komponentów. Zanim przejdziemy do omówienia technik służących &amp;amp;bdquo;wyłuskiwaniu&amp;amp;rdquo; komponent prześledźmy kilka symulacji i wnioski z nich płynące.&lt;br /&gt;
&lt;br /&gt;
==== Załamki i komponenty nie są tym samym.====&lt;br /&gt;
Tę samą krzywą można otrzymać na nieskończenie wiele sposobów  przez sumowanie rożnych kombinacji domniemanych komponentów. Przykładowy rysunek pokazuje, jak tę samą krzywą można złożyć z dwóch rożnych zestawów komponentów (kod wytwarzający przykładową symulację pokazany jest poniżej).&lt;br /&gt;
[[Plik:Sumowanie_komponentow1.png|center|thumb|600px| Panel a) przedstawia hipotetyczną krzywą ERP, panel b) jedna z możliwych dekompozycji sygnału w panelu a), panel c) inna możliwa dekompozycja sygnału z panelu a) ]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
from __future__ import division&lt;br /&gt;
import numpy as np&lt;br /&gt;
from matplotlib.pyplot import plot, show ,subplot, figure, title, xlabel, ylabel, ylim&lt;br /&gt;
&lt;br /&gt;
Fs = 1&lt;br /&gt;
t = np.arange(0,700)&lt;br /&gt;
&lt;br /&gt;
C1 = np.exp(-(t-100)**2/(2*30**2))&lt;br /&gt;
C2 = np.exp(-(t-200)**2/(2*50**2))&lt;br /&gt;
C3 = np.exp(-(t-350)**2/(2*100**2))&lt;br /&gt;
ERP = 0.5*C1-C2+C3&lt;br /&gt;
&lt;br /&gt;
C2p = np.concatenate((C2[0:200], np.ones(30), C2[200:700-30] ))&lt;br /&gt;
C3p = ERP - 0.5*C1 + C2p&lt;br /&gt;
ERP_v2 = 0.5*C1-C2p+C3p&lt;br /&gt;
&lt;br /&gt;
subplot(3,1,1)&lt;br /&gt;
plot(t,ERP, t[::10],ERP_v2[::10],'g.')&lt;br /&gt;
ylabel('a)',rotation='horizontal')&lt;br /&gt;
ylim([-1, 1.5])&lt;br /&gt;
&lt;br /&gt;
subplot(3,1,2)&lt;br /&gt;
plot(t,0.5*C1,t,-C2,t,C3)&lt;br /&gt;
ylabel('b)',rotation='horizontal')&lt;br /&gt;
ylim([-1, 1.5])&lt;br /&gt;
&lt;br /&gt;
subplot(3,1,3)&lt;br /&gt;
plot(t,0.5*C1,t,-C2p,t,C3p)&lt;br /&gt;
ylabel('c)',rotation='horizontal')&lt;br /&gt;
ylim([-1, 1.5])&lt;br /&gt;
&lt;br /&gt;
show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Zmiana jednej komponenty może powodować zmiany w amplitudzie i latencji więcej niż jednego załamka.====&lt;br /&gt;
Poniższy rysunek przedstawia sytuację gdy zmiana amplitudy jednego komponentu może znacząco wpływać na amplitudę i latencję innych załamków.&lt;br /&gt;
&lt;br /&gt;
[[Plik:Sumowanie_komponentow2.png|center|thumb|768px| Panel a) przedstawia dwie hipotetyczne krzywe ERP, panel b) panel b i c komponenty z których powstały owe krzywe. Zmiana amplitudy komponentu oznaczonego kolorem powoduje zmianę amplitudy oznaczonych załamków ale także zmianę latencji wcześniejszego załamka. ]]&lt;br /&gt;
Poniżej kod odtwarzający powyższy przykład:&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
from __future__ import division&lt;br /&gt;
import numpy as np&lt;br /&gt;
from matplotlib.pyplot import plot, show, subplot, figure, title, xlabel, ylabel, ylim&lt;br /&gt;
&lt;br /&gt;
Fs = 1&lt;br /&gt;
t = np.arange(0,700)&lt;br /&gt;
&lt;br /&gt;
C1 = np.exp(-(t-100)**2/(2*30**2))&lt;br /&gt;
C2 = np.exp(-(t-200)**2/(2*50**2))&lt;br /&gt;
C3 = np.exp(-(t-350)**2/(2*100**2))&lt;br /&gt;
ERP1 = 0.5*C1-C2+C3&lt;br /&gt;
ERP2 = 0.5*C1-C2+1.5*C3&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
subplot(3,1,1)&lt;br /&gt;
plot(t,ERP1,'b', t,ERP2,'g')&lt;br /&gt;
plot(t[np.argmin(ERP1)],np.min(ERP1),'r.' )&lt;br /&gt;
plot(t[np.argmax(ERP1)],np.max(ERP1),'m.' )&lt;br /&gt;
plot(t[np.argmin(ERP2)],np.min(ERP2),'r.' )&lt;br /&gt;
plot(t[np.argmax(ERP2)],np.max(ERP2),'m.' )&lt;br /&gt;
&lt;br /&gt;
ylabel('a)',rotation='horizontal')&lt;br /&gt;
ylim([-1, 1.6])&lt;br /&gt;
&lt;br /&gt;
subplot(3,1,2)&lt;br /&gt;
plot(t,0.5*C1,'k',t,-C2,'k',t,C3,'b')&lt;br /&gt;
ylabel('b)',rotation='horizontal')&lt;br /&gt;
ylim([-1, 1.6])&lt;br /&gt;
&lt;br /&gt;
subplot(3,1,3)&lt;br /&gt;
plot(t,0.5*C1,'k',t,-C2,'k',t,1.5*C3,'g')&lt;br /&gt;
ylabel('c)',rotation='horizontal')&lt;br /&gt;
ylim([-1, 1.6])&lt;br /&gt;
&lt;br /&gt;
show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Instrukcje do ćwiczeń =&lt;br /&gt;
&lt;br /&gt;
==Zadanie 1: uśrednianie symulowanych sygnałów==&lt;br /&gt;
w tym ćwiczeniu chcemy pokazać efekty:&lt;br /&gt;
# uśredniania sygnałów związanych fazowo z bodźcem i nieskorelowanych z bodźcem / wpływ liczby realizacji,&lt;br /&gt;
# uśredniania sygnałów z fluktuacją latencji,&lt;br /&gt;
# wpływ filtrów o różnych funkcjach odpowiedzi impulsowej na morfologię uśrednionego potencjału.&lt;br /&gt;
&lt;br /&gt;
===Sygnały testowe===&lt;br /&gt;
Proszę zaimplementować funkcje generujące następujące przebiegi czasowe (oznaczenia: ''F&amp;lt;sub&amp;gt;s&amp;lt;/sub&amp;gt;'' &amp;amp;mdash; częstość próbkowania, ''T'' &amp;amp;mdash; czas trwania w sekundach, [[%C4%86wiczenia_1#Sygna.C5.82y_testowe|analogicznie do tego]]):&lt;br /&gt;
* sinusoida o zadanej częstości ''f'' i fazie &amp;lt;math&amp;gt;\phi&amp;lt;/math&amp;gt;: &amp;lt;tt&amp;gt;y = sin(f, phi, Fs, T)&amp;lt;/tt&amp;gt;,&lt;br /&gt;
* funkcja Gaussa o zadanym położeniu i szerokości &amp;lt;tt&amp;gt;y = g_1(t0, sigma, Fs, T) &amp;lt;/tt&amp;gt;&lt;br /&gt;
: &amp;lt;math&amp;gt;g_1(t) = \exp\left(-\frac{(t-t_0)^2}{2 \sigma^2}\right)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* pochodną funkcji Gaussa o zadanym położeniu i szerokości &amp;lt;tt&amp;gt;y = g_2(t0, sigma, Fs, T)&amp;lt;/tt&amp;gt;,&lt;br /&gt;
* połowę funkcji Gaussa o zadanym położeniu i szerokości &amp;lt;tt&amp;gt;y = g_3(t0, sigma, Fs, T)&amp;lt;/tt&amp;gt;,&lt;br /&gt;
: &amp;lt;math&amp;gt;g_{3}(t) = \left\{ &lt;br /&gt;
\begin{array}{lll}&lt;br /&gt;
0 &amp;amp; \mathrm{dla}&amp;amp; t&amp;lt;t_0 \\&lt;br /&gt;
\exp\left(-\frac{(t-t_0)^2}{2 \sigma^2}\right)&amp;amp; \mathrm{dla}&amp;amp; t \ge t_0  &lt;br /&gt;
\end{array}&lt;br /&gt;
\right. &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
W dalszych zadaniach tej sekcji przyjmiemy:&lt;br /&gt;
* ''T'' = 1 s,&lt;br /&gt;
* ''F&amp;lt;sub&amp;gt;s&amp;lt;/sub&amp;gt;'' = 128 Hz,&lt;br /&gt;
* ''t''&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; = 0,3 s,&lt;br /&gt;
* &amp;amp;sigma; = 0,02 s.&lt;br /&gt;
&lt;br /&gt;
===Uśrednianie w modelu addytywnym: sygnał + szum===&lt;br /&gt;
Dla funkcji &amp;lt;math&amp;gt;g_1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;g_2&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;g_3&amp;lt;/math&amp;gt;  wykonaj ''N'' symulacji sygnału opisanego daną funkcją z dodanym szumem gaussowskim (&amp;lt;tt&amp;gt;numpy.random.randn&amp;lt;/tt&amp;gt;). Zaobserwuj zmianę wariancji uśrednianego sygnału wraz z ''N''.&lt;br /&gt;
&lt;br /&gt;
===Uśrednianie w modelu addytywnym: sygnał + szum + niezależna czynność rytmiczna===&lt;br /&gt;
Powtórz poprzednie symulacje dokładając w każdej realizacji sinusoidę o losowo wybranej fazie. Symulacje wykonaj dla różnych częstości sinusoidy, takich których połówka okresu zbliżona jest do szerokości funkcji Gaussa, oraz znacząco od niej różnych.&lt;br /&gt;
&lt;br /&gt;
===Uśrednianie w modelu z resetem fazy===&lt;br /&gt;
Zbuduj sygnał składający się z dwóch fragmentów sinusoidy o częstości ''f'': &lt;br /&gt;
* pierwszy fragment ma losową fazę,&lt;br /&gt;
* drugi fragment ma fazę równą 0.&lt;br /&gt;
Wykonaj ''N'' realizacji takiego sygnału, przy czym każda realizacja ma częstość losowaną z rozkładu Gaussa o średniej 10 i pewnej wariancji (czyli &amp;lt;math&amp;gt;f \in \mathrm{N}(10,\sigma)&amp;lt;/math&amp;gt;). &lt;br /&gt;
Uśrednij otrzymane realizacje. Zaobserwuj zależność średniej od liczby uśrednianych realizacji i od wariancji częstości.&lt;br /&gt;
&lt;br /&gt;
===Uśrednianie potencjału z fluktuacją latencji===&lt;br /&gt;
Wygeneruj sygnały składające się z funkcji &amp;lt;math&amp;gt;g_1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;g_2&amp;lt;/math&amp;gt; albo &amp;lt;math&amp;gt;g_3&amp;lt;/math&amp;gt; z fluktuującą latencją, tzn. z wartością &amp;lt;math&amp;gt;t_0&amp;lt;/math&amp;gt; pochodzącą z jakiegoś rozkładu prawdopodobieństwa. U nas dla ustalenia uwagi niech będzie to rozkład Gaussa. Wykonaj zestaw symulacji obrazujący zależność od liczby realizacji i od wielkości fluktuacji, mierzonej przez wariancję rozkładu. Czy jest związek pomiędzy wariancją fluktuacji &amp;lt;math&amp;gt;t_0&amp;lt;/math&amp;gt; a szerokością załamków?&lt;br /&gt;
&lt;br /&gt;
===Wpływ filtrów===&lt;br /&gt;
# Zaprojektuj następujące filtry (przyjmij częstość próbkowania 128 Hz):&lt;br /&gt;
#* dolnoprzepustowy: Butterwortha z częstością odcięcia: 30, 40, 50 Hz, i rzędach od 1 do 5 (funkcja butter w module scipy.signal),&lt;br /&gt;
#* górnoprzepustowy: Butterwortha z częstością odcięcia: 0,1, 0,5, 2 i 5 Hz, i rzędach od 1 do 5,&lt;br /&gt;
#* notch: Czybyszewa II rodzaju z pasmem zaporowym ustawionym na 50 Hz, i rzędach od 1 do 3 (funkcja cheby2),&lt;br /&gt;
# Zbadaj funkcję odpowiedzi impulsowej i funkcję przenoszenia tych filtrów (w skali dB). Zaobserwuj jak długa jest odpowiedź impulsowa i jak daleko od częstości odcięcia zaburzone jest pasmo przenoszenia.&lt;br /&gt;
# Zastosuj powyższe filtry do funkcji &amp;lt;math&amp;gt;g_1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;g_2&amp;lt;/math&amp;gt; albo &amp;lt;math&amp;gt;g_3&amp;lt;/math&amp;gt;. Filtrowanie przeprowadź w jedną (lfilter) oraz w dwie strony (filtfilt). Zaobserwuj związek między zniekształceniem wprowadzanym przez filtr a funkcją odpowiedzi impulsowej filtru.&lt;br /&gt;
# W ćwiczeniu tym posłuż się symulowanymi sygnałami uzyskanymi z modelu addytywnego: &amp;amp;bdquo;sygnał+szum&amp;amp;rdquo;. Dla funkcji &amp;lt;math&amp;gt;g_1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;g_2&amp;lt;/math&amp;gt; albo &amp;lt;math&amp;gt;g_3&amp;lt;/math&amp;gt;  wykonaj ''N'' = 60 realizacji sygnału opisanego daną funkcją z dodanym szumem gaussowskim (&amp;lt;tt&amp;gt;numpy.random.randn&amp;lt;/tt&amp;gt;). Każdą z realizacji przefiltruj, a następnie uśrednij uzyskane sygnały.&lt;br /&gt;
&lt;br /&gt;
==Zadanie 2: rejestracje i analiza potencjałów wzrokowych==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- ===Synchronizacja występowania bodźców z sygnałem EEG===&lt;br /&gt;
&lt;br /&gt;
Rejestracja potencjałów wywołanych jest przykładem pomiaru czynności elektrycznej mózgu w odpowiedzi na określony bodziec. W przypadku tego rodzaju pomiarów konieczna jest synchronizacja momentu wystąpienia bodźca z sygnałem EEG. Wzmacniacze do pomiaru czynności elektrycznej mózgu wyposażone są w specjalne wejścia, na które można podawać sygnał odpowiadający pojawianiu się bodźca. Jak pamiętamy z zeszłego semestru, wejście to (jak i podawany na nie sygnał) nazywamy trigerem (ang. ''trigger'' &amp;amp;mdash; spust, cyngiel, wyzwalacz). W najprostszym przypadku, bodziec moglibyśmy wyświetlać na monitorze komputerowym, a sygnał związany z jego wystąpieniem wysyłać przez któryś z portów komputera (LPT, COM) na wzmacniacz EEG. Niestety, obecnie dostępne i popularne systemy operacyjne, takie jak Windows czy Linux nie są systemami czasu rzeczywistego (http://pl.wikipedia.org/wiki/System_operacyjny_czasu_rzeczywistego). Od momentu wyświetlania bodźca na ekranie, do pojawiania się sygnału odpowiednim porcie komputerowym może upłynąć kilkadziesiąt milisekund i co gorsza czas ten zwykle jest losowy. W przypadku gdy wzmacniacz próbkuje sygnał z częstością 1000 Hz, moment wystąpienia bodźca możemy określić z dokładnością 1 ms, jednakże wspomniane opóźnienia w systemie operacyjnym uniemożliwiają to. Ponadto, jak dowiedzieliśmy się w rozdziale wstępnym [http://brain.fuw.edu.pl/edu-wiki/action/edit/EEG:Potencja%C5%82y_wywo%C5%82ane?section=T-1], pierwsze załamki związane z potencjałami wywołanymi pojawiają się już 10 ms po wystąpieniu bodźca. W związku z tym, losowe, rzędu kilkudziesięciu milisekund opóźnienia sygnału określającego moment pojawienia się bodźca względem jego rzeczywistego wystąpienia są niedopuszczalne.&lt;br /&gt;
Istnieją pewne techniki programowania, dzięki którym opisywane opóźnienia można zmniejszyć, jednakże są one bardzo trudne  do realizacji. Ponadto, standardowe porty komputera, takie jak LPT, czy COM zostały zaprojektowane przede wszystkim do sterowania urządzeniami zewnętrznymi, a nie ich zasilania. Przykładowo, jedna linia portu drukarkowego (LPT) może być obciążona prądem nie większym niż 5 mA, podczas gdy do zapalenie zwykłej diody LED potrzeba około 10 mA. Taki pobór prądu możliwy jest do uzyskania z portu USB, jednakże  jest on  wyjątkowo trudny do oprogramowania.  &lt;br /&gt;
W celu ominięcia powyższych niedogodności w Zakładzie Fizyki Biomedycznej UW w przeprowadzanych eksperymentach wykorzystywane są  mikrokontrolery [http://pl.wikipedia.org/wiki/Mikrokontroler], w szczególności ATmega16 i ATmega32.  Mikrokontrolery te wyposażone są w procesory o architekturze RISC [http://pl.wikipedia.org/wiki/RISC] i mocy obliczeniowej porównywalnej z szeroko stosowanym kiedyś w komputerach ZX Spectrum, Commodore, Amiga i Atari procesorem Z80. Oprócz jednostki centralnej mikrokontrolery zawierają   stałą pamięć FLASH przeznaczoną do przechowywania kodu programu, pamięć  RAM i pamięć EEPROM, liczniki 8- i 16-bitowe, komparatory, przetworniki analogowo-cyfrowe, porty wejścia/wyjścia, łącze RS232 (popularnie nazywane portem szeregowym) i układy przerwań.&lt;br /&gt;
&lt;br /&gt;
Mikrokontrolery wchodzące w skład zestawów pomiarowych na Pracowni EEG zawierają program, który umożliwia komunikację z nimi poprzez port szeregowy. Obecnie, komputery są coraz rzadziej wyposażane w porty szeregowe. Standard komunikacji RS-232, opracowany w 1962 roku  nadal jest jednak popularny i często wykorzystywany do komunikacji miedzy urządzeniami.  W celu połączenia komputera posiadającego tylko porty USB z mikrokontrolerem zastosowano przejściówkę USB/RS-232. &lt;br /&gt;
&lt;br /&gt;
Jak każde urządzenie w systemie Linuks, przejściówka USB/RS-232 widoczna jest jako plik, znajdujący się w katalogu &amp;lt;tt&amp;gt;/dev&amp;lt;/tt&amp;gt;. Nazwy plików obsługujących urządzenia szeregowe to &amp;lt;tt&amp;gt;ttyXY&amp;lt;/tt&amp;gt;, gdzie &amp;lt;tt&amp;gt;XY&amp;lt;/tt&amp;gt; to kolejny numer przydzielony do urządzenia szeregowego.&lt;br /&gt;
Do komunikacji komputera z mikroknotrolerem  w Zakładzie Fizyki Biomedycznej UW została napisana prosta biblioteka.  Jej użycie jest następujące:&lt;br /&gt;
* Po podłączeniu przejściówki USB/RS232 do komputera mikrokontrolera sprawdź jaki plik w katalogu &amp;lt;tt&amp;gt;/dev&amp;lt;/tt&amp;gt; został utworzony i przydzielony do urządzenia. &lt;br /&gt;
* Zaimportuj bibliotekę do komunikacji z mikrokontrolerem: &lt;br /&gt;
: &amp;lt;tt&amp;gt;import SerialPort as SP&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Otwórz plik powiązany z urządzeniem zewnętrznym:&lt;br /&gt;
: &amp;lt;tt&amp;gt;sp = SP.SerialPort(nazwa_pliku) &amp;lt;/tt&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
: &amp;lt;tt&amp;gt;sp.open()&amp;lt;/tt&amp;gt;&lt;br /&gt;
W naszym przypadku prawidłowa nazwa pliku to &amp;lt;tt&amp;gt;/dev/ttyUSB0&amp;lt;/tt&amp;gt;.&lt;br /&gt;
* Po włączeniu zasilania mikrokontrolera, diody podłączone do niego i wykorzystywane w eksperymencie z potencjałami wywołanymi będą zapalone. Następujące polecenie zgasi obydwie diody:&lt;br /&gt;
: &amp;lt;tt&amp;gt;sp.blinkP300([0, 0])&amp;lt;/tt&amp;gt;&lt;br /&gt;
* Wydanie poniższego polecenia spowoduje, iż mikrokontroler zapali podłączoną do niego diodę numer 1 na czas 100 ms, zaś diodę numer 2 na 200 ms. Jednocześnie, w momencie włączenia jak i wyłączenia diody, sygnał z mikrokontrolera zostanie wysłany na 5-stykowe wejście AUX mikrokontrolera:&lt;br /&gt;
: &amp;lt;tt&amp;gt;sp.blinkP300([100, 200])&amp;lt;/tt&amp;gt;&lt;br /&gt;
* Jeśli chcemy zapalić tylko diodę numer dwa, np. na czas 500 ms w programie podajemy następującą instrukcję:&lt;br /&gt;
: &amp;lt;tt&amp;gt;sp.blinkP300([0, 500])&amp;lt;/tt&amp;gt;&lt;br /&gt;
* Jeśli chcemy zakończyć komunikację z mikrokontrolerem piszemy:&lt;br /&gt;
: &amp;lt;tt&amp;gt;sp.close()&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Kod biblioteki do komunikacji z mikrokontrolerem:&amp;lt;br&amp;gt;&lt;br /&gt;
--&amp;gt;&amp;lt;!--  Kod w Pythonie 2&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# -*- coding: cp1250 -*-&lt;br /&gt;
import serial&lt;br /&gt;
import logging&lt;br /&gt;
import sys&lt;br /&gt;
import os&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def to_hex_word(a):&lt;br /&gt;
    '''encodes a decimal number hexadecimally on two bytes'''&lt;br /&gt;
    return chr(a%256) + chr(a/256)&lt;br /&gt;
&lt;br /&gt;
class SerialPort(object):&lt;br /&gt;
    def __init__(self, port_name):&lt;br /&gt;
        import serial&lt;br /&gt;
        try:&lt;br /&gt;
            self.port = serial.Serial(&lt;br /&gt;
                port=port_name,&lt;br /&gt;
                baudrate=9600,&lt;br /&gt;
                bytesize=serial.EIGHTBITS,&lt;br /&gt;
                parity=serial.PARITY_NONE,&lt;br /&gt;
                stopbits=serial.STOPBITS_ONE,&lt;br /&gt;
                xonxoff=False&lt;br /&gt;
                )&lt;br /&gt;
        except serial.SerialException as e:&lt;br /&gt;
            print(&amp;quot;Nieprawidłowa nazwa portu lub port zajęty.&amp;quot;)&lt;br /&gt;
            raise e&lt;br /&gt;
        self.close()&lt;br /&gt;
        &lt;br /&gt;
    def open(self):&lt;br /&gt;
        self.port.open()&lt;br /&gt;
&lt;br /&gt;
    def close(self):&lt;br /&gt;
        self.port.close()&lt;br /&gt;
&lt;br /&gt;
    def send(self, value):&lt;br /&gt;
        self.port.write(value)&lt;br /&gt;
                           &lt;br /&gt;
    def blinkSSVEP(self,d, p1, p2):&lt;br /&gt;
        '''&lt;br /&gt;
        d = list of frequencies;&lt;br /&gt;
        p1:p2 = ratio LED_on_time/LED_off_time&lt;br /&gt;
        if you want i-th LED to be OFF all the time send  d[i] = 0&lt;br /&gt;
        if you want i-th LED to be ON all the time send  d[i] = -1&lt;br /&gt;
        in these two cases p1 and p2 do not matter&lt;br /&gt;
        '''&lt;br /&gt;
        clock  = 62500&lt;br /&gt;
        factor = float(p1) / float(p1 + p2)&lt;br /&gt;
    &lt;br /&gt;
        str = chr(3) # 'SSVEP_RUN'&lt;br /&gt;
&lt;br /&gt;
        for i in range(len(d)):&lt;br /&gt;
            # i-th LED OFF&lt;br /&gt;
            if d[i] == 0:                       &lt;br /&gt;
                str += to_hex_word(0) + to_hex_word(255) &lt;br /&gt;
            # i-th LED ON&lt;br /&gt;
            elif d[i] == -1:&lt;br /&gt;
                str += to_hex_word(255) + to_hex_word(0)&lt;br /&gt;
                #str = 'S'&lt;br /&gt;
                # i-th LED blinks d[i] times per second&lt;br /&gt;
                # p1:p2 = on_time:off_time in one blink&lt;br /&gt;
            else:&lt;br /&gt;
                period = clock/d[i]&lt;br /&gt;
                bright = int((clock/d[i]) * factor)&lt;br /&gt;
                dark = period - bright&lt;br /&gt;
                str += to_hex_word(bright) + to_hex_word(dark)&lt;br /&gt;
&lt;br /&gt;
        self.send(str)&lt;br /&gt;
&lt;br /&gt;
    def blinkP300(self,d):&lt;br /&gt;
        clock  = 62500&lt;br /&gt;
        str = chr(4) # 'P300_RUN'&lt;br /&gt;
&lt;br /&gt;
        for i in range(len(d)):&lt;br /&gt;
            period = int(clock*d[i]/1000.0)&lt;br /&gt;
            str += to_hex_word(period)&lt;br /&gt;
            print(period)&lt;br /&gt;
&lt;br /&gt;
        self.send(str)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
--&amp;gt;&amp;lt;!-- Kod w Pythonie 3 --&amp;gt;&amp;lt;!-- &amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# -*- coding: cp1250 -*-&lt;br /&gt;
import serial&lt;br /&gt;
import logging&lt;br /&gt;
import sys&lt;br /&gt;
import os&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
def to_hex_word(a):&lt;br /&gt;
    '''encodes a decimal number hexadecimally on two bytes'''&lt;br /&gt;
    return a.to_bytes(2,byteorder=sys.byteorder)&lt;br /&gt;
 &lt;br /&gt;
class SerialPort(object):&lt;br /&gt;
    def __init__(self, port_name):&lt;br /&gt;
        import serial&lt;br /&gt;
        try:&lt;br /&gt;
            self.port = serial.Serial(&lt;br /&gt;
                port=port_name,&lt;br /&gt;
                baudrate=9600,&lt;br /&gt;
                bytesize=serial.EIGHTBITS,&lt;br /&gt;
                parity=serial.PARITY_NONE,&lt;br /&gt;
                stopbits=serial.STOPBITS_ONE,&lt;br /&gt;
                xonxoff=False&lt;br /&gt;
                )&lt;br /&gt;
        except serial.SerialException as e:&lt;br /&gt;
            print(&amp;quot;Nieprawidłowa nazwa portu lub port zajęty.&amp;quot;)&lt;br /&gt;
            raise e&lt;br /&gt;
        self.close()&lt;br /&gt;
 &lt;br /&gt;
    def open(self):&lt;br /&gt;
        self.port.open()&lt;br /&gt;
 &lt;br /&gt;
    def close(self):&lt;br /&gt;
        self.port.close()&lt;br /&gt;
 &lt;br /&gt;
    def send(self, value):&lt;br /&gt;
        self.port.write(value)&lt;br /&gt;
 &lt;br /&gt;
    def blinkSSVEP(self,d, p1, p2):&lt;br /&gt;
        '''&lt;br /&gt;
        d = list of frequencies;&lt;br /&gt;
        p1:p2 = ratio LED_on_time/LED_off_time&lt;br /&gt;
        if you want i-th LED to be OFF all the time send  d[i] = 0&lt;br /&gt;
        if you want i-th LED to be ON all the time send  d[i] = -1&lt;br /&gt;
        in these two cases p1 and p2 do not matter&lt;br /&gt;
        '''&lt;br /&gt;
        clock  = 62500&lt;br /&gt;
        factor = float(p1) / float(p1 + p2)&lt;br /&gt;
 &lt;br /&gt;
        str = (3).to_bytes(1,byteorder=sys.byteorder) # 'SSVEP_RUN'&lt;br /&gt;
 &lt;br /&gt;
        for i in range(len(d)):&lt;br /&gt;
            # i-th LED OFF&lt;br /&gt;
            if d[i] == 0:                       &lt;br /&gt;
                str += to_hex_word(0) + to_hex_word(255) &lt;br /&gt;
            # i-th LED ON&lt;br /&gt;
            elif d[i] == -1:&lt;br /&gt;
                str += to_hex_word(255) + to_hex_word(0)&lt;br /&gt;
                #str = 'S'&lt;br /&gt;
                # i-th LED blinks d[i] times per second&lt;br /&gt;
                # p1:p2 = on_time:off_time in one blink&lt;br /&gt;
            else:&lt;br /&gt;
                period = clock/d[i]&lt;br /&gt;
                bright = int((clock/d[i]) * factor)&lt;br /&gt;
                dark = int(period - bright)&lt;br /&gt;
                str += to_hex_word(bright) + to_hex_word(dark)&lt;br /&gt;
 &lt;br /&gt;
        self.send(str)&lt;br /&gt;
 &lt;br /&gt;
    def blinkP300(self,d):&lt;br /&gt;
        clock  = 62500&lt;br /&gt;
        str = (4).to_bytes(1,byteorder=sys.byteorder) # 'P300_RUN'&lt;br /&gt;
 &lt;br /&gt;
        for i in range(len(d)):&lt;br /&gt;
            period = int(clock*d[i]/1000.0)&lt;br /&gt;
            str += to_hex_word(period)&lt;br /&gt;
 &lt;br /&gt;
        self.send(str)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
--&amp;gt;&amp;lt;!--&lt;br /&gt;
&lt;br /&gt;
===Zestaw eksperymentalny===&lt;br /&gt;
Zestaw składa się ze:&lt;br /&gt;
* wzmacniacza,&lt;br /&gt;
* stymulatora   &lt;br /&gt;
--&amp;gt;&amp;lt;!--* izolowanego galwanicznie układu generującego impulsy odpowiadające gaszeniu i zapalaniu diody,  o wartościach dopasowanych do akceptowalnych przez wejścia AUX wzmacniacza,--&amp;gt;&lt;br /&gt;
* komputera: w tym eksperymencie komputer będzie służył do zaprogramowania stymulatora i do rejestracji sygnałów.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
===Eksperyment 1. Obserwacja bodźca wzrokowego  ===&lt;br /&gt;
&amp;lt;!--Proszę zapoznać się ze standardami rejestracji wzrokowych potencjałów wywołanych [http://www.gcu.ac.uk/media/gcalwebv2/theuniversity/academicschools/sls/psytimetables/SLS%20-%20VEP_Standard_2010.pdf] --&amp;gt;&lt;br /&gt;
Proszę zapoznać się z typowym wyglądem załamków w przypadku potencjałów wzrokowych, jaki jest przedstawiony na [https://link.springer.com/article/10.1007/s10633-009-9195-4/figures/2 rysunku] (cały artykuł jest dostępny [http://link.springer.com/article/10.1007%2Fs10633-009-9195-4 tu]).&lt;br /&gt;
&amp;lt;!--[[Plik:Fig 4 VEP.jpg|thumb|320px|right|&amp;lt;figure id=&amp;quot;fig:zalamki_VEP&amp;quot;&amp;gt;&amp;lt;/figure&amp;gt;&lt;br /&gt;
&amp;lt;xr id=&amp;quot;fig:zalamki_VEP&amp;quot;&amp;gt;Rys. %i.&amp;lt;/xr&amp;gt; Schemat załamków rozpoznawanych we wzrokowych potencjach wywołanych (z pracy: J. V. Odom i in. &amp;amp;bdquo;ISCEV standard for clinical visual evoked potentials&lt;br /&gt;
(2009 update)&amp;amp;rdquo;, Doc Ophthalmol (2010), 120:111–119).]]&lt;br /&gt;
--&amp;gt; &lt;br /&gt;
&lt;br /&gt;
==== Rejestracja ====&lt;br /&gt;
* Paradygmat: z odległości około 40 cm badany obserwuje wyświetalny na ekranie biały kwadrat. Bodźce trwają 300 ms i  powtarzają się co 0.5 sekundy. Bodziec poprzedza punkt fiksacji pokazywany przez 300 ms. Natężenie bodźca ma przyjąć jedną z 4 wartości (manipulujemy jego przeźroczystością: 1, 0.7, 0.3 i 0.1, gdzie 1 oznacza brak przeźroczystości). Każda z intensywności bodźca ma pojawić się 100 razy podczas badania, bodźce podawane mają być w sposób losowy. Zadanie poprzedza krótka instrukcja, kończy podziękowanie. &lt;br /&gt;
&lt;br /&gt;
* Pomiar&lt;br /&gt;
**Zakładamy czepek i elektrody w systemie 10-20, dbamy o to by opory pomiędzy elektrodami były poniżej 10 k&amp;amp;Omega; i różnice pomiędzy oporami różnych elektrod nie przekraczały 20%. [[Plik:Glowka10-20 ERPy.svg|thumb|600px|right]]&lt;br /&gt;
** Elektrodę GND mocujemy w otworze czepka odpowiadającym pozycji AFz (na linii centralnej 10% w stronę nosa od elektrody Fz) &lt;br /&gt;
** Montujemy także elektrody M1 i M2 i FCz.&lt;br /&gt;
&lt;br /&gt;
==== Analiza ====&lt;br /&gt;
# Filtrujemy sygnał w paśmie 1-20 Hz.&lt;br /&gt;
# Z ciągłego zapisu wycinamy fragmenty od &amp;amp;minus;300 ms do +800 ms (zero oznacza moment wystąpienia bodźca). W czasie wycinania badamy wycinane fragmenty pod względem zakresu amplitudy (wszystkie kanały powinny mieć amplitudę w granicach &amp;amp;plusmn;75 &amp;amp;mu;V) i zawartości artefaktów od mrugania (w tym celu trzeba oglądając sygnał w SVAROG-u ustalić próg na amplitudę sygnału w kanałach Fp1 i Fp2).&lt;br /&gt;
# Uśredniamy wycięte sygnały.&lt;br /&gt;
# Rysujemy średni potencjał we wszystkich kanałach.&lt;br /&gt;
# Pierwszy sposób: Identyfikujemy załamki P1 i N2. Mierzymy amplitudę P1 jako różnicę między ekstremalną wartością załamka N2 a ekstremalną wartością załamka N2. &lt;br /&gt;
# Drugi sposób: Identyfikujemy załamki P1 i N2. Mierzymy amplitudę P1 w stosunku do zera. &lt;br /&gt;
#porównujemy uzyskane amplitudy w 4 warunkach za pomocą odpowiedniego testu statystycznego (porównanie warunków ze skrajnymi wartościami amplitudy - zastosuj test permutacyjny (opisany poniżej) lub test t-Studenta/nieparametryczny odpowiednik). &lt;br /&gt;
&lt;br /&gt;
**Opis testu permutacyjnego &lt;br /&gt;
Pytanie: Czy intensywność bodźca wpływa na amplitudę potencjału P1?&lt;br /&gt;
Jak stwierdzić czy amplitudy załamków P1 istotnie różnią się pomiędzy seriami?&lt;br /&gt;
&lt;br /&gt;
Musimy przeprowadzić test statystyczny. Możemy skonstruować go np. tak:&lt;br /&gt;
Mamy dwa warunki I i II. Jako statystykę przyjmiemy różnicę pomiędzy amplitudą załamka zmierzoną w serii z dwoma diodami (P2&amp;lt;sub&amp;gt;II&amp;lt;/sub&amp;gt;) a amplitudą zmierzoną w serii z jedną diodą (P2&amp;lt;sub&amp;gt;I&amp;lt;/sub&amp;gt;):&lt;br /&gt;
: ''S'' = P2&amp;lt;sub&amp;gt;II&amp;lt;/sub&amp;gt; &amp;amp;minus; P2&amp;lt;sub&amp;gt;I&amp;lt;/sub&amp;gt;&lt;br /&gt;
Postawmy hipotezę zerową, że nie ma różnicy w amplitudzie pomiędzy warunkiem II a I oraz hipotezę alternatywną, że różnica taka występuje.&lt;br /&gt;
: H&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;: ''S'' = 0&lt;br /&gt;
: H&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;: ''S'' &amp;amp;ne; 0&lt;br /&gt;
Zgodnie z H&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; dla wartości ''S'' nie ma różnicy czy realizacja została zarejestrowana w warunkach I czy II, zatem można losowo poprzypisywać numery warunków do realizacji i w ten sposób uzyskać rozkład statystyki ''S'' pod warunkiem prawdziwości H&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;, czyli obliczyć średnie potencjały dla &amp;amp;bdquo;pomieszanych&amp;amp;rdquo; tagów, wyliczyć średnie potencjały dla sztucznie wygenerowaych grup, i wyliczyć różnicę amplitud dla tych średnich, czyli wartość statystyki dla hipotezy H&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Zaimplementuj test permutacyjny zgodny z powyższą koncepcją.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- ===Wersja 2: obserwacja habituacji / uśrednianie w blokach ===&lt;br /&gt;
==== Rejestracja ====&lt;br /&gt;
# Paradygmat: &lt;br /&gt;
#* z odległości około 40 cm badany obserwuje błyski diody. &lt;br /&gt;
#* Błyski powtarzają się co 0,5 sekundy. &lt;br /&gt;
#* Rejestrujemy 60 serii po 15 błysków.  &lt;br /&gt;
#* Pomiędzy seriami badany odpoczywa około 10 sekund.&lt;br /&gt;
# Zakładamy czepek i elektrody w systemie 10-20, dbamy o to by opory pomiędzy elektrodami były poniżej 5 k&amp;amp;Omega; i różnice pomiędzy oporami różnych elektrod nie przekraczały 20%.&lt;br /&gt;
#* Elektrodę GND mocujemy w otworze czepka odpowiadającym pozycji AFz (na linii centralnej 10% w stronę nosa od elektrody Fz) &lt;br /&gt;
#* Montujemy także elektrodę FCz (na linii centralnej pomiędzy Fz a Cz), będziemy jej używać w montażu i w czasie analizy jako referencji.&lt;br /&gt;
#* Częstość próbkowania 512 Hz.&lt;br /&gt;
&lt;br /&gt;
==== Analiza ====&lt;br /&gt;
# Filtrujemy sygnał w paśmie 0,1-20 Hz.&lt;br /&gt;
# Z ciągłego zapisu wycinamy fragmenty od &amp;amp;minus;300 ms do +600 ms (zero oznacza moment wystąpienia bodźca). W czasie wycinania badamy wycinane fragmenty pod względem zakresu amplitudy (wszystkie kanały powinny mieć amplitudę w granicach &amp;amp;plusmn;75 &amp;amp;mu;V) i zawartości artefaktów od mrugania (w tym celu trzeba oglądając sygnał w SVAROG-u ustalić próg na amplitudę sygnału w kanałach Fp1 i Fp2).&lt;br /&gt;
# Uśredniamy wycięte sygnały o tym samym numerze wewnątrz serii.&lt;br /&gt;
# Rysujemy serie 15 uśrednionych potencjałów dla tego kanału, który wykazywał najsilniejszy potencjał w pierwszej wersji eksperymentu. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Eksperyment 2: rejestracja i analiza potencjału P3 ===&lt;br /&gt;
====Rejestracja ====&lt;br /&gt;
# Paradygmat: &lt;br /&gt;
#* z odległości około 40 cm badany obserwuje kwadrat, który występuje w dwóch kolorach. &lt;br /&gt;
#* Bodźce trwają 300 ms, poprzedzane punktem fiksacji wyświetlanym na 300 ms, przerwa między próbami jest losowana i wynosi od 0.8-1.2 s.  &lt;br /&gt;
#* Proporcja wystapień bodźców koloru pierwszego i drugiego wynosi 1:5.   &lt;br /&gt;
#* Zadaniem badanego jest liczenie kwadratów w rzadkim kolorze. &lt;br /&gt;
#* Wykonujemy tyle realizacji aby zarejestrować 100 powtórzeń bodźców rzadkich. &lt;br /&gt;
# Zakładamy czepek i elektrody w systemie 10-20, dbamy o to by opory pomiędzy elektrodami były poniżej 5 k&amp;amp;Omega; i różnice pomiędzy oporami różnych elektrod nie przekraczały 20%.&lt;br /&gt;
#* Elektrodę GND mocujemy w otworze czepka odpowiadającym pozycji AFz (na linii centralnej 10% w stronę nosa od elektrody Fz) &lt;br /&gt;
#* Montujemy także elektrody M1 i M2, będziemy ich używać w montażu i w czasie analizy jako referencji typu połączone uszy.&lt;br /&gt;
#* Częstość próbkowania 512 Hz.&lt;br /&gt;
&lt;br /&gt;
==== Analiza ====&lt;br /&gt;
# Filtrujemy sygnał w paśmie 1-20 Hz.&lt;br /&gt;
# Z ciągłego zapisu wycinamy fragmenty od &amp;amp;minus;300 ms do +900 ms (zero oznacza moment wystąpienia bodźca). W czasie wycinania badamy wycinane fragmenty pod względem zakresu amplitudy (wszystkie kanały powinny mieć amplitudę w granicach &amp;amp;plusmn;75 &amp;amp;mu;V) i zawartości artefaktów od mrugania (w tym celu trzeba oglądając sygnał w SVAROG-u ustalić próg na amplitudę sygnału w kanałach Fp1 i Fp2).&lt;br /&gt;
# Uśredniamy osobno realizacje dla każdego koloru kwadratu. &lt;br /&gt;
# Nakładamy na siebie na rysunkach oba typy średnich.&lt;br /&gt;
# wyznaczamy amplitudę P3 i liczymy test statystyczny pomiędzy warunkami&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- ==Ćwiczenie dodatkowe: P300 BCI==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wykorzystujemy elektrody z systemu 10-10 umieszczone nad korą wzrokową: P07, O1, O2, PO8, PO3, PO4, Pz, Cz.&lt;br /&gt;
&lt;br /&gt;
Uruchamiamy &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
obci_gui --presets eeg_workshop&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
i z guzika &amp;amp;bdquo;select amplifier&amp;amp;rdquo; wybieramy właściwy wzmacniacz.&lt;br /&gt;
&lt;br /&gt;
Do kontroli jakości sygnału możemy uruchomić Svaroga.&lt;br /&gt;
&lt;br /&gt;
Dane z kalibracji zapisują się w pliku test1 w katalogu domowym użytkownika, z labiryntu w pliku test2.&lt;br /&gt;
&lt;br /&gt;
Po zakończeniu kalibracji pojawia się napis &amp;amp;bdquo;Trwają obliczenia&amp;amp;rdquo; lub podobny. Odczekujemy kilka minut, aż skończy się peer &amp;amp;bdquo;Calibration&amp;amp;rdquo; (widoczny w obci_gui) i zamykamy okienko klawiszami Alt-F4 lub zatrzymując scenariusz guzikiem &amp;amp;bdquo;Stop&amp;amp;rdquo;. W katalogu domowym pojawi się plik z wynikami kalibracji, co pozwala na uruchomienie scenariusza &amp;amp;bdquo;labirynt&amp;amp;rdquo;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Po zebraniu danych, przed wczytaniem ich do Svaroga należy w tym samym katalogu uruchomić skrypt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
#!/usr/bin/env python&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
&lt;br /&gt;
from obci.analysis.obci_signal_processing.tags import tags_file_writer&lt;br /&gt;
from obci.analysis.obci_signal_processing.read_manager import ReadManager&lt;br /&gt;
&lt;br /&gt;
def main(): &lt;br /&gt;
	file_name = 'test1'&lt;br /&gt;
	&lt;br /&gt;
	mgr = ReadManager(&lt;br /&gt;
		file_name + '.obci.xml',&lt;br /&gt;
		file_name + '.obci.raw',&lt;br /&gt;
		file_name + '.obci.tag')&lt;br /&gt;
	&lt;br /&gt;
	tags = mgr.get_tags()&lt;br /&gt;
	for i in xrange(0, len(tags)):&lt;br /&gt;
		if tags[i]['desc']['index'] == tags[i]['desc']['target']:&lt;br /&gt;
			tags[i]['name'] = 'blink_target'&lt;br /&gt;
		else:&lt;br /&gt;
			tags[i]['name'] = 'blink'&lt;br /&gt;
			&lt;br /&gt;
	tags_writer = tags_file_writer.TagsFileWriter(file_name + '.obci.tag')&lt;br /&gt;
	for tag in tags:&lt;br /&gt;
		tags_writer.tag_received(tag)		&lt;br /&gt;
	tags_writer.finish_saving(0)	&lt;br /&gt;
 &lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Aduszyk</name></author>
		
	</entry>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=Pracownia_EEG/Potencja%C5%82y_wywo%C5%82ane&amp;diff=8981</id>
		<title>Pracownia EEG/Potencjały wywołane</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=Pracownia_EEG/Potencja%C5%82y_wywo%C5%82ane&amp;diff=8981"/>
		<updated>2022-11-08T11:17:19Z</updated>

		<summary type="html">&lt;p&gt;Aduszyk: /* Zadanie 2: rejestracje i analiza potencjałów wzrokowych */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Pracownia EEG|Pracownia EEG]] / Potencjały wywołane&lt;br /&gt;
&lt;br /&gt;
=Wstęp=&lt;br /&gt;
==Potencjały wywołane==&lt;br /&gt;
=== Wstęp ===&lt;br /&gt;
Potencjały wywołane EEG (ang. ''evoked potentials'', EP) są śladami odpowiedzi mózgu na bodźce. W przypadku MEG poprawnie mówi się o polach wywołanych (ang. ''evoked fields'', EF).&lt;br /&gt;
Zwykle reakcja ta jest mała (wyjątek stanowią [[Elektroencefalografia/Metody_analizy_sygnałów_EEG_-_analiza_w_dziedzinie_czasu |kompleksy K]]) i w zapisie pojedynczej realizacji reakcji na bodziec najczęściej niewidoczna wśród czynności pochodzącej od wielu innych procesów zachodzących w tym samym czasie w mózgu. &lt;br /&gt;
Ich wyodrębnienie z tak zwanego tła EEG/MEG, czyli manifestacji elektrycznej innych, trwających w tym samym czasie w mózgu procesów (aktywny prąd niezależny), wymaga w dniu dzisiejszym zapisu odpowiedzi na szereg powtórzeń tego samego bodźca (&amp;lt;xr id=&amp;quot;fig:EP&amp;quot;&amp;gt;rys. %i&amp;lt;/xr&amp;gt;). Pierwsze potencjały wywołane pokazał pod koniec lat 40-tych Dawson (Dawson 1947) wykonując superpozycję pojedynczych realizacji na kliszy fotograficznej.&lt;br /&gt;
Z czasem skomplikowane urządzenia analogowe zastąpione zostały przez cyfrowe uśrednianie kolejnych fragmentów EEG, zsynchronizowanych według momentu wystąpienia bodźca, łatwo realizowane za pomocą komputera.&lt;br /&gt;
&lt;br /&gt;
[[Grafika:EP.png|thumb|640px|center|&amp;lt;figure id=&amp;quot;fig:EP&amp;quot;&amp;gt;&amp;lt;/figure&amp;gt;&lt;br /&gt;
Uśrednianie potencjałów wywołanych. a) ciągły zapis EEG z wyróżnionymi momentami wystąpienia bodźca (w tym przypadku słuchowego) b) kilkadziesiąt kolejnych odcinków, wyciętych jako sekunda EEG od momentu wystąpienia kolejnych bodźców, ustawione jeden pod drugim c) uśredniony potencjał wywołany &amp;amp;mdash; widać m. in. załamek P300 ok. 300 milisekund po bodźcu]]&lt;br /&gt;
&lt;br /&gt;
Techniki te opierają się na założeniu, że zawarta w EEG odpowiedź mózgu na każdy z kolejnych bodźców jest niezmienna, a EEG odzwierciedlające pozostałe procesy traktowane jest jak nieskorelowany z nią proces stochastyczny. Zależnie od rodzaju potencjałów wywołanych, założenia te są mniej lub bardziej nieuzasadnione; podważa je choćby powszechnie znany efekt habituacji, polegający na osłabieniu późnych potencjałów wywołanych kolejnymi powtórzeniami bodźca.&lt;br /&gt;
&lt;br /&gt;
Istota potencjałów wywołanych jest przedmiotem otwartej dyskusji i dziesiątków prac, dotykających od lat podstawowych w tej dziedzinie pytań: czym jest potencjał wywołany, który widzimy w uśrednionym przebiegu? Czy naprawdę wynika z deterministycznie powtarzanej, jednakowej odpowiedzi pojawiającej się po każdym powtórzeniu bodźca niezależnie od &amp;amp;bdquo;tła&amp;amp;rdquo;, czy może wynika z reorganizacji faz tego właśnie &amp;amp;bdquo;tła&amp;amp;rdquo; EEG, czy może kombinacji tych dwóch efektów? Jest to wspaniałe pole dla zastosowań zaawansowanych metod modelowania i analizy sygnałów. W ostatnich latach powstają dziesiątki prac na ten temat, a od czasu do czasu również krytyczne artykuły wykazujące, że dotychczasowe odkrycia są raczej artefaktami stosowanych metod a nie wynikają z własności analizowanych danych (Yeung et al., 2004). Jak widać jest tu wciąż bardzo wiele do zrobienia, gdyż zrozumienie tego mechanizmu stoi na drodze do &amp;amp;bdquo;świętego Graala&amp;amp;rdquo;, którym w tej dziedzinie jest wyodrębnienie pojedynczych potencjałów wywołanych.&lt;br /&gt;
&lt;br /&gt;
Niezależnie od tego, w neurofizjologii klinicznej nazwą potencjał wywołany określa się krzywą widoczną po uśrednieniu odpowiedzi na kilkanaście do kilku tysięcy bodźców (Szelenberger 2000). Gromadzona od dziesięcioleci wiedza o behawioralnych i klinicznych korelatach potencjałów wywołanych opiera się na rozpoznawaniu w przebiegach uśrednionych tak zwanych załamków, czyli przejściowych wzrostów lub spadków potencjału (na przykład na &amp;lt;xr id=&amp;quot;fig:EP&amp;quot;&amp;gt;rys. %i&amp;lt;/xr&amp;gt; widać załamek P300). Nazwy załamków składają się zwykle z litery &amp;amp;bdquo;P&amp;amp;rdquo; (od ang. ''positive''), jeśli wychylenie jest dodatnie, lub &amp;amp;bdquo;N&amp;amp;rdquo; (od ang. ''negative''), jeśli wychylenie jest ujemne, oraz liczby. Uwaga: &lt;br /&gt;
* Nie ma niestety jednej ustalonej konwencji prezentacji potencjałów koniecznie trzeba więc zwracać uwagę na orientację wykresu, a wykonując wykres samemu - zamieszczać informację o orientacji kierunku dodatniego,gdyż kierunek dodatni może być wykresie skierowany do góry lub do dołu. &lt;br /&gt;
* Liczba następująca po N lub P określa przybliżoną liczbę milisekund od wystąpienia bodźca, czyli tak zwaną latencję. Nie można jednak ścisłego związku między tą liczbą a liczbą milisekund np. potencjał P300 w zależności od szczegółów paradygmatu doświadczalnego może wystąpić znacznie później. np. w eksperymentach językowych zdarza się że P300 występuje później niż N400 :-).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;xr id=&amp;quot;fig:zalamki&amp;quot;&amp;gt;Rys. %i&amp;lt;/xr&amp;gt; przedstawia schematycznie najważniejsze załamki rozpoznawane w potencjałach słuchowych, czyli wywoływanych bodźcem dźwiękowym. Dla potencjałów wzrokowych i somatosensorycznych istnieją podobne klasyfikacje.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Grafika:Zalamki.png|thumb|320px|right|&amp;lt;figure id=&amp;quot;fig:zalamki&amp;quot;&amp;gt;&amp;lt;/figure&amp;gt;&lt;br /&gt;
Orientacyjny schemat załamków rozpoznawanych w słuchowych potencjach wywołanych, na podstawie (Szelenberger 2000). Skala czasu logarytmiczna. Najszybsze (do 12 ms) składowe egzogenne to potencjały pniowe (BAEP), oznaczane jako fale I-VII. Litery &amp;amp;bdquo;P&amp;amp;rdquo; i &amp;amp;bdquo;N&amp;amp;rdquo; oznaczają dodatnie i ujemne wychylenia związane z dalszymi załamkami]]&lt;br /&gt;
&lt;br /&gt;
Najszybsze (czyli o najmniejszej latencji) składowe to potencjały egzogenne, odzwierciedlające wstępne fazy przekazu informacji. W potencjałach słuchowych są to potencjały pnia (ang. ''brainstem auditory evoked potentials'', BAEP), składające się z siedmiu fal występujących pomiędzy 1 a 12 ms od bodźca. Są one generowane np. w nerwie słuchowym czy pniu mózgu, i wykorzystywane w klinicznej diagnostyce integralności dróg słuchowych. Podobnie jak inne wczesne potencjały o latencjach poniżej 100 ms, są praktycznie niezależne od stanu uwagi.&lt;br /&gt;
&lt;br /&gt;
Po potencjałach o średniej latencji (między 12 a 50 ms) zaczynają się późne potencjały słuchowe (od 100 ms od podania bodźca), odzwierciedlające bardziej złożone reakcje na bodziec. Potencjały ok. 100 ms obserwowane w okolicach sensorycznych odzwierciedlają odpowiedź tejże kory na bodziec. Ich amplituda zależy od parametrów fizycznych bodźca oraz od uwagi, np. amplituda załamka N100 wzrasta w stanie skupienia uwagi czy pobudzenia emocjonalnego. Pierwszy i najpopularniejszy całkowicie endogenny załamek to P300, pojawiający się po rozpoznaniu bodźca oczekiwanego, na którym skupiamy uwagę: na przykład, jeśli w serii pojawiających się losowo liter mamy zliczać wystąpienia jednej z nich, to na średniej odpowiedzi na pojawienie się tej litery pojawi się załamek P300. Załamek ten występuje również w odpowiedzi na bodźce wyczekiwane, niespodziewane i ważne dla osoby (np. własne imię). &lt;br /&gt;
&lt;br /&gt;
=== Uśrednianie w dziedzinie czasu ===&lt;br /&gt;
Jak już było wspomniane powyżej podstawową techniką stosowaną do analizy potencjałów wywołanych jest uśrednianie wielu realizacji odpowiedzi na bodziec wyrównanych względem jakiegoś charakterystycznego zdarzenia, np. momentu podania bodźca albo momentu behawioralnej reakcji na bodziec (np. wciśnięcie przycisku). Podejście to bazuje na trzech założeniach:&lt;br /&gt;
* Reakcja jest czasowo związana z bodźcem. Tzn. w kolejnych realizacjach występuje ona zawsze z tym samym opóźnieniem.&lt;br /&gt;
* Reakcja na bodziec skutkuje zawsze pojawieniem się w sygnale składowej o stałym kształcie (mówimy o stałej morfologii).&lt;br /&gt;
* Spontaniczna czynność EEG &amp;amp;mdash; ta która nie dotyczy przetwarzania interesującego nas bodźca &amp;amp;mdash; jest niezależnym, stacjonarnym szumem o średniej zero.&lt;br /&gt;
&lt;br /&gt;
Zgodnie z powyższymi założeniami mierzony w ''i''-tej realizacji sygnał można wyrazić jako:&lt;br /&gt;
: &amp;lt;math&amp;gt;x_i(t) = s(t) + n_i(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
Uśrednianie po ''N'' realizacjach daje:&lt;br /&gt;
: &amp;lt;math&amp;gt;\bar x (t) = \frac{1}{N} \sum_{i=1}^N x_i(t) = \frac{1}{N} \left(N s(t) + \sum_{i=1}^N n_i(t) \right) &amp;lt;/math&amp;gt;&lt;br /&gt;
Wartość oczekiwana średniego sygnału wynosi:&lt;br /&gt;
: &amp;lt;math&amp;gt;\mathrm{E}\left[ \bar x(t) \right] = s(t) &amp;lt;/math&amp;gt;&lt;br /&gt;
gdyż dla szumu o średniej zero mamy:&lt;br /&gt;
: &amp;lt;math&amp;gt;\mathrm{E}\left[\frac{1}{N} \sum_{i=1}^N n_i(t)\right] = 0&amp;lt;/math&amp;gt;.&lt;br /&gt;
Wariancja &amp;lt;math&amp;gt;\bar x(t)&amp;lt;/math&amp;gt; wynosi:&lt;br /&gt;
: &amp;lt;math&amp;gt;\sigma^2_{\bar x(t)} = \mathrm{E} \left[  \left( \frac{1}{N} \sum_{i=1}^N n_i(t)\right)^2 \right] \approx \frac{1}{N} \sigma^2_{n(t)}&amp;lt;/math&amp;gt;&lt;br /&gt;
gdyż &amp;lt;math&amp;gt;s(t)&amp;lt;/math&amp;gt; jest deterministyczne. &lt;br /&gt;
&lt;br /&gt;
Dla potencjałów pojawiających się w pierwszych kilkudziesięciu milisekundach po bodźcu model ten można uznać za poprawny, gdyż wykazują one zależność głównie od parametrów fizycznych bodźca. Dla późniejszych składowych staje się on coraz bardziej wątpliwy ze względu na występujące korelacje ze stanem (np. uwagi) badanego.&lt;br /&gt;
&lt;br /&gt;
Dla późniejszych składowych można by postulować bardziej ogólną wersję modelu potencjału wywołanego:&lt;br /&gt;
: &amp;lt;math&amp;gt;x_i(t) = s_i(t) + n_i(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
Ten model uwidacznia, że do opisu potencjału wywołanego potrzebna jest nie tylko średnia, ale i wyższe momenty rozkładu (np. drugi moment centralny czyli wariancja).&lt;br /&gt;
&lt;br /&gt;
====Wariancja w przypadku szumu skorelowanego ====&lt;br /&gt;
W poprzednim paragrafie pokazaliśmy, że w przypadku niezależnego szumu wariancja uśrednionego sygnału (w danej chwili czasu) maleje jak  &amp;lt;math&amp;gt;\frac{1}{N}&amp;lt;/math&amp;gt;. Jednak w przypadku gdy kolejne próbki szumu są skorelowane (np. występuje silna aktywność rytmiczna alfa) sytuacja się komplikuje. Intuicyjnie łatwo możemy to sobie wyobrazić w granicznym przypadku. Załóżmy, że tło dla  potencjałów o stałej morfologii   stanowi sinusoida. Jeśli będziemy podawać bodźce w odstępach będących wielokrotnością okresu tej sinusoidy to w uśrednianych fragmentach sygnału owa sinusoida jest tak samo powtarzalna jak badany potencjał i uśrednianie nie prowadzi do poprawy stosunku amplitudy sygnału do amplitudy tła. &lt;br /&gt;
&lt;br /&gt;
Stopień zależności pomiędzy próbkami można zmierzyć przy pomocy funkcji autokorelacji. &lt;br /&gt;
Jeśli funkcję autokorelacji przybliżymy przez:&lt;br /&gt;
: &amp;lt;math&amp;gt;R_{xx}(\tau) = \sigma^2 \exp(-\beta |\tau|) \cos(2 \pi f_0 \tau)&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\sigma^2&amp;lt;/math&amp;gt; jest wariancją szumu, &amp;lt;math&amp;gt;f_0&amp;lt;/math&amp;gt; jest średnią częstością aktywności rytmicznej, &amp;lt;math&amp;gt;\beta/ \pi&amp;lt;/math&amp;gt; jest szerokością pasma tej czynności, zaś &amp;lt;math&amp;gt;\tau&amp;lt;/math&amp;gt; opóźnieniem, to wariancję potencjału wywołanego można wyrazić jako&amp;lt;!-- \cite{Spekreijse_1976}--&amp;gt;:&lt;br /&gt;
: &amp;lt;math&amp;gt;\sigma^2_{\bar x(t)} = \frac{\sigma^2}{N} \left[ \frac{1-\exp(-2 \beta T)}{1 - 2 \exp(- \beta T) \cos(2 \pi f_0 T) +\exp(-2 \beta T)} \right]&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; jest odstępem między bodźcami. &lt;br /&gt;
Widać stąd, że obecność czynności rytmicznej w tle wpływa na stosunek sygnału do szumu. Z powyższego równania widać, że stosunek wariancji dąży do &amp;lt;math&amp;gt;\frac{\sigma^2}{N}&amp;lt;/math&amp;gt; gdy &amp;lt;math&amp;gt;\beta T&amp;lt;/math&amp;gt; staje się duże.  &lt;br /&gt;
&lt;br /&gt;
Periodyczna stymulacja może ponadto prowadzić do wzbudzenia czynności rytmicznej o częstości równej częstości pobudzania bądź jej harmonicznej.&lt;br /&gt;
&lt;br /&gt;
===Wariancja latencji===&lt;br /&gt;
&lt;br /&gt;
Jedną z form zmienności potencjału wywołanego w pojedynczych realizacjach jest wariancja latencji. &lt;br /&gt;
[[Grafika:Wariancja_latencji.png|thumb|500px|right|&lt;br /&gt;
Czerwona linia: Uśrednianie 100 potencjałów wywołanych o latncjach z rozkładu normalnego N(300,30 ), Niebieskie linie: przykładowe pojedyncze realizacje wzięte do średniej]]&amp;lt;!--# -*- coding: utf-8 -*-&lt;br /&gt;
from __future__ import division&lt;br /&gt;
import numpy as np&lt;br /&gt;
from matplotlib.pyplot import plot, show ,subplot, figure, title, xlabel, ylabel, ylim&lt;br /&gt;
 &lt;br /&gt;
def fun(t,lat=100):&lt;br /&gt;
    return np.exp(-(t-lat)**2/(2*30**2))&lt;br /&gt;
Fs = 1&lt;br /&gt;
N = 100&lt;br /&gt;
t = np.arange(0,700)&lt;br /&gt;
f = np.zeros((N,700))&lt;br /&gt;
f_sr = np.zeros(t.shape)&lt;br /&gt;
for i in range(N):&lt;br /&gt;
    f[i,:] = fun(t,lat = 300 + 30* np.random.randn())&lt;br /&gt;
for i in range(3):&lt;br /&gt;
    plot(t,f[i,:], 'b')&lt;br /&gt;
plot(t,f.mean(0),'r')&lt;br /&gt;
show()--&amp;gt;&lt;br /&gt;
Zmienność latencji prowadzi do:&lt;br /&gt;
* zmniejszenia amplitudy &amp;lt;math&amp;gt;\bar x&amp;lt;/math&amp;gt;&lt;br /&gt;
* wzrostu rozciągłości czasowej załamka&lt;br /&gt;
&lt;br /&gt;
O tych konsekwencjach zmienności latencji należy w szczególności pamiętać porównując średnie potencjały uzyskane w różnych warunkach eksperymentalnych. Gdy zauważymy, że średnie potencjały różnią się amplitudą należy rozważyć możliwość, że w istocie warunki eksperymentalne wpływają na różnice w wariancji latencji. &lt;br /&gt;
&lt;br /&gt;
Naturalne jest, że zmienność latencji jest bardziej widoczna w przypadku załamków trwających krótko niż w przypadku załamków trwających długo. Wariancja latencji rożnie wraz z jej wartością, stąd wśród późnych składowych potencjałów wywołanych nie obserwuje się komponentów krótkotrwałych.&lt;br /&gt;
&amp;lt;!--====Uśrednianie metodą Woody'ego ====&lt;br /&gt;
&lt;br /&gt;
Model potencjału ze zmienną latencją i sposób na jego efektywniejsze uśrednianie zaproponował Woody (1967). Model ten zakłada, że w każdej realizacji występuje komponent addytywny &amp;lt;math&amp;gt;s_i(t)\;&amp;lt;/math&amp;gt;, który co do kształtu jest stały, a pomiędzy realizacjami różni się tylko latencją:&lt;br /&gt;
: &amp;lt;math&amp;gt; s_i(t) = s(t +\Delta t_i)\;&amp;lt;/math&amp;gt;&lt;br /&gt;
Woody zaproponował aby &amp;lt;math&amp;gt;\Delta t_i\;&amp;lt;/math&amp;gt; szacować na podstawie maksimum funkcji korelacji wzajemnej pomiędzy ''i''-tą realizacją a wzorcem. W pierwszym kroku wzorcem jest średni potencjał uzyskany przez proste uśrednienie realizacji.  Następnie w sposób iteracyjny dokonuje się:&lt;br /&gt;
* poprawek w wyrównaniu poszczególnych realizacji,&lt;br /&gt;
* obliczenia nowego wzorca poprzez uśrednienie realizacji po korekcie wyrównania,&lt;br /&gt;
* obliczenia nowych poprawek do wyrównania realizacji.--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Habituacja ===&lt;br /&gt;
Zmienność w odpowiedziach na kolejno występujące po sobie bodźce można podzielić na komponent stochastyczny i deterministyczny. Komponent deterministyczny odzwierciedla zmianę czułości  układu nerwowego  na kolejne bodźce. Nowy bodziec często wywołuje reakcje pobudzenia widoczną w wielu parametrach takich jak przewodnictwo skóry, rytm serca i reaktywność kory mózgowej. Powszechnie obserwowanym zjawiskiem jest spadek reaktywności na powtarzające się bodźce zwany habituacją. Niekiedy obserwuje się także zjawisko przeciwne &amp;amp;mdash; wzrost reaktywności na bodziec &amp;amp;mdash; zwane sensytyzacją. &lt;br /&gt;
&lt;br /&gt;
Klasycznym sposobem na badanie tych zjawisk w potencjałach wywołanych jest uśrednianie w podzbiorach lub  uśrednianie blokowe. Wymaga ono  zmiany paradygmatu rejestracji danych. Załóżmy, że interesującym nas bodźcem jest błysk światła. Chcemy zaobserwować ewentualne zmiany amplitudy i latencji w ciągu 100 potencjałów będących reakcją na błysk powtarzający się co 500 ms.&lt;br /&gt;
====Uśrednianie w podzbiorach ====&lt;br /&gt;
W metodzie tej musimy założyć, że proces habituacji jest powolny, tzn. zmiany pomiędzy kolejnymi reakcjami są bardzo małe. W takim przypadku możemy podzielić długą serię bodźców na ciąg pod-serii i uśrednienie przeprowadzić dla każdej pod-serii osobno.&lt;br /&gt;
[[Plik:Usrednianie_podzbiory.svg‎|640px|thumb|center|Ilustracja uśredniania w podzbiorach]]&lt;br /&gt;
&lt;br /&gt;
====Uśrednianie blokowe====&lt;br /&gt;
W tym celu eksperyment wykonujemy w wielu seriach. Jedna seria składa się ze 100 błysków powtarzanych co 500 ms.  Po serii następuje przerwa trwająca np. 5 s (długość przerwy wyraża nasze oszacowanie czasu potrzebnego na zanik habituacji). Po przerwie seria jest powtarzana. Powtórzeń serii wykonujemy ''N''.&lt;br /&gt;
Następnie uśredniamy fragmenty sygnałów odpowiadające sobie w kolejnych seriach. &lt;br /&gt;
&lt;br /&gt;
W tym paradygmacie zakładamy, że każda seria rejestrowana jest w tych samych warunkach. Zaniedbujemy efekty związane ze zmęczeniem i zmianami w np. stopniu koncentracji badanego.&lt;br /&gt;
[[Plik:Usrednianie blokowe.svg|Usrednianie blokowe.svg|640px|thumb|center|Ilustracja uśredniania w blokach]]&lt;br /&gt;
&lt;br /&gt;
===Załamki w krzywej potencjału wywołanego vs ukryte komponenty===&lt;br /&gt;
Komponenta potencjału wywołanego to bardzo ważne ale jednocześnie źle określone pojęcie. Krzywa otrzymana w wyniku uśredniania potencjałów wywołanych przedstawia serię załamków dodatnich i ujemnych, ale trzeba być świadomym, że ten przebieg napięcia rejestrowany przez elektrody przedstawia tak naprawdę sumę potencjałów pochodzących od wielu dość niezależnie działających źródeł w mózgu. Przyczynek pochodzący od jednego funkcjonalnego źródła będziemy określać jako komponentę. &lt;br /&gt;
&lt;br /&gt;
Komentarza wymaga też pojęcie źródła funkcjonalnego. Czynność elektryczną synchronicznie działających neuronów piramidalnych w określonym fragmencie kory mózgowej z pewnej odległości można przybliżyć potencjałem dipola prądowego. Taki aktywny fragment kory stanowi źródło dające przyczynek do mierzonego na powierzchni głowy potencjału. W najprostszej sytuacji taki przyczynek może być obserwowany jako komponenta. Mózg jest jednak obiektem niezwykle złożonym i gęsto połączonym. Wiele obszarów korowych może być funkcjonalnie połączonych i aktywowanych synchronicznie w celu realizacji określonego zadania &amp;amp;mdash; o takim funkcjonalnym zespole też możemy myśleć jako o pojedynczym źródle, choć może ono mieć złożoną strukturę przestrzenną. Często zatem myślimy o komponentach ukrytych potencjału wywołanego jako o aktywności takich funkcjonalnych zespołów. &lt;br /&gt;
&lt;br /&gt;
Po tym wstępie widać już chyba, że do zrozumienia co dzieje się w czasie reakcji na bodziec, którą obserwujemy w potencjale wywołanym, bardziej pożądane byłoby badanie komponent ukrytych niż poszczególnych załamków krzywej potencjału wywołanego, która stanowi ważoną sumę owych komponentów. Zanim przejdziemy do omówienia technik służących &amp;amp;bdquo;wyłuskiwaniu&amp;amp;rdquo; komponent prześledźmy kilka symulacji i wnioski z nich płynące.&lt;br /&gt;
&lt;br /&gt;
==== Załamki i komponenty nie są tym samym.====&lt;br /&gt;
Tę samą krzywą można otrzymać na nieskończenie wiele sposobów  przez sumowanie rożnych kombinacji domniemanych komponentów. Przykładowy rysunek pokazuje, jak tę samą krzywą można złożyć z dwóch rożnych zestawów komponentów (kod wytwarzający przykładową symulację pokazany jest poniżej).&lt;br /&gt;
[[Plik:Sumowanie_komponentow1.png|center|thumb|600px| Panel a) przedstawia hipotetyczną krzywą ERP, panel b) jedna z możliwych dekompozycji sygnału w panelu a), panel c) inna możliwa dekompozycja sygnału z panelu a) ]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
from __future__ import division&lt;br /&gt;
import numpy as np&lt;br /&gt;
from matplotlib.pyplot import plot, show ,subplot, figure, title, xlabel, ylabel, ylim&lt;br /&gt;
&lt;br /&gt;
Fs = 1&lt;br /&gt;
t = np.arange(0,700)&lt;br /&gt;
&lt;br /&gt;
C1 = np.exp(-(t-100)**2/(2*30**2))&lt;br /&gt;
C2 = np.exp(-(t-200)**2/(2*50**2))&lt;br /&gt;
C3 = np.exp(-(t-350)**2/(2*100**2))&lt;br /&gt;
ERP = 0.5*C1-C2+C3&lt;br /&gt;
&lt;br /&gt;
C2p = np.concatenate((C2[0:200], np.ones(30), C2[200:700-30] ))&lt;br /&gt;
C3p = ERP - 0.5*C1 + C2p&lt;br /&gt;
ERP_v2 = 0.5*C1-C2p+C3p&lt;br /&gt;
&lt;br /&gt;
subplot(3,1,1)&lt;br /&gt;
plot(t,ERP, t[::10],ERP_v2[::10],'g.')&lt;br /&gt;
ylabel('a)',rotation='horizontal')&lt;br /&gt;
ylim([-1, 1.5])&lt;br /&gt;
&lt;br /&gt;
subplot(3,1,2)&lt;br /&gt;
plot(t,0.5*C1,t,-C2,t,C3)&lt;br /&gt;
ylabel('b)',rotation='horizontal')&lt;br /&gt;
ylim([-1, 1.5])&lt;br /&gt;
&lt;br /&gt;
subplot(3,1,3)&lt;br /&gt;
plot(t,0.5*C1,t,-C2p,t,C3p)&lt;br /&gt;
ylabel('c)',rotation='horizontal')&lt;br /&gt;
ylim([-1, 1.5])&lt;br /&gt;
&lt;br /&gt;
show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Zmiana jednej komponenty może powodować zmiany w amplitudzie i latencji więcej niż jednego załamka.====&lt;br /&gt;
Poniższy rysunek przedstawia sytuację gdy zmiana amplitudy jednego komponentu może znacząco wpływać na amplitudę i latencję innych załamków.&lt;br /&gt;
&lt;br /&gt;
[[Plik:Sumowanie_komponentow2.png|center|thumb|768px| Panel a) przedstawia dwie hipotetyczne krzywe ERP, panel b) panel b i c komponenty z których powstały owe krzywe. Zmiana amplitudy komponentu oznaczonego kolorem powoduje zmianę amplitudy oznaczonych załamków ale także zmianę latencji wcześniejszego załamka. ]]&lt;br /&gt;
Poniżej kod odtwarzający powyższy przykład:&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
from __future__ import division&lt;br /&gt;
import numpy as np&lt;br /&gt;
from matplotlib.pyplot import plot, show, subplot, figure, title, xlabel, ylabel, ylim&lt;br /&gt;
&lt;br /&gt;
Fs = 1&lt;br /&gt;
t = np.arange(0,700)&lt;br /&gt;
&lt;br /&gt;
C1 = np.exp(-(t-100)**2/(2*30**2))&lt;br /&gt;
C2 = np.exp(-(t-200)**2/(2*50**2))&lt;br /&gt;
C3 = np.exp(-(t-350)**2/(2*100**2))&lt;br /&gt;
ERP1 = 0.5*C1-C2+C3&lt;br /&gt;
ERP2 = 0.5*C1-C2+1.5*C3&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
subplot(3,1,1)&lt;br /&gt;
plot(t,ERP1,'b', t,ERP2,'g')&lt;br /&gt;
plot(t[np.argmin(ERP1)],np.min(ERP1),'r.' )&lt;br /&gt;
plot(t[np.argmax(ERP1)],np.max(ERP1),'m.' )&lt;br /&gt;
plot(t[np.argmin(ERP2)],np.min(ERP2),'r.' )&lt;br /&gt;
plot(t[np.argmax(ERP2)],np.max(ERP2),'m.' )&lt;br /&gt;
&lt;br /&gt;
ylabel('a)',rotation='horizontal')&lt;br /&gt;
ylim([-1, 1.6])&lt;br /&gt;
&lt;br /&gt;
subplot(3,1,2)&lt;br /&gt;
plot(t,0.5*C1,'k',t,-C2,'k',t,C3,'b')&lt;br /&gt;
ylabel('b)',rotation='horizontal')&lt;br /&gt;
ylim([-1, 1.6])&lt;br /&gt;
&lt;br /&gt;
subplot(3,1,3)&lt;br /&gt;
plot(t,0.5*C1,'k',t,-C2,'k',t,1.5*C3,'g')&lt;br /&gt;
ylabel('c)',rotation='horizontal')&lt;br /&gt;
ylim([-1, 1.6])&lt;br /&gt;
&lt;br /&gt;
show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Instrukcje do ćwiczeń =&lt;br /&gt;
&lt;br /&gt;
==Zadanie 1: uśrednianie symulowanych sygnałów==&lt;br /&gt;
w tym ćwiczeniu chcemy pokazać efekty:&lt;br /&gt;
# uśredniania sygnałów związanych fazowo z bodźcem i nieskorelowanych z bodźcem / wpływ liczby realizacji,&lt;br /&gt;
# uśredniania sygnałów z fluktuacją latencji,&lt;br /&gt;
# wpływ filtrów o różnych funkcjach odpowiedzi impulsowej na morfologię uśrednionego potencjału.&lt;br /&gt;
&lt;br /&gt;
===Sygnały testowe===&lt;br /&gt;
Proszę zaimplementować funkcje generujące następujące przebiegi czasowe (oznaczenia: ''F&amp;lt;sub&amp;gt;s&amp;lt;/sub&amp;gt;'' &amp;amp;mdash; częstość próbkowania, ''T'' &amp;amp;mdash; czas trwania w sekundach, [[%C4%86wiczenia_1#Sygna.C5.82y_testowe|analogicznie do tego]]):&lt;br /&gt;
* sinusoida o zadanej częstości ''f'' i fazie &amp;lt;math&amp;gt;\phi&amp;lt;/math&amp;gt;: &amp;lt;tt&amp;gt;y = sin(f, phi, Fs, T)&amp;lt;/tt&amp;gt;,&lt;br /&gt;
* funkcja Gaussa o zadanym położeniu i szerokości &amp;lt;tt&amp;gt;y = g_1(t0, sigma, Fs, T) &amp;lt;/tt&amp;gt;&lt;br /&gt;
: &amp;lt;math&amp;gt;g_1(t) = \exp\left(-\frac{(t-t_0)^2}{2 \sigma^2}\right)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* pochodną funkcji Gaussa o zadanym położeniu i szerokości &amp;lt;tt&amp;gt;y = g_2(t0, sigma, Fs, T)&amp;lt;/tt&amp;gt;,&lt;br /&gt;
* połowę funkcji Gaussa o zadanym położeniu i szerokości &amp;lt;tt&amp;gt;y = g_3(t0, sigma, Fs, T)&amp;lt;/tt&amp;gt;,&lt;br /&gt;
: &amp;lt;math&amp;gt;g_{3}(t) = \left\{ &lt;br /&gt;
\begin{array}{lll}&lt;br /&gt;
0 &amp;amp; \mathrm{dla}&amp;amp; t&amp;lt;t_0 \\&lt;br /&gt;
\exp\left(-\frac{(t-t_0)^2}{2 \sigma^2}\right)&amp;amp; \mathrm{dla}&amp;amp; t \ge t_0  &lt;br /&gt;
\end{array}&lt;br /&gt;
\right. &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
W dalszych zadaniach tej sekcji przyjmiemy:&lt;br /&gt;
* ''T'' = 1 s,&lt;br /&gt;
* ''F&amp;lt;sub&amp;gt;s&amp;lt;/sub&amp;gt;'' = 128 Hz,&lt;br /&gt;
* ''t''&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; = 0,3 s,&lt;br /&gt;
* &amp;amp;sigma; = 0,02 s.&lt;br /&gt;
&lt;br /&gt;
===Uśrednianie w modelu addytywnym: sygnał + szum===&lt;br /&gt;
Dla funkcji &amp;lt;math&amp;gt;g_1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;g_2&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;g_3&amp;lt;/math&amp;gt;  wykonaj ''N'' symulacji sygnału opisanego daną funkcją z dodanym szumem gaussowskim (&amp;lt;tt&amp;gt;numpy.random.randn&amp;lt;/tt&amp;gt;). Zaobserwuj zmianę wariancji uśrednianego sygnału wraz z ''N''.&lt;br /&gt;
&lt;br /&gt;
===Uśrednianie w modelu addytywnym: sygnał + szum + niezależna czynność rytmiczna===&lt;br /&gt;
Powtórz poprzednie symulacje dokładając w każdej realizacji sinusoidę o losowo wybranej fazie. Symulacje wykonaj dla różnych częstości sinusoidy, takich których połówka okresu zbliżona jest do szerokości funkcji Gaussa, oraz znacząco od niej różnych.&lt;br /&gt;
&lt;br /&gt;
===Uśrednianie w modelu z resetem fazy===&lt;br /&gt;
Zbuduj sygnał składający się z dwóch fragmentów sinusoidy o częstości ''f'': &lt;br /&gt;
* pierwszy fragment ma losową fazę,&lt;br /&gt;
* drugi fragment ma fazę równą 0.&lt;br /&gt;
Wykonaj ''N'' realizacji takiego sygnału, przy czym każda realizacja ma częstość losowaną z rozkładu Gaussa o średniej 10 i pewnej wariancji (czyli &amp;lt;math&amp;gt;f \in \mathrm{N}(10,\sigma)&amp;lt;/math&amp;gt;). &lt;br /&gt;
Uśrednij otrzymane realizacje. Zaobserwuj zależność średniej od liczby uśrednianych realizacji i od wariancji częstości.&lt;br /&gt;
&lt;br /&gt;
===Uśrednianie potencjału z fluktuacją latencji===&lt;br /&gt;
Wygeneruj sygnały składające się z funkcji &amp;lt;math&amp;gt;g_1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;g_2&amp;lt;/math&amp;gt; albo &amp;lt;math&amp;gt;g_3&amp;lt;/math&amp;gt; z fluktuującą latencją, tzn. z wartością &amp;lt;math&amp;gt;t_0&amp;lt;/math&amp;gt; pochodzącą z jakiegoś rozkładu prawdopodobieństwa. U nas dla ustalenia uwagi niech będzie to rozkład Gaussa. Wykonaj zestaw symulacji obrazujący zależność od liczby realizacji i od wielkości fluktuacji, mierzonej przez wariancję rozkładu. Czy jest związek pomiędzy wariancją fluktuacji &amp;lt;math&amp;gt;t_0&amp;lt;/math&amp;gt; a szerokością załamków?&lt;br /&gt;
&lt;br /&gt;
===Wpływ filtrów===&lt;br /&gt;
# Zaprojektuj następujące filtry (przyjmij częstość próbkowania 128 Hz):&lt;br /&gt;
#* dolnoprzepustowy: Butterwortha z częstością odcięcia: 30, 40, 50 Hz, i rzędach od 1 do 5 (funkcja butter w module scipy.signal),&lt;br /&gt;
#* górnoprzepustowy: Butterwortha z częstością odcięcia: 0,1, 0,5, 2 i 5 Hz, i rzędach od 1 do 5,&lt;br /&gt;
#* notch: Czybyszewa II rodzaju z pasmem zaporowym ustawionym na 50 Hz, i rzędach od 1 do 3 (funkcja cheby2),&lt;br /&gt;
# Zbadaj funkcję odpowiedzi impulsowej i funkcję przenoszenia tych filtrów (w skali dB). Zaobserwuj jak długa jest odpowiedź impulsowa i jak daleko od częstości odcięcia zaburzone jest pasmo przenoszenia.&lt;br /&gt;
# Zastosuj powyższe filtry do funkcji &amp;lt;math&amp;gt;g_1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;g_2&amp;lt;/math&amp;gt; albo &amp;lt;math&amp;gt;g_3&amp;lt;/math&amp;gt;. Filtrowanie przeprowadź w jedną (lfilter) oraz w dwie strony (filtfilt). Zaobserwuj związek między zniekształceniem wprowadzanym przez filtr a funkcją odpowiedzi impulsowej filtru.&lt;br /&gt;
# W ćwiczeniu tym posłuż się symulowanymi sygnałami uzyskanymi z modelu addytywnego: &amp;amp;bdquo;sygnał+szum&amp;amp;rdquo;. Dla funkcji &amp;lt;math&amp;gt;g_1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;g_2&amp;lt;/math&amp;gt; albo &amp;lt;math&amp;gt;g_3&amp;lt;/math&amp;gt;  wykonaj ''N'' = 60 realizacji sygnału opisanego daną funkcją z dodanym szumem gaussowskim (&amp;lt;tt&amp;gt;numpy.random.randn&amp;lt;/tt&amp;gt;). Każdą z realizacji przefiltruj, a następnie uśrednij uzyskane sygnały.&lt;br /&gt;
&lt;br /&gt;
==Zadanie 2: rejestracje i analiza potencjałów wzrokowych==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- ===Synchronizacja występowania bodźców z sygnałem EEG===&lt;br /&gt;
&lt;br /&gt;
Rejestracja potencjałów wywołanych jest przykładem pomiaru czynności elektrycznej mózgu w odpowiedzi na określony bodziec. W przypadku tego rodzaju pomiarów konieczna jest synchronizacja momentu wystąpienia bodźca z sygnałem EEG. Wzmacniacze do pomiaru czynności elektrycznej mózgu wyposażone są w specjalne wejścia, na które można podawać sygnał odpowiadający pojawianiu się bodźca. Jak pamiętamy z zeszłego semestru, wejście to (jak i podawany na nie sygnał) nazywamy trigerem (ang. ''trigger'' &amp;amp;mdash; spust, cyngiel, wyzwalacz). W najprostszym przypadku, bodziec moglibyśmy wyświetlać na monitorze komputerowym, a sygnał związany z jego wystąpieniem wysyłać przez któryś z portów komputera (LPT, COM) na wzmacniacz EEG. Niestety, obecnie dostępne i popularne systemy operacyjne, takie jak Windows czy Linux nie są systemami czasu rzeczywistego (http://pl.wikipedia.org/wiki/System_operacyjny_czasu_rzeczywistego). Od momentu wyświetlania bodźca na ekranie, do pojawiania się sygnału odpowiednim porcie komputerowym może upłynąć kilkadziesiąt milisekund i co gorsza czas ten zwykle jest losowy. W przypadku gdy wzmacniacz próbkuje sygnał z częstością 1000 Hz, moment wystąpienia bodźca możemy określić z dokładnością 1 ms, jednakże wspomniane opóźnienia w systemie operacyjnym uniemożliwiają to. Ponadto, jak dowiedzieliśmy się w rozdziale wstępnym [http://brain.fuw.edu.pl/edu-wiki/action/edit/EEG:Potencja%C5%82y_wywo%C5%82ane?section=T-1], pierwsze załamki związane z potencjałami wywołanymi pojawiają się już 10 ms po wystąpieniu bodźca. W związku z tym, losowe, rzędu kilkudziesięciu milisekund opóźnienia sygnału określającego moment pojawienia się bodźca względem jego rzeczywistego wystąpienia są niedopuszczalne.&lt;br /&gt;
Istnieją pewne techniki programowania, dzięki którym opisywane opóźnienia można zmniejszyć, jednakże są one bardzo trudne  do realizacji. Ponadto, standardowe porty komputera, takie jak LPT, czy COM zostały zaprojektowane przede wszystkim do sterowania urządzeniami zewnętrznymi, a nie ich zasilania. Przykładowo, jedna linia portu drukarkowego (LPT) może być obciążona prądem nie większym niż 5 mA, podczas gdy do zapalenie zwykłej diody LED potrzeba około 10 mA. Taki pobór prądu możliwy jest do uzyskania z portu USB, jednakże  jest on  wyjątkowo trudny do oprogramowania.  &lt;br /&gt;
W celu ominięcia powyższych niedogodności w Zakładzie Fizyki Biomedycznej UW w przeprowadzanych eksperymentach wykorzystywane są  mikrokontrolery [http://pl.wikipedia.org/wiki/Mikrokontroler], w szczególności ATmega16 i ATmega32.  Mikrokontrolery te wyposażone są w procesory o architekturze RISC [http://pl.wikipedia.org/wiki/RISC] i mocy obliczeniowej porównywalnej z szeroko stosowanym kiedyś w komputerach ZX Spectrum, Commodore, Amiga i Atari procesorem Z80. Oprócz jednostki centralnej mikrokontrolery zawierają   stałą pamięć FLASH przeznaczoną do przechowywania kodu programu, pamięć  RAM i pamięć EEPROM, liczniki 8- i 16-bitowe, komparatory, przetworniki analogowo-cyfrowe, porty wejścia/wyjścia, łącze RS232 (popularnie nazywane portem szeregowym) i układy przerwań.&lt;br /&gt;
&lt;br /&gt;
Mikrokontrolery wchodzące w skład zestawów pomiarowych na Pracowni EEG zawierają program, który umożliwia komunikację z nimi poprzez port szeregowy. Obecnie, komputery są coraz rzadziej wyposażane w porty szeregowe. Standard komunikacji RS-232, opracowany w 1962 roku  nadal jest jednak popularny i często wykorzystywany do komunikacji miedzy urządzeniami.  W celu połączenia komputera posiadającego tylko porty USB z mikrokontrolerem zastosowano przejściówkę USB/RS-232. &lt;br /&gt;
&lt;br /&gt;
Jak każde urządzenie w systemie Linuks, przejściówka USB/RS-232 widoczna jest jako plik, znajdujący się w katalogu &amp;lt;tt&amp;gt;/dev&amp;lt;/tt&amp;gt;. Nazwy plików obsługujących urządzenia szeregowe to &amp;lt;tt&amp;gt;ttyXY&amp;lt;/tt&amp;gt;, gdzie &amp;lt;tt&amp;gt;XY&amp;lt;/tt&amp;gt; to kolejny numer przydzielony do urządzenia szeregowego.&lt;br /&gt;
Do komunikacji komputera z mikroknotrolerem  w Zakładzie Fizyki Biomedycznej UW została napisana prosta biblioteka.  Jej użycie jest następujące:&lt;br /&gt;
* Po podłączeniu przejściówki USB/RS232 do komputera mikrokontrolera sprawdź jaki plik w katalogu &amp;lt;tt&amp;gt;/dev&amp;lt;/tt&amp;gt; został utworzony i przydzielony do urządzenia. &lt;br /&gt;
* Zaimportuj bibliotekę do komunikacji z mikrokontrolerem: &lt;br /&gt;
: &amp;lt;tt&amp;gt;import SerialPort as SP&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Otwórz plik powiązany z urządzeniem zewnętrznym:&lt;br /&gt;
: &amp;lt;tt&amp;gt;sp = SP.SerialPort(nazwa_pliku) &amp;lt;/tt&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
: &amp;lt;tt&amp;gt;sp.open()&amp;lt;/tt&amp;gt;&lt;br /&gt;
W naszym przypadku prawidłowa nazwa pliku to &amp;lt;tt&amp;gt;/dev/ttyUSB0&amp;lt;/tt&amp;gt;.&lt;br /&gt;
* Po włączeniu zasilania mikrokontrolera, diody podłączone do niego i wykorzystywane w eksperymencie z potencjałami wywołanymi będą zapalone. Następujące polecenie zgasi obydwie diody:&lt;br /&gt;
: &amp;lt;tt&amp;gt;sp.blinkP300([0, 0])&amp;lt;/tt&amp;gt;&lt;br /&gt;
* Wydanie poniższego polecenia spowoduje, iż mikrokontroler zapali podłączoną do niego diodę numer 1 na czas 100 ms, zaś diodę numer 2 na 200 ms. Jednocześnie, w momencie włączenia jak i wyłączenia diody, sygnał z mikrokontrolera zostanie wysłany na 5-stykowe wejście AUX mikrokontrolera:&lt;br /&gt;
: &amp;lt;tt&amp;gt;sp.blinkP300([100, 200])&amp;lt;/tt&amp;gt;&lt;br /&gt;
* Jeśli chcemy zapalić tylko diodę numer dwa, np. na czas 500 ms w programie podajemy następującą instrukcję:&lt;br /&gt;
: &amp;lt;tt&amp;gt;sp.blinkP300([0, 500])&amp;lt;/tt&amp;gt;&lt;br /&gt;
* Jeśli chcemy zakończyć komunikację z mikrokontrolerem piszemy:&lt;br /&gt;
: &amp;lt;tt&amp;gt;sp.close()&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Kod biblioteki do komunikacji z mikrokontrolerem:&amp;lt;br&amp;gt;&lt;br /&gt;
--&amp;gt;&amp;lt;!--  Kod w Pythonie 2&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# -*- coding: cp1250 -*-&lt;br /&gt;
import serial&lt;br /&gt;
import logging&lt;br /&gt;
import sys&lt;br /&gt;
import os&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def to_hex_word(a):&lt;br /&gt;
    '''encodes a decimal number hexadecimally on two bytes'''&lt;br /&gt;
    return chr(a%256) + chr(a/256)&lt;br /&gt;
&lt;br /&gt;
class SerialPort(object):&lt;br /&gt;
    def __init__(self, port_name):&lt;br /&gt;
        import serial&lt;br /&gt;
        try:&lt;br /&gt;
            self.port = serial.Serial(&lt;br /&gt;
                port=port_name,&lt;br /&gt;
                baudrate=9600,&lt;br /&gt;
                bytesize=serial.EIGHTBITS,&lt;br /&gt;
                parity=serial.PARITY_NONE,&lt;br /&gt;
                stopbits=serial.STOPBITS_ONE,&lt;br /&gt;
                xonxoff=False&lt;br /&gt;
                )&lt;br /&gt;
        except serial.SerialException as e:&lt;br /&gt;
            print(&amp;quot;Nieprawidłowa nazwa portu lub port zajęty.&amp;quot;)&lt;br /&gt;
            raise e&lt;br /&gt;
        self.close()&lt;br /&gt;
        &lt;br /&gt;
    def open(self):&lt;br /&gt;
        self.port.open()&lt;br /&gt;
&lt;br /&gt;
    def close(self):&lt;br /&gt;
        self.port.close()&lt;br /&gt;
&lt;br /&gt;
    def send(self, value):&lt;br /&gt;
        self.port.write(value)&lt;br /&gt;
                           &lt;br /&gt;
    def blinkSSVEP(self,d, p1, p2):&lt;br /&gt;
        '''&lt;br /&gt;
        d = list of frequencies;&lt;br /&gt;
        p1:p2 = ratio LED_on_time/LED_off_time&lt;br /&gt;
        if you want i-th LED to be OFF all the time send  d[i] = 0&lt;br /&gt;
        if you want i-th LED to be ON all the time send  d[i] = -1&lt;br /&gt;
        in these two cases p1 and p2 do not matter&lt;br /&gt;
        '''&lt;br /&gt;
        clock  = 62500&lt;br /&gt;
        factor = float(p1) / float(p1 + p2)&lt;br /&gt;
    &lt;br /&gt;
        str = chr(3) # 'SSVEP_RUN'&lt;br /&gt;
&lt;br /&gt;
        for i in range(len(d)):&lt;br /&gt;
            # i-th LED OFF&lt;br /&gt;
            if d[i] == 0:                       &lt;br /&gt;
                str += to_hex_word(0) + to_hex_word(255) &lt;br /&gt;
            # i-th LED ON&lt;br /&gt;
            elif d[i] == -1:&lt;br /&gt;
                str += to_hex_word(255) + to_hex_word(0)&lt;br /&gt;
                #str = 'S'&lt;br /&gt;
                # i-th LED blinks d[i] times per second&lt;br /&gt;
                # p1:p2 = on_time:off_time in one blink&lt;br /&gt;
            else:&lt;br /&gt;
                period = clock/d[i]&lt;br /&gt;
                bright = int((clock/d[i]) * factor)&lt;br /&gt;
                dark = period - bright&lt;br /&gt;
                str += to_hex_word(bright) + to_hex_word(dark)&lt;br /&gt;
&lt;br /&gt;
        self.send(str)&lt;br /&gt;
&lt;br /&gt;
    def blinkP300(self,d):&lt;br /&gt;
        clock  = 62500&lt;br /&gt;
        str = chr(4) # 'P300_RUN'&lt;br /&gt;
&lt;br /&gt;
        for i in range(len(d)):&lt;br /&gt;
            period = int(clock*d[i]/1000.0)&lt;br /&gt;
            str += to_hex_word(period)&lt;br /&gt;
            print(period)&lt;br /&gt;
&lt;br /&gt;
        self.send(str)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
--&amp;gt;&amp;lt;!-- Kod w Pythonie 3 --&amp;gt;&amp;lt;!-- &amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# -*- coding: cp1250 -*-&lt;br /&gt;
import serial&lt;br /&gt;
import logging&lt;br /&gt;
import sys&lt;br /&gt;
import os&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
def to_hex_word(a):&lt;br /&gt;
    '''encodes a decimal number hexadecimally on two bytes'''&lt;br /&gt;
    return a.to_bytes(2,byteorder=sys.byteorder)&lt;br /&gt;
 &lt;br /&gt;
class SerialPort(object):&lt;br /&gt;
    def __init__(self, port_name):&lt;br /&gt;
        import serial&lt;br /&gt;
        try:&lt;br /&gt;
            self.port = serial.Serial(&lt;br /&gt;
                port=port_name,&lt;br /&gt;
                baudrate=9600,&lt;br /&gt;
                bytesize=serial.EIGHTBITS,&lt;br /&gt;
                parity=serial.PARITY_NONE,&lt;br /&gt;
                stopbits=serial.STOPBITS_ONE,&lt;br /&gt;
                xonxoff=False&lt;br /&gt;
                )&lt;br /&gt;
        except serial.SerialException as e:&lt;br /&gt;
            print(&amp;quot;Nieprawidłowa nazwa portu lub port zajęty.&amp;quot;)&lt;br /&gt;
            raise e&lt;br /&gt;
        self.close()&lt;br /&gt;
 &lt;br /&gt;
    def open(self):&lt;br /&gt;
        self.port.open()&lt;br /&gt;
 &lt;br /&gt;
    def close(self):&lt;br /&gt;
        self.port.close()&lt;br /&gt;
 &lt;br /&gt;
    def send(self, value):&lt;br /&gt;
        self.port.write(value)&lt;br /&gt;
 &lt;br /&gt;
    def blinkSSVEP(self,d, p1, p2):&lt;br /&gt;
        '''&lt;br /&gt;
        d = list of frequencies;&lt;br /&gt;
        p1:p2 = ratio LED_on_time/LED_off_time&lt;br /&gt;
        if you want i-th LED to be OFF all the time send  d[i] = 0&lt;br /&gt;
        if you want i-th LED to be ON all the time send  d[i] = -1&lt;br /&gt;
        in these two cases p1 and p2 do not matter&lt;br /&gt;
        '''&lt;br /&gt;
        clock  = 62500&lt;br /&gt;
        factor = float(p1) / float(p1 + p2)&lt;br /&gt;
 &lt;br /&gt;
        str = (3).to_bytes(1,byteorder=sys.byteorder) # 'SSVEP_RUN'&lt;br /&gt;
 &lt;br /&gt;
        for i in range(len(d)):&lt;br /&gt;
            # i-th LED OFF&lt;br /&gt;
            if d[i] == 0:                       &lt;br /&gt;
                str += to_hex_word(0) + to_hex_word(255) &lt;br /&gt;
            # i-th LED ON&lt;br /&gt;
            elif d[i] == -1:&lt;br /&gt;
                str += to_hex_word(255) + to_hex_word(0)&lt;br /&gt;
                #str = 'S'&lt;br /&gt;
                # i-th LED blinks d[i] times per second&lt;br /&gt;
                # p1:p2 = on_time:off_time in one blink&lt;br /&gt;
            else:&lt;br /&gt;
                period = clock/d[i]&lt;br /&gt;
                bright = int((clock/d[i]) * factor)&lt;br /&gt;
                dark = int(period - bright)&lt;br /&gt;
                str += to_hex_word(bright) + to_hex_word(dark)&lt;br /&gt;
 &lt;br /&gt;
        self.send(str)&lt;br /&gt;
 &lt;br /&gt;
    def blinkP300(self,d):&lt;br /&gt;
        clock  = 62500&lt;br /&gt;
        str = (4).to_bytes(1,byteorder=sys.byteorder) # 'P300_RUN'&lt;br /&gt;
 &lt;br /&gt;
        for i in range(len(d)):&lt;br /&gt;
            period = int(clock*d[i]/1000.0)&lt;br /&gt;
            str += to_hex_word(period)&lt;br /&gt;
 &lt;br /&gt;
        self.send(str)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
--&amp;gt; &lt;br /&gt;
&lt;br /&gt;
===Zestaw eksperymentalny===&lt;br /&gt;
Zestaw składa się ze:&lt;br /&gt;
* wzmacniacza,&lt;br /&gt;
* stymulatora   &lt;br /&gt;
&amp;lt;!--* izolowanego galwanicznie układu generującego impulsy odpowiadające gaszeniu i zapalaniu diody,  o wartościach dopasowanych do akceptowalnych przez wejścia AUX wzmacniacza,--&amp;gt;&lt;br /&gt;
* komputera: w tym eksperymencie komputer będzie służył do zaprogramowania stymulatora i do rejestracji sygnałów.&lt;br /&gt;
&lt;br /&gt;
===Eksperyment 1. Obserwacja bodźca wzrokowego  ===&lt;br /&gt;
&amp;lt;!--Proszę zapoznać się ze standardami rejestracji wzrokowych potencjałów wywołanych [http://www.gcu.ac.uk/media/gcalwebv2/theuniversity/academicschools/sls/psytimetables/SLS%20-%20VEP_Standard_2010.pdf] --&amp;gt;&lt;br /&gt;
Proszę zapoznać się z typowym wyglądem załamków w przypadku potencjałów wzrokowych, jaki jest przedstawiony na [https://link.springer.com/article/10.1007/s10633-009-9195-4/figures/2 rysunku] (cały artykuł jest dostępny [http://link.springer.com/article/10.1007%2Fs10633-009-9195-4 tu]).&lt;br /&gt;
&amp;lt;!--[[Plik:Fig 4 VEP.jpg|thumb|320px|right|&amp;lt;figure id=&amp;quot;fig:zalamki_VEP&amp;quot;&amp;gt;&amp;lt;/figure&amp;gt;&lt;br /&gt;
&amp;lt;xr id=&amp;quot;fig:zalamki_VEP&amp;quot;&amp;gt;Rys. %i.&amp;lt;/xr&amp;gt; Schemat załamków rozpoznawanych we wzrokowych potencjach wywołanych (z pracy: J. V. Odom i in. &amp;amp;bdquo;ISCEV standard for clinical visual evoked potentials&lt;br /&gt;
(2009 update)&amp;amp;rdquo;, Doc Ophthalmol (2010), 120:111–119).]]&lt;br /&gt;
--&amp;gt; &lt;br /&gt;
&lt;br /&gt;
==== Rejestracja ====&lt;br /&gt;
* Paradygmat: z odległości około 40 cm badany obserwuje wyświetalny na ekranie biały kwadrat. Bodźce trwają 300 ms i  powtarzają się co 0.5 sekundy. Bodziec poprzedza punkt fiksacji pokazywany przez 300 ms. Natężenie bodźca ma przyjąć jedną z 4 wartości (manipulujemy jego przeźroczystością: 1, 0.7, 0.3 i 0.1, gdzie 1 oznacza brak przeźroczystości). Każda z intensywności bodźca ma pojawić się 100 razy podczas badania, bodźce podawane mają być w sposób losowy. Zadanie poprzedza krótka instrukcja, kończy podziękowanie. &lt;br /&gt;
&lt;br /&gt;
* Pomiar&lt;br /&gt;
**Zakładamy czepek i elektrody w systemie 10-20, dbamy o to by opory pomiędzy elektrodami były poniżej 10 k&amp;amp;Omega; i różnice pomiędzy oporami różnych elektrod nie przekraczały 20%. [[Plik:Glowka10-20 ERPy.svg|thumb|600px|right]]&lt;br /&gt;
** Elektrodę GND mocujemy w otworze czepka odpowiadającym pozycji AFz (na linii centralnej 10% w stronę nosa od elektrody Fz) &lt;br /&gt;
** Montujemy także elektrody M1 i M2 i FCz.&lt;br /&gt;
&lt;br /&gt;
==== Analiza ====&lt;br /&gt;
# Filtrujemy sygnał w paśmie 1-20 Hz.&lt;br /&gt;
# Z ciągłego zapisu wycinamy fragmenty od &amp;amp;minus;300 ms do +800 ms (zero oznacza moment wystąpienia bodźca). W czasie wycinania badamy wycinane fragmenty pod względem zakresu amplitudy (wszystkie kanały powinny mieć amplitudę w granicach &amp;amp;plusmn;75 &amp;amp;mu;V) i zawartości artefaktów od mrugania (w tym celu trzeba oglądając sygnał w SVAROG-u ustalić próg na amplitudę sygnału w kanałach Fp1 i Fp2).&lt;br /&gt;
# Uśredniamy wycięte sygnały.&lt;br /&gt;
# Rysujemy średni potencjał we wszystkich kanałach.&lt;br /&gt;
# Pierwszy sposób: Identyfikujemy załamki P1 i N2. Mierzymy amplitudę P1 jako różnicę między ekstremalną wartością załamka N2 a ekstremalną wartością załamka N2. &lt;br /&gt;
# Drugi sposób: Identyfikujemy załamki P1 i N2. Mierzymy amplitudę P1 w stosunku do zera. &lt;br /&gt;
#porównujemy uzyskane amplitudy w 4 warunkach za pomocą odpowiedniego testu statystycznego (porównanie warunków ze skrajnymi wartościami amplitudy - zastosuj test permutacyjny (opisany poniżej) lub test t-Studenta/nieparametryczny odpowiednik). &lt;br /&gt;
&lt;br /&gt;
**Opis testu permutacyjnego &lt;br /&gt;
Pytanie: Czy intensywność bodźca wpływa na amplitudę potencjału P1?&lt;br /&gt;
Jak stwierdzić czy amplitudy załamków P1 istotnie różnią się pomiędzy seriami?&lt;br /&gt;
&lt;br /&gt;
Musimy przeprowadzić test statystyczny. Możemy skonstruować go np. tak:&lt;br /&gt;
Mamy dwa warunki I i II. Jako statystykę przyjmiemy różnicę pomiędzy amplitudą załamka zmierzoną w serii z dwoma diodami (P2&amp;lt;sub&amp;gt;II&amp;lt;/sub&amp;gt;) a amplitudą zmierzoną w serii z jedną diodą (P2&amp;lt;sub&amp;gt;I&amp;lt;/sub&amp;gt;):&lt;br /&gt;
: ''S'' = P2&amp;lt;sub&amp;gt;II&amp;lt;/sub&amp;gt; &amp;amp;minus; P2&amp;lt;sub&amp;gt;I&amp;lt;/sub&amp;gt;&lt;br /&gt;
Postawmy hipotezę zerową, że nie ma różnicy w amplitudzie pomiędzy warunkiem II a I oraz hipotezę alternatywną, że różnica taka występuje.&lt;br /&gt;
: H&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;: ''S'' = 0&lt;br /&gt;
: H&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;: ''S'' &amp;amp;ne; 0&lt;br /&gt;
Zgodnie z H&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; dla wartości ''S'' nie ma różnicy czy realizacja została zarejestrowana w warunkach I czy II, zatem można losowo poprzypisywać numery warunków do realizacji i w ten sposób uzyskać rozkład statystyki ''S'' pod warunkiem prawdziwości H&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;, czyli obliczyć średnie potencjały dla &amp;amp;bdquo;pomieszanych&amp;amp;rdquo; tagów, wyliczyć średnie potencjały dla sztucznie wygenerowaych grup, i wyliczyć różnicę amplitud dla tych średnich, czyli wartość statystyki dla hipotezy H&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Zaimplementuj test permutacyjny zgodny z powyższą koncepcją.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- ===Wersja 2: obserwacja habituacji / uśrednianie w blokach ===&lt;br /&gt;
==== Rejestracja ====&lt;br /&gt;
# Paradygmat: &lt;br /&gt;
#* z odległości około 40 cm badany obserwuje błyski diody. &lt;br /&gt;
#* Błyski powtarzają się co 0,5 sekundy. &lt;br /&gt;
#* Rejestrujemy 60 serii po 15 błysków.  &lt;br /&gt;
#* Pomiędzy seriami badany odpoczywa około 10 sekund.&lt;br /&gt;
# Zakładamy czepek i elektrody w systemie 10-20, dbamy o to by opory pomiędzy elektrodami były poniżej 5 k&amp;amp;Omega; i różnice pomiędzy oporami różnych elektrod nie przekraczały 20%.&lt;br /&gt;
#* Elektrodę GND mocujemy w otworze czepka odpowiadającym pozycji AFz (na linii centralnej 10% w stronę nosa od elektrody Fz) &lt;br /&gt;
#* Montujemy także elektrodę FCz (na linii centralnej pomiędzy Fz a Cz), będziemy jej używać w montażu i w czasie analizy jako referencji.&lt;br /&gt;
#* Częstość próbkowania 512 Hz.&lt;br /&gt;
&lt;br /&gt;
==== Analiza ====&lt;br /&gt;
# Filtrujemy sygnał w paśmie 0,1-20 Hz.&lt;br /&gt;
# Z ciągłego zapisu wycinamy fragmenty od &amp;amp;minus;300 ms do +600 ms (zero oznacza moment wystąpienia bodźca). W czasie wycinania badamy wycinane fragmenty pod względem zakresu amplitudy (wszystkie kanały powinny mieć amplitudę w granicach &amp;amp;plusmn;75 &amp;amp;mu;V) i zawartości artefaktów od mrugania (w tym celu trzeba oglądając sygnał w SVAROG-u ustalić próg na amplitudę sygnału w kanałach Fp1 i Fp2).&lt;br /&gt;
# Uśredniamy wycięte sygnały o tym samym numerze wewnątrz serii.&lt;br /&gt;
# Rysujemy serie 15 uśrednionych potencjałów dla tego kanału, który wykazywał najsilniejszy potencjał w pierwszej wersji eksperymentu. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Eksperyment 2: rejestracja i analiza potencjału P3 ===&lt;br /&gt;
====Rejestracja ====&lt;br /&gt;
# Paradygmat: &lt;br /&gt;
#* z odległości około 40 cm badany obserwuje kwadrat, który występuje w dwóch kolorach. &lt;br /&gt;
#* Bodźce trwają 300 ms, poprzedzane punktem fiksacji wyświetlanym na 300 ms, przerwa między próbami jest losowana i wynosi od 0.8-1.2 s.  &lt;br /&gt;
#* Proporcja wystapień bodźców koloru pierwszego i drugiego wynosi 1:5.   &lt;br /&gt;
#* Zadaniem badanego jest liczenie kwadratów w rzadkim kolorze. &lt;br /&gt;
#* Wykonujemy tyle realizacji aby zarejestrować 100 powtórzeń bodźców rzadkich. &lt;br /&gt;
# Zakładamy czepek i elektrody w systemie 10-20, dbamy o to by opory pomiędzy elektrodami były poniżej 5 k&amp;amp;Omega; i różnice pomiędzy oporami różnych elektrod nie przekraczały 20%.&lt;br /&gt;
#* Elektrodę GND mocujemy w otworze czepka odpowiadającym pozycji AFz (na linii centralnej 10% w stronę nosa od elektrody Fz) &lt;br /&gt;
#* Montujemy także elektrody M1 i M2, będziemy ich używać w montażu i w czasie analizy jako referencji typu połączone uszy.&lt;br /&gt;
#* Częstość próbkowania 512 Hz.&lt;br /&gt;
&lt;br /&gt;
==== Analiza ====&lt;br /&gt;
# Filtrujemy sygnał w paśmie 1-20 Hz.&lt;br /&gt;
# Z ciągłego zapisu wycinamy fragmenty od &amp;amp;minus;300 ms do +900 ms (zero oznacza moment wystąpienia bodźca). W czasie wycinania badamy wycinane fragmenty pod względem zakresu amplitudy (wszystkie kanały powinny mieć amplitudę w granicach &amp;amp;plusmn;75 &amp;amp;mu;V) i zawartości artefaktów od mrugania (w tym celu trzeba oglądając sygnał w SVAROG-u ustalić próg na amplitudę sygnału w kanałach Fp1 i Fp2).&lt;br /&gt;
# Uśredniamy osobno realizacje dla każdego koloru kwadratu. &lt;br /&gt;
# Nakładamy na siebie na rysunkach oba typy średnich.&lt;br /&gt;
# wyznaczamy amplitudę P3 i liczymy test statystyczny pomiędzy warunkami&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- ==Ćwiczenie dodatkowe: P300 BCI==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wykorzystujemy elektrody z systemu 10-10 umieszczone nad korą wzrokową: P07, O1, O2, PO8, PO3, PO4, Pz, Cz.&lt;br /&gt;
&lt;br /&gt;
Uruchamiamy &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
obci_gui --presets eeg_workshop&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
i z guzika &amp;amp;bdquo;select amplifier&amp;amp;rdquo; wybieramy właściwy wzmacniacz.&lt;br /&gt;
&lt;br /&gt;
Do kontroli jakości sygnału możemy uruchomić Svaroga.&lt;br /&gt;
&lt;br /&gt;
Dane z kalibracji zapisują się w pliku test1 w katalogu domowym użytkownika, z labiryntu w pliku test2.&lt;br /&gt;
&lt;br /&gt;
Po zakończeniu kalibracji pojawia się napis &amp;amp;bdquo;Trwają obliczenia&amp;amp;rdquo; lub podobny. Odczekujemy kilka minut, aż skończy się peer &amp;amp;bdquo;Calibration&amp;amp;rdquo; (widoczny w obci_gui) i zamykamy okienko klawiszami Alt-F4 lub zatrzymując scenariusz guzikiem &amp;amp;bdquo;Stop&amp;amp;rdquo;. W katalogu domowym pojawi się plik z wynikami kalibracji, co pozwala na uruchomienie scenariusza &amp;amp;bdquo;labirynt&amp;amp;rdquo;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Po zebraniu danych, przed wczytaniem ich do Svaroga należy w tym samym katalogu uruchomić skrypt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
#!/usr/bin/env python&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
&lt;br /&gt;
from obci.analysis.obci_signal_processing.tags import tags_file_writer&lt;br /&gt;
from obci.analysis.obci_signal_processing.read_manager import ReadManager&lt;br /&gt;
&lt;br /&gt;
def main(): &lt;br /&gt;
	file_name = 'test1'&lt;br /&gt;
	&lt;br /&gt;
	mgr = ReadManager(&lt;br /&gt;
		file_name + '.obci.xml',&lt;br /&gt;
		file_name + '.obci.raw',&lt;br /&gt;
		file_name + '.obci.tag')&lt;br /&gt;
	&lt;br /&gt;
	tags = mgr.get_tags()&lt;br /&gt;
	for i in xrange(0, len(tags)):&lt;br /&gt;
		if tags[i]['desc']['index'] == tags[i]['desc']['target']:&lt;br /&gt;
			tags[i]['name'] = 'blink_target'&lt;br /&gt;
		else:&lt;br /&gt;
			tags[i]['name'] = 'blink'&lt;br /&gt;
			&lt;br /&gt;
	tags_writer = tags_file_writer.TagsFileWriter(file_name + '.obci.tag')&lt;br /&gt;
	for tag in tags:&lt;br /&gt;
		tags_writer.tag_received(tag)		&lt;br /&gt;
	tags_writer.finish_saving(0)	&lt;br /&gt;
 &lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Aduszyk</name></author>
		
	</entry>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=Pracownia_EEG/Potencja%C5%82y_wywo%C5%82ane&amp;diff=8980</id>
		<title>Pracownia EEG/Potencjały wywołane</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=Pracownia_EEG/Potencja%C5%82y_wywo%C5%82ane&amp;diff=8980"/>
		<updated>2022-11-08T11:13:16Z</updated>

		<summary type="html">&lt;p&gt;Aduszyk: /* Zadanie 2: rejestracje i analiza potencjałów wzrokowych */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Pracownia EEG|Pracownia EEG]] / Potencjały wywołane&lt;br /&gt;
&lt;br /&gt;
=Wstęp=&lt;br /&gt;
==Potencjały wywołane==&lt;br /&gt;
=== Wstęp ===&lt;br /&gt;
Potencjały wywołane EEG (ang. ''evoked potentials'', EP) są śladami odpowiedzi mózgu na bodźce. W przypadku MEG poprawnie mówi się o polach wywołanych (ang. ''evoked fields'', EF).&lt;br /&gt;
Zwykle reakcja ta jest mała (wyjątek stanowią [[Elektroencefalografia/Metody_analizy_sygnałów_EEG_-_analiza_w_dziedzinie_czasu |kompleksy K]]) i w zapisie pojedynczej realizacji reakcji na bodziec najczęściej niewidoczna wśród czynności pochodzącej od wielu innych procesów zachodzących w tym samym czasie w mózgu. &lt;br /&gt;
Ich wyodrębnienie z tak zwanego tła EEG/MEG, czyli manifestacji elektrycznej innych, trwających w tym samym czasie w mózgu procesów (aktywny prąd niezależny), wymaga w dniu dzisiejszym zapisu odpowiedzi na szereg powtórzeń tego samego bodźca (&amp;lt;xr id=&amp;quot;fig:EP&amp;quot;&amp;gt;rys. %i&amp;lt;/xr&amp;gt;). Pierwsze potencjały wywołane pokazał pod koniec lat 40-tych Dawson (Dawson 1947) wykonując superpozycję pojedynczych realizacji na kliszy fotograficznej.&lt;br /&gt;
Z czasem skomplikowane urządzenia analogowe zastąpione zostały przez cyfrowe uśrednianie kolejnych fragmentów EEG, zsynchronizowanych według momentu wystąpienia bodźca, łatwo realizowane za pomocą komputera.&lt;br /&gt;
&lt;br /&gt;
[[Grafika:EP.png|thumb|640px|center|&amp;lt;figure id=&amp;quot;fig:EP&amp;quot;&amp;gt;&amp;lt;/figure&amp;gt;&lt;br /&gt;
Uśrednianie potencjałów wywołanych. a) ciągły zapis EEG z wyróżnionymi momentami wystąpienia bodźca (w tym przypadku słuchowego) b) kilkadziesiąt kolejnych odcinków, wyciętych jako sekunda EEG od momentu wystąpienia kolejnych bodźców, ustawione jeden pod drugim c) uśredniony potencjał wywołany &amp;amp;mdash; widać m. in. załamek P300 ok. 300 milisekund po bodźcu]]&lt;br /&gt;
&lt;br /&gt;
Techniki te opierają się na założeniu, że zawarta w EEG odpowiedź mózgu na każdy z kolejnych bodźców jest niezmienna, a EEG odzwierciedlające pozostałe procesy traktowane jest jak nieskorelowany z nią proces stochastyczny. Zależnie od rodzaju potencjałów wywołanych, założenia te są mniej lub bardziej nieuzasadnione; podważa je choćby powszechnie znany efekt habituacji, polegający na osłabieniu późnych potencjałów wywołanych kolejnymi powtórzeniami bodźca.&lt;br /&gt;
&lt;br /&gt;
Istota potencjałów wywołanych jest przedmiotem otwartej dyskusji i dziesiątków prac, dotykających od lat podstawowych w tej dziedzinie pytań: czym jest potencjał wywołany, który widzimy w uśrednionym przebiegu? Czy naprawdę wynika z deterministycznie powtarzanej, jednakowej odpowiedzi pojawiającej się po każdym powtórzeniu bodźca niezależnie od &amp;amp;bdquo;tła&amp;amp;rdquo;, czy może wynika z reorganizacji faz tego właśnie &amp;amp;bdquo;tła&amp;amp;rdquo; EEG, czy może kombinacji tych dwóch efektów? Jest to wspaniałe pole dla zastosowań zaawansowanych metod modelowania i analizy sygnałów. W ostatnich latach powstają dziesiątki prac na ten temat, a od czasu do czasu również krytyczne artykuły wykazujące, że dotychczasowe odkrycia są raczej artefaktami stosowanych metod a nie wynikają z własności analizowanych danych (Yeung et al., 2004). Jak widać jest tu wciąż bardzo wiele do zrobienia, gdyż zrozumienie tego mechanizmu stoi na drodze do &amp;amp;bdquo;świętego Graala&amp;amp;rdquo;, którym w tej dziedzinie jest wyodrębnienie pojedynczych potencjałów wywołanych.&lt;br /&gt;
&lt;br /&gt;
Niezależnie od tego, w neurofizjologii klinicznej nazwą potencjał wywołany określa się krzywą widoczną po uśrednieniu odpowiedzi na kilkanaście do kilku tysięcy bodźców (Szelenberger 2000). Gromadzona od dziesięcioleci wiedza o behawioralnych i klinicznych korelatach potencjałów wywołanych opiera się na rozpoznawaniu w przebiegach uśrednionych tak zwanych załamków, czyli przejściowych wzrostów lub spadków potencjału (na przykład na &amp;lt;xr id=&amp;quot;fig:EP&amp;quot;&amp;gt;rys. %i&amp;lt;/xr&amp;gt; widać załamek P300). Nazwy załamków składają się zwykle z litery &amp;amp;bdquo;P&amp;amp;rdquo; (od ang. ''positive''), jeśli wychylenie jest dodatnie, lub &amp;amp;bdquo;N&amp;amp;rdquo; (od ang. ''negative''), jeśli wychylenie jest ujemne, oraz liczby. Uwaga: &lt;br /&gt;
* Nie ma niestety jednej ustalonej konwencji prezentacji potencjałów koniecznie trzeba więc zwracać uwagę na orientację wykresu, a wykonując wykres samemu - zamieszczać informację o orientacji kierunku dodatniego,gdyż kierunek dodatni może być wykresie skierowany do góry lub do dołu. &lt;br /&gt;
* Liczba następująca po N lub P określa przybliżoną liczbę milisekund od wystąpienia bodźca, czyli tak zwaną latencję. Nie można jednak ścisłego związku między tą liczbą a liczbą milisekund np. potencjał P300 w zależności od szczegółów paradygmatu doświadczalnego może wystąpić znacznie później. np. w eksperymentach językowych zdarza się że P300 występuje później niż N400 :-).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;xr id=&amp;quot;fig:zalamki&amp;quot;&amp;gt;Rys. %i&amp;lt;/xr&amp;gt; przedstawia schematycznie najważniejsze załamki rozpoznawane w potencjałach słuchowych, czyli wywoływanych bodźcem dźwiękowym. Dla potencjałów wzrokowych i somatosensorycznych istnieją podobne klasyfikacje.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Grafika:Zalamki.png|thumb|320px|right|&amp;lt;figure id=&amp;quot;fig:zalamki&amp;quot;&amp;gt;&amp;lt;/figure&amp;gt;&lt;br /&gt;
Orientacyjny schemat załamków rozpoznawanych w słuchowych potencjach wywołanych, na podstawie (Szelenberger 2000). Skala czasu logarytmiczna. Najszybsze (do 12 ms) składowe egzogenne to potencjały pniowe (BAEP), oznaczane jako fale I-VII. Litery &amp;amp;bdquo;P&amp;amp;rdquo; i &amp;amp;bdquo;N&amp;amp;rdquo; oznaczają dodatnie i ujemne wychylenia związane z dalszymi załamkami]]&lt;br /&gt;
&lt;br /&gt;
Najszybsze (czyli o najmniejszej latencji) składowe to potencjały egzogenne, odzwierciedlające wstępne fazy przekazu informacji. W potencjałach słuchowych są to potencjały pnia (ang. ''brainstem auditory evoked potentials'', BAEP), składające się z siedmiu fal występujących pomiędzy 1 a 12 ms od bodźca. Są one generowane np. w nerwie słuchowym czy pniu mózgu, i wykorzystywane w klinicznej diagnostyce integralności dróg słuchowych. Podobnie jak inne wczesne potencjały o latencjach poniżej 100 ms, są praktycznie niezależne od stanu uwagi.&lt;br /&gt;
&lt;br /&gt;
Po potencjałach o średniej latencji (między 12 a 50 ms) zaczynają się późne potencjały słuchowe (od 100 ms od podania bodźca), odzwierciedlające bardziej złożone reakcje na bodziec. Potencjały ok. 100 ms obserwowane w okolicach sensorycznych odzwierciedlają odpowiedź tejże kory na bodziec. Ich amplituda zależy od parametrów fizycznych bodźca oraz od uwagi, np. amplituda załamka N100 wzrasta w stanie skupienia uwagi czy pobudzenia emocjonalnego. Pierwszy i najpopularniejszy całkowicie endogenny załamek to P300, pojawiający się po rozpoznaniu bodźca oczekiwanego, na którym skupiamy uwagę: na przykład, jeśli w serii pojawiających się losowo liter mamy zliczać wystąpienia jednej z nich, to na średniej odpowiedzi na pojawienie się tej litery pojawi się załamek P300. Załamek ten występuje również w odpowiedzi na bodźce wyczekiwane, niespodziewane i ważne dla osoby (np. własne imię). &lt;br /&gt;
&lt;br /&gt;
=== Uśrednianie w dziedzinie czasu ===&lt;br /&gt;
Jak już było wspomniane powyżej podstawową techniką stosowaną do analizy potencjałów wywołanych jest uśrednianie wielu realizacji odpowiedzi na bodziec wyrównanych względem jakiegoś charakterystycznego zdarzenia, np. momentu podania bodźca albo momentu behawioralnej reakcji na bodziec (np. wciśnięcie przycisku). Podejście to bazuje na trzech założeniach:&lt;br /&gt;
* Reakcja jest czasowo związana z bodźcem. Tzn. w kolejnych realizacjach występuje ona zawsze z tym samym opóźnieniem.&lt;br /&gt;
* Reakcja na bodziec skutkuje zawsze pojawieniem się w sygnale składowej o stałym kształcie (mówimy o stałej morfologii).&lt;br /&gt;
* Spontaniczna czynność EEG &amp;amp;mdash; ta która nie dotyczy przetwarzania interesującego nas bodźca &amp;amp;mdash; jest niezależnym, stacjonarnym szumem o średniej zero.&lt;br /&gt;
&lt;br /&gt;
Zgodnie z powyższymi założeniami mierzony w ''i''-tej realizacji sygnał można wyrazić jako:&lt;br /&gt;
: &amp;lt;math&amp;gt;x_i(t) = s(t) + n_i(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
Uśrednianie po ''N'' realizacjach daje:&lt;br /&gt;
: &amp;lt;math&amp;gt;\bar x (t) = \frac{1}{N} \sum_{i=1}^N x_i(t) = \frac{1}{N} \left(N s(t) + \sum_{i=1}^N n_i(t) \right) &amp;lt;/math&amp;gt;&lt;br /&gt;
Wartość oczekiwana średniego sygnału wynosi:&lt;br /&gt;
: &amp;lt;math&amp;gt;\mathrm{E}\left[ \bar x(t) \right] = s(t) &amp;lt;/math&amp;gt;&lt;br /&gt;
gdyż dla szumu o średniej zero mamy:&lt;br /&gt;
: &amp;lt;math&amp;gt;\mathrm{E}\left[\frac{1}{N} \sum_{i=1}^N n_i(t)\right] = 0&amp;lt;/math&amp;gt;.&lt;br /&gt;
Wariancja &amp;lt;math&amp;gt;\bar x(t)&amp;lt;/math&amp;gt; wynosi:&lt;br /&gt;
: &amp;lt;math&amp;gt;\sigma^2_{\bar x(t)} = \mathrm{E} \left[  \left( \frac{1}{N} \sum_{i=1}^N n_i(t)\right)^2 \right] \approx \frac{1}{N} \sigma^2_{n(t)}&amp;lt;/math&amp;gt;&lt;br /&gt;
gdyż &amp;lt;math&amp;gt;s(t)&amp;lt;/math&amp;gt; jest deterministyczne. &lt;br /&gt;
&lt;br /&gt;
Dla potencjałów pojawiających się w pierwszych kilkudziesięciu milisekundach po bodźcu model ten można uznać za poprawny, gdyż wykazują one zależność głównie od parametrów fizycznych bodźca. Dla późniejszych składowych staje się on coraz bardziej wątpliwy ze względu na występujące korelacje ze stanem (np. uwagi) badanego.&lt;br /&gt;
&lt;br /&gt;
Dla późniejszych składowych można by postulować bardziej ogólną wersję modelu potencjału wywołanego:&lt;br /&gt;
: &amp;lt;math&amp;gt;x_i(t) = s_i(t) + n_i(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
Ten model uwidacznia, że do opisu potencjału wywołanego potrzebna jest nie tylko średnia, ale i wyższe momenty rozkładu (np. drugi moment centralny czyli wariancja).&lt;br /&gt;
&lt;br /&gt;
====Wariancja w przypadku szumu skorelowanego ====&lt;br /&gt;
W poprzednim paragrafie pokazaliśmy, że w przypadku niezależnego szumu wariancja uśrednionego sygnału (w danej chwili czasu) maleje jak  &amp;lt;math&amp;gt;\frac{1}{N}&amp;lt;/math&amp;gt;. Jednak w przypadku gdy kolejne próbki szumu są skorelowane (np. występuje silna aktywność rytmiczna alfa) sytuacja się komplikuje. Intuicyjnie łatwo możemy to sobie wyobrazić w granicznym przypadku. Załóżmy, że tło dla  potencjałów o stałej morfologii   stanowi sinusoida. Jeśli będziemy podawać bodźce w odstępach będących wielokrotnością okresu tej sinusoidy to w uśrednianych fragmentach sygnału owa sinusoida jest tak samo powtarzalna jak badany potencjał i uśrednianie nie prowadzi do poprawy stosunku amplitudy sygnału do amplitudy tła. &lt;br /&gt;
&lt;br /&gt;
Stopień zależności pomiędzy próbkami można zmierzyć przy pomocy funkcji autokorelacji. &lt;br /&gt;
Jeśli funkcję autokorelacji przybliżymy przez:&lt;br /&gt;
: &amp;lt;math&amp;gt;R_{xx}(\tau) = \sigma^2 \exp(-\beta |\tau|) \cos(2 \pi f_0 \tau)&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\sigma^2&amp;lt;/math&amp;gt; jest wariancją szumu, &amp;lt;math&amp;gt;f_0&amp;lt;/math&amp;gt; jest średnią częstością aktywności rytmicznej, &amp;lt;math&amp;gt;\beta/ \pi&amp;lt;/math&amp;gt; jest szerokością pasma tej czynności, zaś &amp;lt;math&amp;gt;\tau&amp;lt;/math&amp;gt; opóźnieniem, to wariancję potencjału wywołanego można wyrazić jako&amp;lt;!-- \cite{Spekreijse_1976}--&amp;gt;:&lt;br /&gt;
: &amp;lt;math&amp;gt;\sigma^2_{\bar x(t)} = \frac{\sigma^2}{N} \left[ \frac{1-\exp(-2 \beta T)}{1 - 2 \exp(- \beta T) \cos(2 \pi f_0 T) +\exp(-2 \beta T)} \right]&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; jest odstępem między bodźcami. &lt;br /&gt;
Widać stąd, że obecność czynności rytmicznej w tle wpływa na stosunek sygnału do szumu. Z powyższego równania widać, że stosunek wariancji dąży do &amp;lt;math&amp;gt;\frac{\sigma^2}{N}&amp;lt;/math&amp;gt; gdy &amp;lt;math&amp;gt;\beta T&amp;lt;/math&amp;gt; staje się duże.  &lt;br /&gt;
&lt;br /&gt;
Periodyczna stymulacja może ponadto prowadzić do wzbudzenia czynności rytmicznej o częstości równej częstości pobudzania bądź jej harmonicznej.&lt;br /&gt;
&lt;br /&gt;
===Wariancja latencji===&lt;br /&gt;
&lt;br /&gt;
Jedną z form zmienności potencjału wywołanego w pojedynczych realizacjach jest wariancja latencji. &lt;br /&gt;
[[Grafika:Wariancja_latencji.png|thumb|500px|right|&lt;br /&gt;
Czerwona linia: Uśrednianie 100 potencjałów wywołanych o latncjach z rozkładu normalnego N(300,30 ), Niebieskie linie: przykładowe pojedyncze realizacje wzięte do średniej]]&amp;lt;!--# -*- coding: utf-8 -*-&lt;br /&gt;
from __future__ import division&lt;br /&gt;
import numpy as np&lt;br /&gt;
from matplotlib.pyplot import plot, show ,subplot, figure, title, xlabel, ylabel, ylim&lt;br /&gt;
 &lt;br /&gt;
def fun(t,lat=100):&lt;br /&gt;
    return np.exp(-(t-lat)**2/(2*30**2))&lt;br /&gt;
Fs = 1&lt;br /&gt;
N = 100&lt;br /&gt;
t = np.arange(0,700)&lt;br /&gt;
f = np.zeros((N,700))&lt;br /&gt;
f_sr = np.zeros(t.shape)&lt;br /&gt;
for i in range(N):&lt;br /&gt;
    f[i,:] = fun(t,lat = 300 + 30* np.random.randn())&lt;br /&gt;
for i in range(3):&lt;br /&gt;
    plot(t,f[i,:], 'b')&lt;br /&gt;
plot(t,f.mean(0),'r')&lt;br /&gt;
show()--&amp;gt;&lt;br /&gt;
Zmienność latencji prowadzi do:&lt;br /&gt;
* zmniejszenia amplitudy &amp;lt;math&amp;gt;\bar x&amp;lt;/math&amp;gt;&lt;br /&gt;
* wzrostu rozciągłości czasowej załamka&lt;br /&gt;
&lt;br /&gt;
O tych konsekwencjach zmienności latencji należy w szczególności pamiętać porównując średnie potencjały uzyskane w różnych warunkach eksperymentalnych. Gdy zauważymy, że średnie potencjały różnią się amplitudą należy rozważyć możliwość, że w istocie warunki eksperymentalne wpływają na różnice w wariancji latencji. &lt;br /&gt;
&lt;br /&gt;
Naturalne jest, że zmienność latencji jest bardziej widoczna w przypadku załamków trwających krótko niż w przypadku załamków trwających długo. Wariancja latencji rożnie wraz z jej wartością, stąd wśród późnych składowych potencjałów wywołanych nie obserwuje się komponentów krótkotrwałych.&lt;br /&gt;
&amp;lt;!--====Uśrednianie metodą Woody'ego ====&lt;br /&gt;
&lt;br /&gt;
Model potencjału ze zmienną latencją i sposób na jego efektywniejsze uśrednianie zaproponował Woody (1967). Model ten zakłada, że w każdej realizacji występuje komponent addytywny &amp;lt;math&amp;gt;s_i(t)\;&amp;lt;/math&amp;gt;, który co do kształtu jest stały, a pomiędzy realizacjami różni się tylko latencją:&lt;br /&gt;
: &amp;lt;math&amp;gt; s_i(t) = s(t +\Delta t_i)\;&amp;lt;/math&amp;gt;&lt;br /&gt;
Woody zaproponował aby &amp;lt;math&amp;gt;\Delta t_i\;&amp;lt;/math&amp;gt; szacować na podstawie maksimum funkcji korelacji wzajemnej pomiędzy ''i''-tą realizacją a wzorcem. W pierwszym kroku wzorcem jest średni potencjał uzyskany przez proste uśrednienie realizacji.  Następnie w sposób iteracyjny dokonuje się:&lt;br /&gt;
* poprawek w wyrównaniu poszczególnych realizacji,&lt;br /&gt;
* obliczenia nowego wzorca poprzez uśrednienie realizacji po korekcie wyrównania,&lt;br /&gt;
* obliczenia nowych poprawek do wyrównania realizacji.--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Habituacja ===&lt;br /&gt;
Zmienność w odpowiedziach na kolejno występujące po sobie bodźce można podzielić na komponent stochastyczny i deterministyczny. Komponent deterministyczny odzwierciedla zmianę czułości  układu nerwowego  na kolejne bodźce. Nowy bodziec często wywołuje reakcje pobudzenia widoczną w wielu parametrach takich jak przewodnictwo skóry, rytm serca i reaktywność kory mózgowej. Powszechnie obserwowanym zjawiskiem jest spadek reaktywności na powtarzające się bodźce zwany habituacją. Niekiedy obserwuje się także zjawisko przeciwne &amp;amp;mdash; wzrost reaktywności na bodziec &amp;amp;mdash; zwane sensytyzacją. &lt;br /&gt;
&lt;br /&gt;
Klasycznym sposobem na badanie tych zjawisk w potencjałach wywołanych jest uśrednianie w podzbiorach lub  uśrednianie blokowe. Wymaga ono  zmiany paradygmatu rejestracji danych. Załóżmy, że interesującym nas bodźcem jest błysk światła. Chcemy zaobserwować ewentualne zmiany amplitudy i latencji w ciągu 100 potencjałów będących reakcją na błysk powtarzający się co 500 ms.&lt;br /&gt;
====Uśrednianie w podzbiorach ====&lt;br /&gt;
W metodzie tej musimy założyć, że proces habituacji jest powolny, tzn. zmiany pomiędzy kolejnymi reakcjami są bardzo małe. W takim przypadku możemy podzielić długą serię bodźców na ciąg pod-serii i uśrednienie przeprowadzić dla każdej pod-serii osobno.&lt;br /&gt;
[[Plik:Usrednianie_podzbiory.svg‎|640px|thumb|center|Ilustracja uśredniania w podzbiorach]]&lt;br /&gt;
&lt;br /&gt;
====Uśrednianie blokowe====&lt;br /&gt;
W tym celu eksperyment wykonujemy w wielu seriach. Jedna seria składa się ze 100 błysków powtarzanych co 500 ms.  Po serii następuje przerwa trwająca np. 5 s (długość przerwy wyraża nasze oszacowanie czasu potrzebnego na zanik habituacji). Po przerwie seria jest powtarzana. Powtórzeń serii wykonujemy ''N''.&lt;br /&gt;
Następnie uśredniamy fragmenty sygnałów odpowiadające sobie w kolejnych seriach. &lt;br /&gt;
&lt;br /&gt;
W tym paradygmacie zakładamy, że każda seria rejestrowana jest w tych samych warunkach. Zaniedbujemy efekty związane ze zmęczeniem i zmianami w np. stopniu koncentracji badanego.&lt;br /&gt;
[[Plik:Usrednianie blokowe.svg|Usrednianie blokowe.svg|640px|thumb|center|Ilustracja uśredniania w blokach]]&lt;br /&gt;
&lt;br /&gt;
===Załamki w krzywej potencjału wywołanego vs ukryte komponenty===&lt;br /&gt;
Komponenta potencjału wywołanego to bardzo ważne ale jednocześnie źle określone pojęcie. Krzywa otrzymana w wyniku uśredniania potencjałów wywołanych przedstawia serię załamków dodatnich i ujemnych, ale trzeba być świadomym, że ten przebieg napięcia rejestrowany przez elektrody przedstawia tak naprawdę sumę potencjałów pochodzących od wielu dość niezależnie działających źródeł w mózgu. Przyczynek pochodzący od jednego funkcjonalnego źródła będziemy określać jako komponentę. &lt;br /&gt;
&lt;br /&gt;
Komentarza wymaga też pojęcie źródła funkcjonalnego. Czynność elektryczną synchronicznie działających neuronów piramidalnych w określonym fragmencie kory mózgowej z pewnej odległości można przybliżyć potencjałem dipola prądowego. Taki aktywny fragment kory stanowi źródło dające przyczynek do mierzonego na powierzchni głowy potencjału. W najprostszej sytuacji taki przyczynek może być obserwowany jako komponenta. Mózg jest jednak obiektem niezwykle złożonym i gęsto połączonym. Wiele obszarów korowych może być funkcjonalnie połączonych i aktywowanych synchronicznie w celu realizacji określonego zadania &amp;amp;mdash; o takim funkcjonalnym zespole też możemy myśleć jako o pojedynczym źródle, choć może ono mieć złożoną strukturę przestrzenną. Często zatem myślimy o komponentach ukrytych potencjału wywołanego jako o aktywności takich funkcjonalnych zespołów. &lt;br /&gt;
&lt;br /&gt;
Po tym wstępie widać już chyba, że do zrozumienia co dzieje się w czasie reakcji na bodziec, którą obserwujemy w potencjale wywołanym, bardziej pożądane byłoby badanie komponent ukrytych niż poszczególnych załamków krzywej potencjału wywołanego, która stanowi ważoną sumę owych komponentów. Zanim przejdziemy do omówienia technik służących &amp;amp;bdquo;wyłuskiwaniu&amp;amp;rdquo; komponent prześledźmy kilka symulacji i wnioski z nich płynące.&lt;br /&gt;
&lt;br /&gt;
==== Załamki i komponenty nie są tym samym.====&lt;br /&gt;
Tę samą krzywą można otrzymać na nieskończenie wiele sposobów  przez sumowanie rożnych kombinacji domniemanych komponentów. Przykładowy rysunek pokazuje, jak tę samą krzywą można złożyć z dwóch rożnych zestawów komponentów (kod wytwarzający przykładową symulację pokazany jest poniżej).&lt;br /&gt;
[[Plik:Sumowanie_komponentow1.png|center|thumb|600px| Panel a) przedstawia hipotetyczną krzywą ERP, panel b) jedna z możliwych dekompozycji sygnału w panelu a), panel c) inna możliwa dekompozycja sygnału z panelu a) ]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
from __future__ import division&lt;br /&gt;
import numpy as np&lt;br /&gt;
from matplotlib.pyplot import plot, show ,subplot, figure, title, xlabel, ylabel, ylim&lt;br /&gt;
&lt;br /&gt;
Fs = 1&lt;br /&gt;
t = np.arange(0,700)&lt;br /&gt;
&lt;br /&gt;
C1 = np.exp(-(t-100)**2/(2*30**2))&lt;br /&gt;
C2 = np.exp(-(t-200)**2/(2*50**2))&lt;br /&gt;
C3 = np.exp(-(t-350)**2/(2*100**2))&lt;br /&gt;
ERP = 0.5*C1-C2+C3&lt;br /&gt;
&lt;br /&gt;
C2p = np.concatenate((C2[0:200], np.ones(30), C2[200:700-30] ))&lt;br /&gt;
C3p = ERP - 0.5*C1 + C2p&lt;br /&gt;
ERP_v2 = 0.5*C1-C2p+C3p&lt;br /&gt;
&lt;br /&gt;
subplot(3,1,1)&lt;br /&gt;
plot(t,ERP, t[::10],ERP_v2[::10],'g.')&lt;br /&gt;
ylabel('a)',rotation='horizontal')&lt;br /&gt;
ylim([-1, 1.5])&lt;br /&gt;
&lt;br /&gt;
subplot(3,1,2)&lt;br /&gt;
plot(t,0.5*C1,t,-C2,t,C3)&lt;br /&gt;
ylabel('b)',rotation='horizontal')&lt;br /&gt;
ylim([-1, 1.5])&lt;br /&gt;
&lt;br /&gt;
subplot(3,1,3)&lt;br /&gt;
plot(t,0.5*C1,t,-C2p,t,C3p)&lt;br /&gt;
ylabel('c)',rotation='horizontal')&lt;br /&gt;
ylim([-1, 1.5])&lt;br /&gt;
&lt;br /&gt;
show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Zmiana jednej komponenty może powodować zmiany w amplitudzie i latencji więcej niż jednego załamka.====&lt;br /&gt;
Poniższy rysunek przedstawia sytuację gdy zmiana amplitudy jednego komponentu może znacząco wpływać na amplitudę i latencję innych załamków.&lt;br /&gt;
&lt;br /&gt;
[[Plik:Sumowanie_komponentow2.png|center|thumb|768px| Panel a) przedstawia dwie hipotetyczne krzywe ERP, panel b) panel b i c komponenty z których powstały owe krzywe. Zmiana amplitudy komponentu oznaczonego kolorem powoduje zmianę amplitudy oznaczonych załamków ale także zmianę latencji wcześniejszego załamka. ]]&lt;br /&gt;
Poniżej kod odtwarzający powyższy przykład:&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
from __future__ import division&lt;br /&gt;
import numpy as np&lt;br /&gt;
from matplotlib.pyplot import plot, show, subplot, figure, title, xlabel, ylabel, ylim&lt;br /&gt;
&lt;br /&gt;
Fs = 1&lt;br /&gt;
t = np.arange(0,700)&lt;br /&gt;
&lt;br /&gt;
C1 = np.exp(-(t-100)**2/(2*30**2))&lt;br /&gt;
C2 = np.exp(-(t-200)**2/(2*50**2))&lt;br /&gt;
C3 = np.exp(-(t-350)**2/(2*100**2))&lt;br /&gt;
ERP1 = 0.5*C1-C2+C3&lt;br /&gt;
ERP2 = 0.5*C1-C2+1.5*C3&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
subplot(3,1,1)&lt;br /&gt;
plot(t,ERP1,'b', t,ERP2,'g')&lt;br /&gt;
plot(t[np.argmin(ERP1)],np.min(ERP1),'r.' )&lt;br /&gt;
plot(t[np.argmax(ERP1)],np.max(ERP1),'m.' )&lt;br /&gt;
plot(t[np.argmin(ERP2)],np.min(ERP2),'r.' )&lt;br /&gt;
plot(t[np.argmax(ERP2)],np.max(ERP2),'m.' )&lt;br /&gt;
&lt;br /&gt;
ylabel('a)',rotation='horizontal')&lt;br /&gt;
ylim([-1, 1.6])&lt;br /&gt;
&lt;br /&gt;
subplot(3,1,2)&lt;br /&gt;
plot(t,0.5*C1,'k',t,-C2,'k',t,C3,'b')&lt;br /&gt;
ylabel('b)',rotation='horizontal')&lt;br /&gt;
ylim([-1, 1.6])&lt;br /&gt;
&lt;br /&gt;
subplot(3,1,3)&lt;br /&gt;
plot(t,0.5*C1,'k',t,-C2,'k',t,1.5*C3,'g')&lt;br /&gt;
ylabel('c)',rotation='horizontal')&lt;br /&gt;
ylim([-1, 1.6])&lt;br /&gt;
&lt;br /&gt;
show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Instrukcje do ćwiczeń =&lt;br /&gt;
&lt;br /&gt;
==Zadanie 1: uśrednianie symulowanych sygnałów==&lt;br /&gt;
w tym ćwiczeniu chcemy pokazać efekty:&lt;br /&gt;
# uśredniania sygnałów związanych fazowo z bodźcem i nieskorelowanych z bodźcem / wpływ liczby realizacji,&lt;br /&gt;
# uśredniania sygnałów z fluktuacją latencji,&lt;br /&gt;
# wpływ filtrów o różnych funkcjach odpowiedzi impulsowej na morfologię uśrednionego potencjału.&lt;br /&gt;
&lt;br /&gt;
===Sygnały testowe===&lt;br /&gt;
Proszę zaimplementować funkcje generujące następujące przebiegi czasowe (oznaczenia: ''F&amp;lt;sub&amp;gt;s&amp;lt;/sub&amp;gt;'' &amp;amp;mdash; częstość próbkowania, ''T'' &amp;amp;mdash; czas trwania w sekundach, [[%C4%86wiczenia_1#Sygna.C5.82y_testowe|analogicznie do tego]]):&lt;br /&gt;
* sinusoida o zadanej częstości ''f'' i fazie &amp;lt;math&amp;gt;\phi&amp;lt;/math&amp;gt;: &amp;lt;tt&amp;gt;y = sin(f, phi, Fs, T)&amp;lt;/tt&amp;gt;,&lt;br /&gt;
* funkcja Gaussa o zadanym położeniu i szerokości &amp;lt;tt&amp;gt;y = g_1(t0, sigma, Fs, T) &amp;lt;/tt&amp;gt;&lt;br /&gt;
: &amp;lt;math&amp;gt;g_1(t) = \exp\left(-\frac{(t-t_0)^2}{2 \sigma^2}\right)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* pochodną funkcji Gaussa o zadanym położeniu i szerokości &amp;lt;tt&amp;gt;y = g_2(t0, sigma, Fs, T)&amp;lt;/tt&amp;gt;,&lt;br /&gt;
* połowę funkcji Gaussa o zadanym położeniu i szerokości &amp;lt;tt&amp;gt;y = g_3(t0, sigma, Fs, T)&amp;lt;/tt&amp;gt;,&lt;br /&gt;
: &amp;lt;math&amp;gt;g_{3}(t) = \left\{ &lt;br /&gt;
\begin{array}{lll}&lt;br /&gt;
0 &amp;amp; \mathrm{dla}&amp;amp; t&amp;lt;t_0 \\&lt;br /&gt;
\exp\left(-\frac{(t-t_0)^2}{2 \sigma^2}\right)&amp;amp; \mathrm{dla}&amp;amp; t \ge t_0  &lt;br /&gt;
\end{array}&lt;br /&gt;
\right. &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
W dalszych zadaniach tej sekcji przyjmiemy:&lt;br /&gt;
* ''T'' = 1 s,&lt;br /&gt;
* ''F&amp;lt;sub&amp;gt;s&amp;lt;/sub&amp;gt;'' = 128 Hz,&lt;br /&gt;
* ''t''&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; = 0,3 s,&lt;br /&gt;
* &amp;amp;sigma; = 0,02 s.&lt;br /&gt;
&lt;br /&gt;
===Uśrednianie w modelu addytywnym: sygnał + szum===&lt;br /&gt;
Dla funkcji &amp;lt;math&amp;gt;g_1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;g_2&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;g_3&amp;lt;/math&amp;gt;  wykonaj ''N'' symulacji sygnału opisanego daną funkcją z dodanym szumem gaussowskim (&amp;lt;tt&amp;gt;numpy.random.randn&amp;lt;/tt&amp;gt;). Zaobserwuj zmianę wariancji uśrednianego sygnału wraz z ''N''.&lt;br /&gt;
&lt;br /&gt;
===Uśrednianie w modelu addytywnym: sygnał + szum + niezależna czynność rytmiczna===&lt;br /&gt;
Powtórz poprzednie symulacje dokładając w każdej realizacji sinusoidę o losowo wybranej fazie. Symulacje wykonaj dla różnych częstości sinusoidy, takich których połówka okresu zbliżona jest do szerokości funkcji Gaussa, oraz znacząco od niej różnych.&lt;br /&gt;
&lt;br /&gt;
===Uśrednianie w modelu z resetem fazy===&lt;br /&gt;
Zbuduj sygnał składający się z dwóch fragmentów sinusoidy o częstości ''f'': &lt;br /&gt;
* pierwszy fragment ma losową fazę,&lt;br /&gt;
* drugi fragment ma fazę równą 0.&lt;br /&gt;
Wykonaj ''N'' realizacji takiego sygnału, przy czym każda realizacja ma częstość losowaną z rozkładu Gaussa o średniej 10 i pewnej wariancji (czyli &amp;lt;math&amp;gt;f \in \mathrm{N}(10,\sigma)&amp;lt;/math&amp;gt;). &lt;br /&gt;
Uśrednij otrzymane realizacje. Zaobserwuj zależność średniej od liczby uśrednianych realizacji i od wariancji częstości.&lt;br /&gt;
&lt;br /&gt;
===Uśrednianie potencjału z fluktuacją latencji===&lt;br /&gt;
Wygeneruj sygnały składające się z funkcji &amp;lt;math&amp;gt;g_1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;g_2&amp;lt;/math&amp;gt; albo &amp;lt;math&amp;gt;g_3&amp;lt;/math&amp;gt; z fluktuującą latencją, tzn. z wartością &amp;lt;math&amp;gt;t_0&amp;lt;/math&amp;gt; pochodzącą z jakiegoś rozkładu prawdopodobieństwa. U nas dla ustalenia uwagi niech będzie to rozkład Gaussa. Wykonaj zestaw symulacji obrazujący zależność od liczby realizacji i od wielkości fluktuacji, mierzonej przez wariancję rozkładu. Czy jest związek pomiędzy wariancją fluktuacji &amp;lt;math&amp;gt;t_0&amp;lt;/math&amp;gt; a szerokością załamków?&lt;br /&gt;
&lt;br /&gt;
===Wpływ filtrów===&lt;br /&gt;
# Zaprojektuj następujące filtry (przyjmij częstość próbkowania 128 Hz):&lt;br /&gt;
#* dolnoprzepustowy: Butterwortha z częstością odcięcia: 30, 40, 50 Hz, i rzędach od 1 do 5 (funkcja butter w module scipy.signal),&lt;br /&gt;
#* górnoprzepustowy: Butterwortha z częstością odcięcia: 0,1, 0,5, 2 i 5 Hz, i rzędach od 1 do 5,&lt;br /&gt;
#* notch: Czybyszewa II rodzaju z pasmem zaporowym ustawionym na 50 Hz, i rzędach od 1 do 3 (funkcja cheby2),&lt;br /&gt;
# Zbadaj funkcję odpowiedzi impulsowej i funkcję przenoszenia tych filtrów (w skali dB). Zaobserwuj jak długa jest odpowiedź impulsowa i jak daleko od częstości odcięcia zaburzone jest pasmo przenoszenia.&lt;br /&gt;
# Zastosuj powyższe filtry do funkcji &amp;lt;math&amp;gt;g_1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;g_2&amp;lt;/math&amp;gt; albo &amp;lt;math&amp;gt;g_3&amp;lt;/math&amp;gt;. Filtrowanie przeprowadź w jedną (lfilter) oraz w dwie strony (filtfilt). Zaobserwuj związek między zniekształceniem wprowadzanym przez filtr a funkcją odpowiedzi impulsowej filtru.&lt;br /&gt;
# W ćwiczeniu tym posłuż się symulowanymi sygnałami uzyskanymi z modelu addytywnego: &amp;amp;bdquo;sygnał+szum&amp;amp;rdquo;. Dla funkcji &amp;lt;math&amp;gt;g_1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;g_2&amp;lt;/math&amp;gt; albo &amp;lt;math&amp;gt;g_3&amp;lt;/math&amp;gt;  wykonaj ''N'' = 60 realizacji sygnału opisanego daną funkcją z dodanym szumem gaussowskim (&amp;lt;tt&amp;gt;numpy.random.randn&amp;lt;/tt&amp;gt;). Każdą z realizacji przefiltruj, a następnie uśrednij uzyskane sygnały.&lt;br /&gt;
&lt;br /&gt;
==Zadanie 2: rejestracje i analiza potencjałów wzrokowych==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- ===Synchronizacja występowania bodźców z sygnałem EEG===&lt;br /&gt;
&lt;br /&gt;
Rejestracja potencjałów wywołanych jest przykładem pomiaru czynności elektrycznej mózgu w odpowiedzi na określony bodziec. W przypadku tego rodzaju pomiarów konieczna jest synchronizacja momentu wystąpienia bodźca z sygnałem EEG. Wzmacniacze do pomiaru czynności elektrycznej mózgu wyposażone są w specjalne wejścia, na które można podawać sygnał odpowiadający pojawianiu się bodźca. Jak pamiętamy z zeszłego semestru, wejście to (jak i podawany na nie sygnał) nazywamy trigerem (ang. ''trigger'' &amp;amp;mdash; spust, cyngiel, wyzwalacz). W najprostszym przypadku, bodziec moglibyśmy wyświetlać na monitorze komputerowym, a sygnał związany z jego wystąpieniem wysyłać przez któryś z portów komputera (LPT, COM) na wzmacniacz EEG. Niestety, obecnie dostępne i popularne systemy operacyjne, takie jak Windows czy Linux nie są systemami czasu rzeczywistego (http://pl.wikipedia.org/wiki/System_operacyjny_czasu_rzeczywistego). Od momentu wyświetlania bodźca na ekranie, do pojawiania się sygnału odpowiednim porcie komputerowym może upłynąć kilkadziesiąt milisekund i co gorsza czas ten zwykle jest losowy. W przypadku gdy wzmacniacz próbkuje sygnał z częstością 1000 Hz, moment wystąpienia bodźca możemy określić z dokładnością 1 ms, jednakże wspomniane opóźnienia w systemie operacyjnym uniemożliwiają to. Ponadto, jak dowiedzieliśmy się w rozdziale wstępnym [http://brain.fuw.edu.pl/edu-wiki/action/edit/EEG:Potencja%C5%82y_wywo%C5%82ane?section=T-1], pierwsze załamki związane z potencjałami wywołanymi pojawiają się już 10 ms po wystąpieniu bodźca. W związku z tym, losowe, rzędu kilkudziesięciu milisekund opóźnienia sygnału określającego moment pojawienia się bodźca względem jego rzeczywistego wystąpienia są niedopuszczalne.&lt;br /&gt;
Istnieją pewne techniki programowania, dzięki którym opisywane opóźnienia można zmniejszyć, jednakże są one bardzo trudne  do realizacji. Ponadto, standardowe porty komputera, takie jak LPT, czy COM zostały zaprojektowane przede wszystkim do sterowania urządzeniami zewnętrznymi, a nie ich zasilania. Przykładowo, jedna linia portu drukarkowego (LPT) może być obciążona prądem nie większym niż 5 mA, podczas gdy do zapalenie zwykłej diody LED potrzeba około 10 mA. Taki pobór prądu możliwy jest do uzyskania z portu USB, jednakże  jest on  wyjątkowo trudny do oprogramowania.  &lt;br /&gt;
W celu ominięcia powyższych niedogodności w Zakładzie Fizyki Biomedycznej UW w przeprowadzanych eksperymentach wykorzystywane są  mikrokontrolery [http://pl.wikipedia.org/wiki/Mikrokontroler], w szczególności ATmega16 i ATmega32.  Mikrokontrolery te wyposażone są w procesory o architekturze RISC [http://pl.wikipedia.org/wiki/RISC] i mocy obliczeniowej porównywalnej z szeroko stosowanym kiedyś w komputerach ZX Spectrum, Commodore, Amiga i Atari procesorem Z80. Oprócz jednostki centralnej mikrokontrolery zawierają   stałą pamięć FLASH przeznaczoną do przechowywania kodu programu, pamięć  RAM i pamięć EEPROM, liczniki 8- i 16-bitowe, komparatory, przetworniki analogowo-cyfrowe, porty wejścia/wyjścia, łącze RS232 (popularnie nazywane portem szeregowym) i układy przerwań.&lt;br /&gt;
&lt;br /&gt;
Mikrokontrolery wchodzące w skład zestawów pomiarowych na Pracowni EEG zawierają program, który umożliwia komunikację z nimi poprzez port szeregowy. Obecnie, komputery są coraz rzadziej wyposażane w porty szeregowe. Standard komunikacji RS-232, opracowany w 1962 roku  nadal jest jednak popularny i często wykorzystywany do komunikacji miedzy urządzeniami.  W celu połączenia komputera posiadającego tylko porty USB z mikrokontrolerem zastosowano przejściówkę USB/RS-232. &lt;br /&gt;
&lt;br /&gt;
Jak każde urządzenie w systemie Linuks, przejściówka USB/RS-232 widoczna jest jako plik, znajdujący się w katalogu &amp;lt;tt&amp;gt;/dev&amp;lt;/tt&amp;gt;. Nazwy plików obsługujących urządzenia szeregowe to &amp;lt;tt&amp;gt;ttyXY&amp;lt;/tt&amp;gt;, gdzie &amp;lt;tt&amp;gt;XY&amp;lt;/tt&amp;gt; to kolejny numer przydzielony do urządzenia szeregowego.&lt;br /&gt;
Do komunikacji komputera z mikroknotrolerem  w Zakładzie Fizyki Biomedycznej UW została napisana prosta biblioteka.  Jej użycie jest następujące:&lt;br /&gt;
* Po podłączeniu przejściówki USB/RS232 do komputera mikrokontrolera sprawdź jaki plik w katalogu &amp;lt;tt&amp;gt;/dev&amp;lt;/tt&amp;gt; został utworzony i przydzielony do urządzenia. &lt;br /&gt;
* Zaimportuj bibliotekę do komunikacji z mikrokontrolerem: &lt;br /&gt;
: &amp;lt;tt&amp;gt;import SerialPort as SP&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Otwórz plik powiązany z urządzeniem zewnętrznym:&lt;br /&gt;
: &amp;lt;tt&amp;gt;sp = SP.SerialPort(nazwa_pliku) &amp;lt;/tt&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
: &amp;lt;tt&amp;gt;sp.open()&amp;lt;/tt&amp;gt;&lt;br /&gt;
W naszym przypadku prawidłowa nazwa pliku to &amp;lt;tt&amp;gt;/dev/ttyUSB0&amp;lt;/tt&amp;gt;.&lt;br /&gt;
* Po włączeniu zasilania mikrokontrolera, diody podłączone do niego i wykorzystywane w eksperymencie z potencjałami wywołanymi będą zapalone. Następujące polecenie zgasi obydwie diody:&lt;br /&gt;
: &amp;lt;tt&amp;gt;sp.blinkP300([0, 0])&amp;lt;/tt&amp;gt;&lt;br /&gt;
* Wydanie poniższego polecenia spowoduje, iż mikrokontroler zapali podłączoną do niego diodę numer 1 na czas 100 ms, zaś diodę numer 2 na 200 ms. Jednocześnie, w momencie włączenia jak i wyłączenia diody, sygnał z mikrokontrolera zostanie wysłany na 5-stykowe wejście AUX mikrokontrolera:&lt;br /&gt;
: &amp;lt;tt&amp;gt;sp.blinkP300([100, 200])&amp;lt;/tt&amp;gt;&lt;br /&gt;
* Jeśli chcemy zapalić tylko diodę numer dwa, np. na czas 500 ms w programie podajemy następującą instrukcję:&lt;br /&gt;
: &amp;lt;tt&amp;gt;sp.blinkP300([0, 500])&amp;lt;/tt&amp;gt;&lt;br /&gt;
* Jeśli chcemy zakończyć komunikację z mikrokontrolerem piszemy:&lt;br /&gt;
: &amp;lt;tt&amp;gt;sp.close()&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Kod biblioteki do komunikacji z mikrokontrolerem:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;!--  Kod w Pythonie 2&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# -*- coding: cp1250 -*-&lt;br /&gt;
import serial&lt;br /&gt;
import logging&lt;br /&gt;
import sys&lt;br /&gt;
import os&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def to_hex_word(a):&lt;br /&gt;
    '''encodes a decimal number hexadecimally on two bytes'''&lt;br /&gt;
    return chr(a%256) + chr(a/256)&lt;br /&gt;
&lt;br /&gt;
class SerialPort(object):&lt;br /&gt;
    def __init__(self, port_name):&lt;br /&gt;
        import serial&lt;br /&gt;
        try:&lt;br /&gt;
            self.port = serial.Serial(&lt;br /&gt;
                port=port_name,&lt;br /&gt;
                baudrate=9600,&lt;br /&gt;
                bytesize=serial.EIGHTBITS,&lt;br /&gt;
                parity=serial.PARITY_NONE,&lt;br /&gt;
                stopbits=serial.STOPBITS_ONE,&lt;br /&gt;
                xonxoff=False&lt;br /&gt;
                )&lt;br /&gt;
        except serial.SerialException as e:&lt;br /&gt;
            print(&amp;quot;Nieprawidłowa nazwa portu lub port zajęty.&amp;quot;)&lt;br /&gt;
            raise e&lt;br /&gt;
        self.close()&lt;br /&gt;
        &lt;br /&gt;
    def open(self):&lt;br /&gt;
        self.port.open()&lt;br /&gt;
&lt;br /&gt;
    def close(self):&lt;br /&gt;
        self.port.close()&lt;br /&gt;
&lt;br /&gt;
    def send(self, value):&lt;br /&gt;
        self.port.write(value)&lt;br /&gt;
                           &lt;br /&gt;
    def blinkSSVEP(self,d, p1, p2):&lt;br /&gt;
        '''&lt;br /&gt;
        d = list of frequencies;&lt;br /&gt;
        p1:p2 = ratio LED_on_time/LED_off_time&lt;br /&gt;
        if you want i-th LED to be OFF all the time send  d[i] = 0&lt;br /&gt;
        if you want i-th LED to be ON all the time send  d[i] = -1&lt;br /&gt;
        in these two cases p1 and p2 do not matter&lt;br /&gt;
        '''&lt;br /&gt;
        clock  = 62500&lt;br /&gt;
        factor = float(p1) / float(p1 + p2)&lt;br /&gt;
    &lt;br /&gt;
        str = chr(3) # 'SSVEP_RUN'&lt;br /&gt;
&lt;br /&gt;
        for i in range(len(d)):&lt;br /&gt;
            # i-th LED OFF&lt;br /&gt;
            if d[i] == 0:                       &lt;br /&gt;
                str += to_hex_word(0) + to_hex_word(255) &lt;br /&gt;
            # i-th LED ON&lt;br /&gt;
            elif d[i] == -1:&lt;br /&gt;
                str += to_hex_word(255) + to_hex_word(0)&lt;br /&gt;
                #str = 'S'&lt;br /&gt;
                # i-th LED blinks d[i] times per second&lt;br /&gt;
                # p1:p2 = on_time:off_time in one blink&lt;br /&gt;
            else:&lt;br /&gt;
                period = clock/d[i]&lt;br /&gt;
                bright = int((clock/d[i]) * factor)&lt;br /&gt;
                dark = period - bright&lt;br /&gt;
                str += to_hex_word(bright) + to_hex_word(dark)&lt;br /&gt;
&lt;br /&gt;
        self.send(str)&lt;br /&gt;
&lt;br /&gt;
    def blinkP300(self,d):&lt;br /&gt;
        clock  = 62500&lt;br /&gt;
        str = chr(4) # 'P300_RUN'&lt;br /&gt;
&lt;br /&gt;
        for i in range(len(d)):&lt;br /&gt;
            period = int(clock*d[i]/1000.0)&lt;br /&gt;
            str += to_hex_word(period)&lt;br /&gt;
            print(period)&lt;br /&gt;
&lt;br /&gt;
        self.send(str)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
--&amp;gt; &amp;lt;!-- Kod w Pythonie 3 --&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# -*- coding: cp1250 -*-&lt;br /&gt;
import serial&lt;br /&gt;
import logging&lt;br /&gt;
import sys&lt;br /&gt;
import os&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
def to_hex_word(a):&lt;br /&gt;
    '''encodes a decimal number hexadecimally on two bytes'''&lt;br /&gt;
    return a.to_bytes(2,byteorder=sys.byteorder)&lt;br /&gt;
 &lt;br /&gt;
class SerialPort(object):&lt;br /&gt;
    def __init__(self, port_name):&lt;br /&gt;
        import serial&lt;br /&gt;
        try:&lt;br /&gt;
            self.port = serial.Serial(&lt;br /&gt;
                port=port_name,&lt;br /&gt;
                baudrate=9600,&lt;br /&gt;
                bytesize=serial.EIGHTBITS,&lt;br /&gt;
                parity=serial.PARITY_NONE,&lt;br /&gt;
                stopbits=serial.STOPBITS_ONE,&lt;br /&gt;
                xonxoff=False&lt;br /&gt;
                )&lt;br /&gt;
        except serial.SerialException as e:&lt;br /&gt;
            print(&amp;quot;Nieprawidłowa nazwa portu lub port zajęty.&amp;quot;)&lt;br /&gt;
            raise e&lt;br /&gt;
        self.close()&lt;br /&gt;
 &lt;br /&gt;
    def open(self):&lt;br /&gt;
        self.port.open()&lt;br /&gt;
 &lt;br /&gt;
    def close(self):&lt;br /&gt;
        self.port.close()&lt;br /&gt;
 &lt;br /&gt;
    def send(self, value):&lt;br /&gt;
        self.port.write(value)&lt;br /&gt;
 &lt;br /&gt;
    def blinkSSVEP(self,d, p1, p2):&lt;br /&gt;
        '''&lt;br /&gt;
        d = list of frequencies;&lt;br /&gt;
        p1:p2 = ratio LED_on_time/LED_off_time&lt;br /&gt;
        if you want i-th LED to be OFF all the time send  d[i] = 0&lt;br /&gt;
        if you want i-th LED to be ON all the time send  d[i] = -1&lt;br /&gt;
        in these two cases p1 and p2 do not matter&lt;br /&gt;
        '''&lt;br /&gt;
        clock  = 62500&lt;br /&gt;
        factor = float(p1) / float(p1 + p2)&lt;br /&gt;
 &lt;br /&gt;
        str = (3).to_bytes(1,byteorder=sys.byteorder) # 'SSVEP_RUN'&lt;br /&gt;
 &lt;br /&gt;
        for i in range(len(d)):&lt;br /&gt;
            # i-th LED OFF&lt;br /&gt;
            if d[i] == 0:                       &lt;br /&gt;
                str += to_hex_word(0) + to_hex_word(255) &lt;br /&gt;
            # i-th LED ON&lt;br /&gt;
            elif d[i] == -1:&lt;br /&gt;
                str += to_hex_word(255) + to_hex_word(0)&lt;br /&gt;
                #str = 'S'&lt;br /&gt;
                # i-th LED blinks d[i] times per second&lt;br /&gt;
                # p1:p2 = on_time:off_time in one blink&lt;br /&gt;
            else:&lt;br /&gt;
                period = clock/d[i]&lt;br /&gt;
                bright = int((clock/d[i]) * factor)&lt;br /&gt;
                dark = int(period - bright)&lt;br /&gt;
                str += to_hex_word(bright) + to_hex_word(dark)&lt;br /&gt;
 &lt;br /&gt;
        self.send(str)&lt;br /&gt;
 &lt;br /&gt;
    def blinkP300(self,d):&lt;br /&gt;
        clock  = 62500&lt;br /&gt;
        str = (4).to_bytes(1,byteorder=sys.byteorder) # 'P300_RUN'&lt;br /&gt;
 &lt;br /&gt;
        for i in range(len(d)):&lt;br /&gt;
            period = int(clock*d[i]/1000.0)&lt;br /&gt;
            str += to_hex_word(period)&lt;br /&gt;
 &lt;br /&gt;
        self.send(str)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
--&amp;gt; &lt;br /&gt;
&lt;br /&gt;
===Zestaw eksperymentalny===&lt;br /&gt;
Zestaw składa się ze:&lt;br /&gt;
* wzmacniacza,&lt;br /&gt;
* stymulatora   &lt;br /&gt;
&amp;lt;!--* izolowanego galwanicznie układu generującego impulsy odpowiadające gaszeniu i zapalaniu diody,  o wartościach dopasowanych do akceptowalnych przez wejścia AUX wzmacniacza,--&amp;gt;&lt;br /&gt;
* komputera: w tym eksperymencie komputer będzie służył do zaprogramowania stymulatora i do rejestracji sygnałów.&lt;br /&gt;
&lt;br /&gt;
===Eksperyment 1. Obserwacja bodźca wzrokowego  ===&lt;br /&gt;
&amp;lt;!--Proszę zapoznać się ze standardami rejestracji wzrokowych potencjałów wywołanych [http://www.gcu.ac.uk/media/gcalwebv2/theuniversity/academicschools/sls/psytimetables/SLS%20-%20VEP_Standard_2010.pdf] --&amp;gt;&lt;br /&gt;
Proszę zapoznać się z typowym wyglądem załamków w przypadku potencjałów wzrokowych, jaki jest przedstawiony na [https://link.springer.com/article/10.1007/s10633-009-9195-4/figures/2 rysunku] (cały artykuł jest dostępny [http://link.springer.com/article/10.1007%2Fs10633-009-9195-4 tu]).&lt;br /&gt;
&amp;lt;!--[[Plik:Fig 4 VEP.jpg|thumb|320px|right|&amp;lt;figure id=&amp;quot;fig:zalamki_VEP&amp;quot;&amp;gt;&amp;lt;/figure&amp;gt;&lt;br /&gt;
&amp;lt;xr id=&amp;quot;fig:zalamki_VEP&amp;quot;&amp;gt;Rys. %i.&amp;lt;/xr&amp;gt; Schemat załamków rozpoznawanych we wzrokowych potencjach wywołanych (z pracy: J. V. Odom i in. &amp;amp;bdquo;ISCEV standard for clinical visual evoked potentials&lt;br /&gt;
(2009 update)&amp;amp;rdquo;, Doc Ophthalmol (2010), 120:111–119).]]&lt;br /&gt;
--&amp;gt; &lt;br /&gt;
&lt;br /&gt;
==== Rejestracja ====&lt;br /&gt;
* Paradygmat: z odległości około 40 cm badany obserwuje wyświetalny na ekranie biały kwadrat. Bodźce trwają 300 ms i  powtarzają się co 0.5 sekundy. Bodziec poprzedza punkt fiksacji pokazywany przez 300 ms. Natężenie bodźca ma przyjąć jedną z 4 wartości (manipulujemy jego przeźroczystością: 1, 0.7, 0.3 i 0.1, gdzie 1 oznacza brak przeźroczystości). Każda z intensywności bodźca ma pojawić się 100 razy podczas badania, bodźce podawane mają być w sposób losowy. Zadanie poprzedza krótka instrukcja, kończy podziękowanie. &lt;br /&gt;
&lt;br /&gt;
* Pomiar&lt;br /&gt;
**Zakładamy czepek i elektrody w systemie 10-20, dbamy o to by opory pomiędzy elektrodami były poniżej 10 k&amp;amp;Omega; i różnice pomiędzy oporami różnych elektrod nie przekraczały 20%. [[Plik:Glowka10-20 ERPy.svg|thumb|600px|right]]&lt;br /&gt;
** Elektrodę GND mocujemy w otworze czepka odpowiadającym pozycji AFz (na linii centralnej 10% w stronę nosa od elektrody Fz) &lt;br /&gt;
** Montujemy także elektrody M1 i M2 i FCz.&lt;br /&gt;
&lt;br /&gt;
==== Analiza ====&lt;br /&gt;
# Filtrujemy sygnał w paśmie 1-20 Hz.&lt;br /&gt;
# Z ciągłego zapisu wycinamy fragmenty od &amp;amp;minus;300 ms do +800 ms (zero oznacza moment wystąpienia bodźca). W czasie wycinania badamy wycinane fragmenty pod względem zakresu amplitudy (wszystkie kanały powinny mieć amplitudę w granicach &amp;amp;plusmn;75 &amp;amp;mu;V) i zawartości artefaktów od mrugania (w tym celu trzeba oglądając sygnał w SVAROG-u ustalić próg na amplitudę sygnału w kanałach Fp1 i Fp2).&lt;br /&gt;
# Uśredniamy wycięte sygnały.&lt;br /&gt;
# Rysujemy średni potencjał we wszystkich kanałach.&lt;br /&gt;
# Pierwszy sposób: Identyfikujemy załamki P1 i N2. Mierzymy amplitudę P1 jako różnicę między ekstremalną wartością załamka N2 a ekstremalną wartością załamka N2. &lt;br /&gt;
# Drugi sposób: Identyfikujemy załamki P1 i N2. Mierzymy amplitudę P1 w stosunku do zera. &lt;br /&gt;
#porównujemy uzyskane amplitudy w 4 warunkach za pomocą odpowiedniego testu statystycznego (porównanie warunków ze skrajnymi wartościami amplitudy - zastosuj test permutacyjny (opisany poniżej) lub test t-Studenta/nieparametryczny odpowiednik). &lt;br /&gt;
&lt;br /&gt;
**Opis testu permutacyjnego &lt;br /&gt;
Pytanie: Czy intensywność bodźca wpływa na amplitudę potencjału P1?&lt;br /&gt;
Jak stwierdzić czy amplitudy załamków P1 istotnie różnią się pomiędzy seriami?&lt;br /&gt;
&lt;br /&gt;
Musimy przeprowadzić test statystyczny. Możemy skonstruować go np. tak:&lt;br /&gt;
Mamy dwa warunki I i II. Jako statystykę przyjmiemy różnicę pomiędzy amplitudą załamka zmierzoną w serii z dwoma diodami (P2&amp;lt;sub&amp;gt;II&amp;lt;/sub&amp;gt;) a amplitudą zmierzoną w serii z jedną diodą (P2&amp;lt;sub&amp;gt;I&amp;lt;/sub&amp;gt;):&lt;br /&gt;
: ''S'' = P2&amp;lt;sub&amp;gt;II&amp;lt;/sub&amp;gt; &amp;amp;minus; P2&amp;lt;sub&amp;gt;I&amp;lt;/sub&amp;gt;&lt;br /&gt;
Postawmy hipotezę zerową, że nie ma różnicy w amplitudzie pomiędzy warunkiem II a I oraz hipotezę alternatywną, że różnica taka występuje.&lt;br /&gt;
: H&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;: ''S'' = 0&lt;br /&gt;
: H&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;: ''S'' &amp;amp;ne; 0&lt;br /&gt;
Zgodnie z H&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; dla wartości ''S'' nie ma różnicy czy realizacja została zarejestrowana w warunkach I czy II, zatem można losowo poprzypisywać numery warunków do realizacji i w ten sposób uzyskać rozkład statystyki ''S'' pod warunkiem prawdziwości H&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;, czyli obliczyć średnie potencjały dla &amp;amp;bdquo;pomieszanych&amp;amp;rdquo; tagów, wyliczyć średnie potencjały dla sztucznie wygenerowaych grup, i wyliczyć różnicę amplitud dla tych średnich, czyli wartość statystyki dla hipotezy H&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Zaimplementuj test permutacyjny zgodny z powyższą koncepcją.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- ===Wersja 2: obserwacja habituacji / uśrednianie w blokach ===&lt;br /&gt;
==== Rejestracja ====&lt;br /&gt;
# Paradygmat: &lt;br /&gt;
#* z odległości około 40 cm badany obserwuje błyski diody. &lt;br /&gt;
#* Błyski powtarzają się co 0,5 sekundy. &lt;br /&gt;
#* Rejestrujemy 60 serii po 15 błysków.  &lt;br /&gt;
#* Pomiędzy seriami badany odpoczywa około 10 sekund.&lt;br /&gt;
# Zakładamy czepek i elektrody w systemie 10-20, dbamy o to by opory pomiędzy elektrodami były poniżej 5 k&amp;amp;Omega; i różnice pomiędzy oporami różnych elektrod nie przekraczały 20%.&lt;br /&gt;
#* Elektrodę GND mocujemy w otworze czepka odpowiadającym pozycji AFz (na linii centralnej 10% w stronę nosa od elektrody Fz) &lt;br /&gt;
#* Montujemy także elektrodę FCz (na linii centralnej pomiędzy Fz a Cz), będziemy jej używać w montażu i w czasie analizy jako referencji.&lt;br /&gt;
#* Częstość próbkowania 512 Hz.&lt;br /&gt;
&lt;br /&gt;
==== Analiza ====&lt;br /&gt;
# Filtrujemy sygnał w paśmie 0,1-20 Hz.&lt;br /&gt;
# Z ciągłego zapisu wycinamy fragmenty od &amp;amp;minus;300 ms do +600 ms (zero oznacza moment wystąpienia bodźca). W czasie wycinania badamy wycinane fragmenty pod względem zakresu amplitudy (wszystkie kanały powinny mieć amplitudę w granicach &amp;amp;plusmn;75 &amp;amp;mu;V) i zawartości artefaktów od mrugania (w tym celu trzeba oglądając sygnał w SVAROG-u ustalić próg na amplitudę sygnału w kanałach Fp1 i Fp2).&lt;br /&gt;
# Uśredniamy wycięte sygnały o tym samym numerze wewnątrz serii.&lt;br /&gt;
# Rysujemy serie 15 uśrednionych potencjałów dla tego kanału, który wykazywał najsilniejszy potencjał w pierwszej wersji eksperymentu. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Eksperyment 2: rejestracja i analiza potencjału P3 ===&lt;br /&gt;
====Rejestracja ====&lt;br /&gt;
# Paradygmat: &lt;br /&gt;
#* z odległości około 40 cm badany obserwuje kwadrat, który występuje w dwóch kolorach. &lt;br /&gt;
#* Bodźce trwają 300 ms, poprzedzane punktem fiksacji wyświetlanym na 300 ms, przerwa między próbami jest losowana i wynosi od 0.8-1.2 s.  &lt;br /&gt;
#* Proporcja wystapień bodźców koloru pierwszego i drugiego wynosi 1:5.   &lt;br /&gt;
#* Zadaniem badanego jest liczenie kwadratów w rzadkim kolorze. &lt;br /&gt;
#* Wykonujemy tyle realizacji aby zarejestrować 100 powtórzeń bodźców rzadkich. &lt;br /&gt;
# Zakładamy czepek i elektrody w systemie 10-20, dbamy o to by opory pomiędzy elektrodami były poniżej 5 k&amp;amp;Omega; i różnice pomiędzy oporami różnych elektrod nie przekraczały 20%.&lt;br /&gt;
#* Elektrodę GND mocujemy w otworze czepka odpowiadającym pozycji AFz (na linii centralnej 10% w stronę nosa od elektrody Fz) &lt;br /&gt;
#* Montujemy także elektrody M1 i M2, będziemy ich używać w montażu i w czasie analizy jako referencji typu połączone uszy.&lt;br /&gt;
#* Częstość próbkowania 512 Hz.&lt;br /&gt;
&lt;br /&gt;
==== Analiza ====&lt;br /&gt;
# Filtrujemy sygnał w paśmie 1-20 Hz.&lt;br /&gt;
# Z ciągłego zapisu wycinamy fragmenty od &amp;amp;minus;300 ms do +900 ms (zero oznacza moment wystąpienia bodźca). W czasie wycinania badamy wycinane fragmenty pod względem zakresu amplitudy (wszystkie kanały powinny mieć amplitudę w granicach &amp;amp;plusmn;75 &amp;amp;mu;V) i zawartości artefaktów od mrugania (w tym celu trzeba oglądając sygnał w SVAROG-u ustalić próg na amplitudę sygnału w kanałach Fp1 i Fp2).&lt;br /&gt;
# Uśredniamy osobno realizacje dla każdego koloru kwadratu. &lt;br /&gt;
# Nakładamy na siebie na rysunkach oba typy średnich.&lt;br /&gt;
# wyznaczamy amplitudę P3 i liczymy test statystyczny pomiędzy warunkami&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- ==Ćwiczenie dodatkowe: P300 BCI==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wykorzystujemy elektrody z systemu 10-10 umieszczone nad korą wzrokową: P07, O1, O2, PO8, PO3, PO4, Pz, Cz.&lt;br /&gt;
&lt;br /&gt;
Uruchamiamy &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
obci_gui --presets eeg_workshop&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
i z guzika &amp;amp;bdquo;select amplifier&amp;amp;rdquo; wybieramy właściwy wzmacniacz.&lt;br /&gt;
&lt;br /&gt;
Do kontroli jakości sygnału możemy uruchomić Svaroga.&lt;br /&gt;
&lt;br /&gt;
Dane z kalibracji zapisują się w pliku test1 w katalogu domowym użytkownika, z labiryntu w pliku test2.&lt;br /&gt;
&lt;br /&gt;
Po zakończeniu kalibracji pojawia się napis &amp;amp;bdquo;Trwają obliczenia&amp;amp;rdquo; lub podobny. Odczekujemy kilka minut, aż skończy się peer &amp;amp;bdquo;Calibration&amp;amp;rdquo; (widoczny w obci_gui) i zamykamy okienko klawiszami Alt-F4 lub zatrzymując scenariusz guzikiem &amp;amp;bdquo;Stop&amp;amp;rdquo;. W katalogu domowym pojawi się plik z wynikami kalibracji, co pozwala na uruchomienie scenariusza &amp;amp;bdquo;labirynt&amp;amp;rdquo;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Po zebraniu danych, przed wczytaniem ich do Svaroga należy w tym samym katalogu uruchomić skrypt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
#!/usr/bin/env python&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
&lt;br /&gt;
from obci.analysis.obci_signal_processing.tags import tags_file_writer&lt;br /&gt;
from obci.analysis.obci_signal_processing.read_manager import ReadManager&lt;br /&gt;
&lt;br /&gt;
def main(): &lt;br /&gt;
	file_name = 'test1'&lt;br /&gt;
	&lt;br /&gt;
	mgr = ReadManager(&lt;br /&gt;
		file_name + '.obci.xml',&lt;br /&gt;
		file_name + '.obci.raw',&lt;br /&gt;
		file_name + '.obci.tag')&lt;br /&gt;
	&lt;br /&gt;
	tags = mgr.get_tags()&lt;br /&gt;
	for i in xrange(0, len(tags)):&lt;br /&gt;
		if tags[i]['desc']['index'] == tags[i]['desc']['target']:&lt;br /&gt;
			tags[i]['name'] = 'blink_target'&lt;br /&gt;
		else:&lt;br /&gt;
			tags[i]['name'] = 'blink'&lt;br /&gt;
			&lt;br /&gt;
	tags_writer = tags_file_writer.TagsFileWriter(file_name + '.obci.tag')&lt;br /&gt;
	for tag in tags:&lt;br /&gt;
		tags_writer.tag_received(tag)		&lt;br /&gt;
	tags_writer.finish_saving(0)	&lt;br /&gt;
 &lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Aduszyk</name></author>
		
	</entry>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=Pracownia_EEG/Potencja%C5%82y_wywo%C5%82ane&amp;diff=8979</id>
		<title>Pracownia EEG/Potencjały wywołane</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=Pracownia_EEG/Potencja%C5%82y_wywo%C5%82ane&amp;diff=8979"/>
		<updated>2022-11-08T11:12:31Z</updated>

		<summary type="html">&lt;p&gt;Aduszyk: /* Eksperyment 2: rejestracja i analiza potencjału P3 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Pracownia EEG|Pracownia EEG]] / Potencjały wywołane&lt;br /&gt;
&lt;br /&gt;
=Wstęp=&lt;br /&gt;
==Potencjały wywołane==&lt;br /&gt;
=== Wstęp ===&lt;br /&gt;
Potencjały wywołane EEG (ang. ''evoked potentials'', EP) są śladami odpowiedzi mózgu na bodźce. W przypadku MEG poprawnie mówi się o polach wywołanych (ang. ''evoked fields'', EF).&lt;br /&gt;
Zwykle reakcja ta jest mała (wyjątek stanowią [[Elektroencefalografia/Metody_analizy_sygnałów_EEG_-_analiza_w_dziedzinie_czasu |kompleksy K]]) i w zapisie pojedynczej realizacji reakcji na bodziec najczęściej niewidoczna wśród czynności pochodzącej od wielu innych procesów zachodzących w tym samym czasie w mózgu. &lt;br /&gt;
Ich wyodrębnienie z tak zwanego tła EEG/MEG, czyli manifestacji elektrycznej innych, trwających w tym samym czasie w mózgu procesów (aktywny prąd niezależny), wymaga w dniu dzisiejszym zapisu odpowiedzi na szereg powtórzeń tego samego bodźca (&amp;lt;xr id=&amp;quot;fig:EP&amp;quot;&amp;gt;rys. %i&amp;lt;/xr&amp;gt;). Pierwsze potencjały wywołane pokazał pod koniec lat 40-tych Dawson (Dawson 1947) wykonując superpozycję pojedynczych realizacji na kliszy fotograficznej.&lt;br /&gt;
Z czasem skomplikowane urządzenia analogowe zastąpione zostały przez cyfrowe uśrednianie kolejnych fragmentów EEG, zsynchronizowanych według momentu wystąpienia bodźca, łatwo realizowane za pomocą komputera.&lt;br /&gt;
&lt;br /&gt;
[[Grafika:EP.png|thumb|640px|center|&amp;lt;figure id=&amp;quot;fig:EP&amp;quot;&amp;gt;&amp;lt;/figure&amp;gt;&lt;br /&gt;
Uśrednianie potencjałów wywołanych. a) ciągły zapis EEG z wyróżnionymi momentami wystąpienia bodźca (w tym przypadku słuchowego) b) kilkadziesiąt kolejnych odcinków, wyciętych jako sekunda EEG od momentu wystąpienia kolejnych bodźców, ustawione jeden pod drugim c) uśredniony potencjał wywołany &amp;amp;mdash; widać m. in. załamek P300 ok. 300 milisekund po bodźcu]]&lt;br /&gt;
&lt;br /&gt;
Techniki te opierają się na założeniu, że zawarta w EEG odpowiedź mózgu na każdy z kolejnych bodźców jest niezmienna, a EEG odzwierciedlające pozostałe procesy traktowane jest jak nieskorelowany z nią proces stochastyczny. Zależnie od rodzaju potencjałów wywołanych, założenia te są mniej lub bardziej nieuzasadnione; podważa je choćby powszechnie znany efekt habituacji, polegający na osłabieniu późnych potencjałów wywołanych kolejnymi powtórzeniami bodźca.&lt;br /&gt;
&lt;br /&gt;
Istota potencjałów wywołanych jest przedmiotem otwartej dyskusji i dziesiątków prac, dotykających od lat podstawowych w tej dziedzinie pytań: czym jest potencjał wywołany, który widzimy w uśrednionym przebiegu? Czy naprawdę wynika z deterministycznie powtarzanej, jednakowej odpowiedzi pojawiającej się po każdym powtórzeniu bodźca niezależnie od &amp;amp;bdquo;tła&amp;amp;rdquo;, czy może wynika z reorganizacji faz tego właśnie &amp;amp;bdquo;tła&amp;amp;rdquo; EEG, czy może kombinacji tych dwóch efektów? Jest to wspaniałe pole dla zastosowań zaawansowanych metod modelowania i analizy sygnałów. W ostatnich latach powstają dziesiątki prac na ten temat, a od czasu do czasu również krytyczne artykuły wykazujące, że dotychczasowe odkrycia są raczej artefaktami stosowanych metod a nie wynikają z własności analizowanych danych (Yeung et al., 2004). Jak widać jest tu wciąż bardzo wiele do zrobienia, gdyż zrozumienie tego mechanizmu stoi na drodze do &amp;amp;bdquo;świętego Graala&amp;amp;rdquo;, którym w tej dziedzinie jest wyodrębnienie pojedynczych potencjałów wywołanych.&lt;br /&gt;
&lt;br /&gt;
Niezależnie od tego, w neurofizjologii klinicznej nazwą potencjał wywołany określa się krzywą widoczną po uśrednieniu odpowiedzi na kilkanaście do kilku tysięcy bodźców (Szelenberger 2000). Gromadzona od dziesięcioleci wiedza o behawioralnych i klinicznych korelatach potencjałów wywołanych opiera się na rozpoznawaniu w przebiegach uśrednionych tak zwanych załamków, czyli przejściowych wzrostów lub spadków potencjału (na przykład na &amp;lt;xr id=&amp;quot;fig:EP&amp;quot;&amp;gt;rys. %i&amp;lt;/xr&amp;gt; widać załamek P300). Nazwy załamków składają się zwykle z litery &amp;amp;bdquo;P&amp;amp;rdquo; (od ang. ''positive''), jeśli wychylenie jest dodatnie, lub &amp;amp;bdquo;N&amp;amp;rdquo; (od ang. ''negative''), jeśli wychylenie jest ujemne, oraz liczby. Uwaga: &lt;br /&gt;
* Nie ma niestety jednej ustalonej konwencji prezentacji potencjałów koniecznie trzeba więc zwracać uwagę na orientację wykresu, a wykonując wykres samemu - zamieszczać informację o orientacji kierunku dodatniego,gdyż kierunek dodatni może być wykresie skierowany do góry lub do dołu. &lt;br /&gt;
* Liczba następująca po N lub P określa przybliżoną liczbę milisekund od wystąpienia bodźca, czyli tak zwaną latencję. Nie można jednak ścisłego związku między tą liczbą a liczbą milisekund np. potencjał P300 w zależności od szczegółów paradygmatu doświadczalnego może wystąpić znacznie później. np. w eksperymentach językowych zdarza się że P300 występuje później niż N400 :-).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;xr id=&amp;quot;fig:zalamki&amp;quot;&amp;gt;Rys. %i&amp;lt;/xr&amp;gt; przedstawia schematycznie najważniejsze załamki rozpoznawane w potencjałach słuchowych, czyli wywoływanych bodźcem dźwiękowym. Dla potencjałów wzrokowych i somatosensorycznych istnieją podobne klasyfikacje.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Grafika:Zalamki.png|thumb|320px|right|&amp;lt;figure id=&amp;quot;fig:zalamki&amp;quot;&amp;gt;&amp;lt;/figure&amp;gt;&lt;br /&gt;
Orientacyjny schemat załamków rozpoznawanych w słuchowych potencjach wywołanych, na podstawie (Szelenberger 2000). Skala czasu logarytmiczna. Najszybsze (do 12 ms) składowe egzogenne to potencjały pniowe (BAEP), oznaczane jako fale I-VII. Litery &amp;amp;bdquo;P&amp;amp;rdquo; i &amp;amp;bdquo;N&amp;amp;rdquo; oznaczają dodatnie i ujemne wychylenia związane z dalszymi załamkami]]&lt;br /&gt;
&lt;br /&gt;
Najszybsze (czyli o najmniejszej latencji) składowe to potencjały egzogenne, odzwierciedlające wstępne fazy przekazu informacji. W potencjałach słuchowych są to potencjały pnia (ang. ''brainstem auditory evoked potentials'', BAEP), składające się z siedmiu fal występujących pomiędzy 1 a 12 ms od bodźca. Są one generowane np. w nerwie słuchowym czy pniu mózgu, i wykorzystywane w klinicznej diagnostyce integralności dróg słuchowych. Podobnie jak inne wczesne potencjały o latencjach poniżej 100 ms, są praktycznie niezależne od stanu uwagi.&lt;br /&gt;
&lt;br /&gt;
Po potencjałach o średniej latencji (między 12 a 50 ms) zaczynają się późne potencjały słuchowe (od 100 ms od podania bodźca), odzwierciedlające bardziej złożone reakcje na bodziec. Potencjały ok. 100 ms obserwowane w okolicach sensorycznych odzwierciedlają odpowiedź tejże kory na bodziec. Ich amplituda zależy od parametrów fizycznych bodźca oraz od uwagi, np. amplituda załamka N100 wzrasta w stanie skupienia uwagi czy pobudzenia emocjonalnego. Pierwszy i najpopularniejszy całkowicie endogenny załamek to P300, pojawiający się po rozpoznaniu bodźca oczekiwanego, na którym skupiamy uwagę: na przykład, jeśli w serii pojawiających się losowo liter mamy zliczać wystąpienia jednej z nich, to na średniej odpowiedzi na pojawienie się tej litery pojawi się załamek P300. Załamek ten występuje również w odpowiedzi na bodźce wyczekiwane, niespodziewane i ważne dla osoby (np. własne imię). &lt;br /&gt;
&lt;br /&gt;
=== Uśrednianie w dziedzinie czasu ===&lt;br /&gt;
Jak już było wspomniane powyżej podstawową techniką stosowaną do analizy potencjałów wywołanych jest uśrednianie wielu realizacji odpowiedzi na bodziec wyrównanych względem jakiegoś charakterystycznego zdarzenia, np. momentu podania bodźca albo momentu behawioralnej reakcji na bodziec (np. wciśnięcie przycisku). Podejście to bazuje na trzech założeniach:&lt;br /&gt;
* Reakcja jest czasowo związana z bodźcem. Tzn. w kolejnych realizacjach występuje ona zawsze z tym samym opóźnieniem.&lt;br /&gt;
* Reakcja na bodziec skutkuje zawsze pojawieniem się w sygnale składowej o stałym kształcie (mówimy o stałej morfologii).&lt;br /&gt;
* Spontaniczna czynność EEG &amp;amp;mdash; ta która nie dotyczy przetwarzania interesującego nas bodźca &amp;amp;mdash; jest niezależnym, stacjonarnym szumem o średniej zero.&lt;br /&gt;
&lt;br /&gt;
Zgodnie z powyższymi założeniami mierzony w ''i''-tej realizacji sygnał można wyrazić jako:&lt;br /&gt;
: &amp;lt;math&amp;gt;x_i(t) = s(t) + n_i(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
Uśrednianie po ''N'' realizacjach daje:&lt;br /&gt;
: &amp;lt;math&amp;gt;\bar x (t) = \frac{1}{N} \sum_{i=1}^N x_i(t) = \frac{1}{N} \left(N s(t) + \sum_{i=1}^N n_i(t) \right) &amp;lt;/math&amp;gt;&lt;br /&gt;
Wartość oczekiwana średniego sygnału wynosi:&lt;br /&gt;
: &amp;lt;math&amp;gt;\mathrm{E}\left[ \bar x(t) \right] = s(t) &amp;lt;/math&amp;gt;&lt;br /&gt;
gdyż dla szumu o średniej zero mamy:&lt;br /&gt;
: &amp;lt;math&amp;gt;\mathrm{E}\left[\frac{1}{N} \sum_{i=1}^N n_i(t)\right] = 0&amp;lt;/math&amp;gt;.&lt;br /&gt;
Wariancja &amp;lt;math&amp;gt;\bar x(t)&amp;lt;/math&amp;gt; wynosi:&lt;br /&gt;
: &amp;lt;math&amp;gt;\sigma^2_{\bar x(t)} = \mathrm{E} \left[  \left( \frac{1}{N} \sum_{i=1}^N n_i(t)\right)^2 \right] \approx \frac{1}{N} \sigma^2_{n(t)}&amp;lt;/math&amp;gt;&lt;br /&gt;
gdyż &amp;lt;math&amp;gt;s(t)&amp;lt;/math&amp;gt; jest deterministyczne. &lt;br /&gt;
&lt;br /&gt;
Dla potencjałów pojawiających się w pierwszych kilkudziesięciu milisekundach po bodźcu model ten można uznać za poprawny, gdyż wykazują one zależność głównie od parametrów fizycznych bodźca. Dla późniejszych składowych staje się on coraz bardziej wątpliwy ze względu na występujące korelacje ze stanem (np. uwagi) badanego.&lt;br /&gt;
&lt;br /&gt;
Dla późniejszych składowych można by postulować bardziej ogólną wersję modelu potencjału wywołanego:&lt;br /&gt;
: &amp;lt;math&amp;gt;x_i(t) = s_i(t) + n_i(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
Ten model uwidacznia, że do opisu potencjału wywołanego potrzebna jest nie tylko średnia, ale i wyższe momenty rozkładu (np. drugi moment centralny czyli wariancja).&lt;br /&gt;
&lt;br /&gt;
====Wariancja w przypadku szumu skorelowanego ====&lt;br /&gt;
W poprzednim paragrafie pokazaliśmy, że w przypadku niezależnego szumu wariancja uśrednionego sygnału (w danej chwili czasu) maleje jak  &amp;lt;math&amp;gt;\frac{1}{N}&amp;lt;/math&amp;gt;. Jednak w przypadku gdy kolejne próbki szumu są skorelowane (np. występuje silna aktywność rytmiczna alfa) sytuacja się komplikuje. Intuicyjnie łatwo możemy to sobie wyobrazić w granicznym przypadku. Załóżmy, że tło dla  potencjałów o stałej morfologii   stanowi sinusoida. Jeśli będziemy podawać bodźce w odstępach będących wielokrotnością okresu tej sinusoidy to w uśrednianych fragmentach sygnału owa sinusoida jest tak samo powtarzalna jak badany potencjał i uśrednianie nie prowadzi do poprawy stosunku amplitudy sygnału do amplitudy tła. &lt;br /&gt;
&lt;br /&gt;
Stopień zależności pomiędzy próbkami można zmierzyć przy pomocy funkcji autokorelacji. &lt;br /&gt;
Jeśli funkcję autokorelacji przybliżymy przez:&lt;br /&gt;
: &amp;lt;math&amp;gt;R_{xx}(\tau) = \sigma^2 \exp(-\beta |\tau|) \cos(2 \pi f_0 \tau)&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\sigma^2&amp;lt;/math&amp;gt; jest wariancją szumu, &amp;lt;math&amp;gt;f_0&amp;lt;/math&amp;gt; jest średnią częstością aktywności rytmicznej, &amp;lt;math&amp;gt;\beta/ \pi&amp;lt;/math&amp;gt; jest szerokością pasma tej czynności, zaś &amp;lt;math&amp;gt;\tau&amp;lt;/math&amp;gt; opóźnieniem, to wariancję potencjału wywołanego można wyrazić jako&amp;lt;!-- \cite{Spekreijse_1976}--&amp;gt;:&lt;br /&gt;
: &amp;lt;math&amp;gt;\sigma^2_{\bar x(t)} = \frac{\sigma^2}{N} \left[ \frac{1-\exp(-2 \beta T)}{1 - 2 \exp(- \beta T) \cos(2 \pi f_0 T) +\exp(-2 \beta T)} \right]&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; jest odstępem między bodźcami. &lt;br /&gt;
Widać stąd, że obecność czynności rytmicznej w tle wpływa na stosunek sygnału do szumu. Z powyższego równania widać, że stosunek wariancji dąży do &amp;lt;math&amp;gt;\frac{\sigma^2}{N}&amp;lt;/math&amp;gt; gdy &amp;lt;math&amp;gt;\beta T&amp;lt;/math&amp;gt; staje się duże.  &lt;br /&gt;
&lt;br /&gt;
Periodyczna stymulacja może ponadto prowadzić do wzbudzenia czynności rytmicznej o częstości równej częstości pobudzania bądź jej harmonicznej.&lt;br /&gt;
&lt;br /&gt;
===Wariancja latencji===&lt;br /&gt;
&lt;br /&gt;
Jedną z form zmienności potencjału wywołanego w pojedynczych realizacjach jest wariancja latencji. &lt;br /&gt;
[[Grafika:Wariancja_latencji.png|thumb|500px|right|&lt;br /&gt;
Czerwona linia: Uśrednianie 100 potencjałów wywołanych o latncjach z rozkładu normalnego N(300,30 ), Niebieskie linie: przykładowe pojedyncze realizacje wzięte do średniej]]&amp;lt;!--# -*- coding: utf-8 -*-&lt;br /&gt;
from __future__ import division&lt;br /&gt;
import numpy as np&lt;br /&gt;
from matplotlib.pyplot import plot, show ,subplot, figure, title, xlabel, ylabel, ylim&lt;br /&gt;
 &lt;br /&gt;
def fun(t,lat=100):&lt;br /&gt;
    return np.exp(-(t-lat)**2/(2*30**2))&lt;br /&gt;
Fs = 1&lt;br /&gt;
N = 100&lt;br /&gt;
t = np.arange(0,700)&lt;br /&gt;
f = np.zeros((N,700))&lt;br /&gt;
f_sr = np.zeros(t.shape)&lt;br /&gt;
for i in range(N):&lt;br /&gt;
    f[i,:] = fun(t,lat = 300 + 30* np.random.randn())&lt;br /&gt;
for i in range(3):&lt;br /&gt;
    plot(t,f[i,:], 'b')&lt;br /&gt;
plot(t,f.mean(0),'r')&lt;br /&gt;
show()--&amp;gt;&lt;br /&gt;
Zmienność latencji prowadzi do:&lt;br /&gt;
* zmniejszenia amplitudy &amp;lt;math&amp;gt;\bar x&amp;lt;/math&amp;gt;&lt;br /&gt;
* wzrostu rozciągłości czasowej załamka&lt;br /&gt;
&lt;br /&gt;
O tych konsekwencjach zmienności latencji należy w szczególności pamiętać porównując średnie potencjały uzyskane w różnych warunkach eksperymentalnych. Gdy zauważymy, że średnie potencjały różnią się amplitudą należy rozważyć możliwość, że w istocie warunki eksperymentalne wpływają na różnice w wariancji latencji. &lt;br /&gt;
&lt;br /&gt;
Naturalne jest, że zmienność latencji jest bardziej widoczna w przypadku załamków trwających krótko niż w przypadku załamków trwających długo. Wariancja latencji rożnie wraz z jej wartością, stąd wśród późnych składowych potencjałów wywołanych nie obserwuje się komponentów krótkotrwałych.&lt;br /&gt;
&amp;lt;!--====Uśrednianie metodą Woody'ego ====&lt;br /&gt;
&lt;br /&gt;
Model potencjału ze zmienną latencją i sposób na jego efektywniejsze uśrednianie zaproponował Woody (1967). Model ten zakłada, że w każdej realizacji występuje komponent addytywny &amp;lt;math&amp;gt;s_i(t)\;&amp;lt;/math&amp;gt;, który co do kształtu jest stały, a pomiędzy realizacjami różni się tylko latencją:&lt;br /&gt;
: &amp;lt;math&amp;gt; s_i(t) = s(t +\Delta t_i)\;&amp;lt;/math&amp;gt;&lt;br /&gt;
Woody zaproponował aby &amp;lt;math&amp;gt;\Delta t_i\;&amp;lt;/math&amp;gt; szacować na podstawie maksimum funkcji korelacji wzajemnej pomiędzy ''i''-tą realizacją a wzorcem. W pierwszym kroku wzorcem jest średni potencjał uzyskany przez proste uśrednienie realizacji.  Następnie w sposób iteracyjny dokonuje się:&lt;br /&gt;
* poprawek w wyrównaniu poszczególnych realizacji,&lt;br /&gt;
* obliczenia nowego wzorca poprzez uśrednienie realizacji po korekcie wyrównania,&lt;br /&gt;
* obliczenia nowych poprawek do wyrównania realizacji.--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Habituacja ===&lt;br /&gt;
Zmienność w odpowiedziach na kolejno występujące po sobie bodźce można podzielić na komponent stochastyczny i deterministyczny. Komponent deterministyczny odzwierciedla zmianę czułości  układu nerwowego  na kolejne bodźce. Nowy bodziec często wywołuje reakcje pobudzenia widoczną w wielu parametrach takich jak przewodnictwo skóry, rytm serca i reaktywność kory mózgowej. Powszechnie obserwowanym zjawiskiem jest spadek reaktywności na powtarzające się bodźce zwany habituacją. Niekiedy obserwuje się także zjawisko przeciwne &amp;amp;mdash; wzrost reaktywności na bodziec &amp;amp;mdash; zwane sensytyzacją. &lt;br /&gt;
&lt;br /&gt;
Klasycznym sposobem na badanie tych zjawisk w potencjałach wywołanych jest uśrednianie w podzbiorach lub  uśrednianie blokowe. Wymaga ono  zmiany paradygmatu rejestracji danych. Załóżmy, że interesującym nas bodźcem jest błysk światła. Chcemy zaobserwować ewentualne zmiany amplitudy i latencji w ciągu 100 potencjałów będących reakcją na błysk powtarzający się co 500 ms.&lt;br /&gt;
====Uśrednianie w podzbiorach ====&lt;br /&gt;
W metodzie tej musimy założyć, że proces habituacji jest powolny, tzn. zmiany pomiędzy kolejnymi reakcjami są bardzo małe. W takim przypadku możemy podzielić długą serię bodźców na ciąg pod-serii i uśrednienie przeprowadzić dla każdej pod-serii osobno.&lt;br /&gt;
[[Plik:Usrednianie_podzbiory.svg‎|640px|thumb|center|Ilustracja uśredniania w podzbiorach]]&lt;br /&gt;
&lt;br /&gt;
====Uśrednianie blokowe====&lt;br /&gt;
W tym celu eksperyment wykonujemy w wielu seriach. Jedna seria składa się ze 100 błysków powtarzanych co 500 ms.  Po serii następuje przerwa trwająca np. 5 s (długość przerwy wyraża nasze oszacowanie czasu potrzebnego na zanik habituacji). Po przerwie seria jest powtarzana. Powtórzeń serii wykonujemy ''N''.&lt;br /&gt;
Następnie uśredniamy fragmenty sygnałów odpowiadające sobie w kolejnych seriach. &lt;br /&gt;
&lt;br /&gt;
W tym paradygmacie zakładamy, że każda seria rejestrowana jest w tych samych warunkach. Zaniedbujemy efekty związane ze zmęczeniem i zmianami w np. stopniu koncentracji badanego.&lt;br /&gt;
[[Plik:Usrednianie blokowe.svg|Usrednianie blokowe.svg|640px|thumb|center|Ilustracja uśredniania w blokach]]&lt;br /&gt;
&lt;br /&gt;
===Załamki w krzywej potencjału wywołanego vs ukryte komponenty===&lt;br /&gt;
Komponenta potencjału wywołanego to bardzo ważne ale jednocześnie źle określone pojęcie. Krzywa otrzymana w wyniku uśredniania potencjałów wywołanych przedstawia serię załamków dodatnich i ujemnych, ale trzeba być świadomym, że ten przebieg napięcia rejestrowany przez elektrody przedstawia tak naprawdę sumę potencjałów pochodzących od wielu dość niezależnie działających źródeł w mózgu. Przyczynek pochodzący od jednego funkcjonalnego źródła będziemy określać jako komponentę. &lt;br /&gt;
&lt;br /&gt;
Komentarza wymaga też pojęcie źródła funkcjonalnego. Czynność elektryczną synchronicznie działających neuronów piramidalnych w określonym fragmencie kory mózgowej z pewnej odległości można przybliżyć potencjałem dipola prądowego. Taki aktywny fragment kory stanowi źródło dające przyczynek do mierzonego na powierzchni głowy potencjału. W najprostszej sytuacji taki przyczynek może być obserwowany jako komponenta. Mózg jest jednak obiektem niezwykle złożonym i gęsto połączonym. Wiele obszarów korowych może być funkcjonalnie połączonych i aktywowanych synchronicznie w celu realizacji określonego zadania &amp;amp;mdash; o takim funkcjonalnym zespole też możemy myśleć jako o pojedynczym źródle, choć może ono mieć złożoną strukturę przestrzenną. Często zatem myślimy o komponentach ukrytych potencjału wywołanego jako o aktywności takich funkcjonalnych zespołów. &lt;br /&gt;
&lt;br /&gt;
Po tym wstępie widać już chyba, że do zrozumienia co dzieje się w czasie reakcji na bodziec, którą obserwujemy w potencjale wywołanym, bardziej pożądane byłoby badanie komponent ukrytych niż poszczególnych załamków krzywej potencjału wywołanego, która stanowi ważoną sumę owych komponentów. Zanim przejdziemy do omówienia technik służących &amp;amp;bdquo;wyłuskiwaniu&amp;amp;rdquo; komponent prześledźmy kilka symulacji i wnioski z nich płynące.&lt;br /&gt;
&lt;br /&gt;
==== Załamki i komponenty nie są tym samym.====&lt;br /&gt;
Tę samą krzywą można otrzymać na nieskończenie wiele sposobów  przez sumowanie rożnych kombinacji domniemanych komponentów. Przykładowy rysunek pokazuje, jak tę samą krzywą można złożyć z dwóch rożnych zestawów komponentów (kod wytwarzający przykładową symulację pokazany jest poniżej).&lt;br /&gt;
[[Plik:Sumowanie_komponentow1.png|center|thumb|600px| Panel a) przedstawia hipotetyczną krzywą ERP, panel b) jedna z możliwych dekompozycji sygnału w panelu a), panel c) inna możliwa dekompozycja sygnału z panelu a) ]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
from __future__ import division&lt;br /&gt;
import numpy as np&lt;br /&gt;
from matplotlib.pyplot import plot, show ,subplot, figure, title, xlabel, ylabel, ylim&lt;br /&gt;
&lt;br /&gt;
Fs = 1&lt;br /&gt;
t = np.arange(0,700)&lt;br /&gt;
&lt;br /&gt;
C1 = np.exp(-(t-100)**2/(2*30**2))&lt;br /&gt;
C2 = np.exp(-(t-200)**2/(2*50**2))&lt;br /&gt;
C3 = np.exp(-(t-350)**2/(2*100**2))&lt;br /&gt;
ERP = 0.5*C1-C2+C3&lt;br /&gt;
&lt;br /&gt;
C2p = np.concatenate((C2[0:200], np.ones(30), C2[200:700-30] ))&lt;br /&gt;
C3p = ERP - 0.5*C1 + C2p&lt;br /&gt;
ERP_v2 = 0.5*C1-C2p+C3p&lt;br /&gt;
&lt;br /&gt;
subplot(3,1,1)&lt;br /&gt;
plot(t,ERP, t[::10],ERP_v2[::10],'g.')&lt;br /&gt;
ylabel('a)',rotation='horizontal')&lt;br /&gt;
ylim([-1, 1.5])&lt;br /&gt;
&lt;br /&gt;
subplot(3,1,2)&lt;br /&gt;
plot(t,0.5*C1,t,-C2,t,C3)&lt;br /&gt;
ylabel('b)',rotation='horizontal')&lt;br /&gt;
ylim([-1, 1.5])&lt;br /&gt;
&lt;br /&gt;
subplot(3,1,3)&lt;br /&gt;
plot(t,0.5*C1,t,-C2p,t,C3p)&lt;br /&gt;
ylabel('c)',rotation='horizontal')&lt;br /&gt;
ylim([-1, 1.5])&lt;br /&gt;
&lt;br /&gt;
show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Zmiana jednej komponenty może powodować zmiany w amplitudzie i latencji więcej niż jednego załamka.====&lt;br /&gt;
Poniższy rysunek przedstawia sytuację gdy zmiana amplitudy jednego komponentu może znacząco wpływać na amplitudę i latencję innych załamków.&lt;br /&gt;
&lt;br /&gt;
[[Plik:Sumowanie_komponentow2.png|center|thumb|768px| Panel a) przedstawia dwie hipotetyczne krzywe ERP, panel b) panel b i c komponenty z których powstały owe krzywe. Zmiana amplitudy komponentu oznaczonego kolorem powoduje zmianę amplitudy oznaczonych załamków ale także zmianę latencji wcześniejszego załamka. ]]&lt;br /&gt;
Poniżej kod odtwarzający powyższy przykład:&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
from __future__ import division&lt;br /&gt;
import numpy as np&lt;br /&gt;
from matplotlib.pyplot import plot, show, subplot, figure, title, xlabel, ylabel, ylim&lt;br /&gt;
&lt;br /&gt;
Fs = 1&lt;br /&gt;
t = np.arange(0,700)&lt;br /&gt;
&lt;br /&gt;
C1 = np.exp(-(t-100)**2/(2*30**2))&lt;br /&gt;
C2 = np.exp(-(t-200)**2/(2*50**2))&lt;br /&gt;
C3 = np.exp(-(t-350)**2/(2*100**2))&lt;br /&gt;
ERP1 = 0.5*C1-C2+C3&lt;br /&gt;
ERP2 = 0.5*C1-C2+1.5*C3&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
subplot(3,1,1)&lt;br /&gt;
plot(t,ERP1,'b', t,ERP2,'g')&lt;br /&gt;
plot(t[np.argmin(ERP1)],np.min(ERP1),'r.' )&lt;br /&gt;
plot(t[np.argmax(ERP1)],np.max(ERP1),'m.' )&lt;br /&gt;
plot(t[np.argmin(ERP2)],np.min(ERP2),'r.' )&lt;br /&gt;
plot(t[np.argmax(ERP2)],np.max(ERP2),'m.' )&lt;br /&gt;
&lt;br /&gt;
ylabel('a)',rotation='horizontal')&lt;br /&gt;
ylim([-1, 1.6])&lt;br /&gt;
&lt;br /&gt;
subplot(3,1,2)&lt;br /&gt;
plot(t,0.5*C1,'k',t,-C2,'k',t,C3,'b')&lt;br /&gt;
ylabel('b)',rotation='horizontal')&lt;br /&gt;
ylim([-1, 1.6])&lt;br /&gt;
&lt;br /&gt;
subplot(3,1,3)&lt;br /&gt;
plot(t,0.5*C1,'k',t,-C2,'k',t,1.5*C3,'g')&lt;br /&gt;
ylabel('c)',rotation='horizontal')&lt;br /&gt;
ylim([-1, 1.6])&lt;br /&gt;
&lt;br /&gt;
show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Instrukcje do ćwiczeń =&lt;br /&gt;
&lt;br /&gt;
==Zadanie 1: uśrednianie symulowanych sygnałów==&lt;br /&gt;
w tym ćwiczeniu chcemy pokazać efekty:&lt;br /&gt;
# uśredniania sygnałów związanych fazowo z bodźcem i nieskorelowanych z bodźcem / wpływ liczby realizacji,&lt;br /&gt;
# uśredniania sygnałów z fluktuacją latencji,&lt;br /&gt;
# wpływ filtrów o różnych funkcjach odpowiedzi impulsowej na morfologię uśrednionego potencjału.&lt;br /&gt;
&lt;br /&gt;
===Sygnały testowe===&lt;br /&gt;
Proszę zaimplementować funkcje generujące następujące przebiegi czasowe (oznaczenia: ''F&amp;lt;sub&amp;gt;s&amp;lt;/sub&amp;gt;'' &amp;amp;mdash; częstość próbkowania, ''T'' &amp;amp;mdash; czas trwania w sekundach, [[%C4%86wiczenia_1#Sygna.C5.82y_testowe|analogicznie do tego]]):&lt;br /&gt;
* sinusoida o zadanej częstości ''f'' i fazie &amp;lt;math&amp;gt;\phi&amp;lt;/math&amp;gt;: &amp;lt;tt&amp;gt;y = sin(f, phi, Fs, T)&amp;lt;/tt&amp;gt;,&lt;br /&gt;
* funkcja Gaussa o zadanym położeniu i szerokości &amp;lt;tt&amp;gt;y = g_1(t0, sigma, Fs, T) &amp;lt;/tt&amp;gt;&lt;br /&gt;
: &amp;lt;math&amp;gt;g_1(t) = \exp\left(-\frac{(t-t_0)^2}{2 \sigma^2}\right)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* pochodną funkcji Gaussa o zadanym położeniu i szerokości &amp;lt;tt&amp;gt;y = g_2(t0, sigma, Fs, T)&amp;lt;/tt&amp;gt;,&lt;br /&gt;
* połowę funkcji Gaussa o zadanym położeniu i szerokości &amp;lt;tt&amp;gt;y = g_3(t0, sigma, Fs, T)&amp;lt;/tt&amp;gt;,&lt;br /&gt;
: &amp;lt;math&amp;gt;g_{3}(t) = \left\{ &lt;br /&gt;
\begin{array}{lll}&lt;br /&gt;
0 &amp;amp; \mathrm{dla}&amp;amp; t&amp;lt;t_0 \\&lt;br /&gt;
\exp\left(-\frac{(t-t_0)^2}{2 \sigma^2}\right)&amp;amp; \mathrm{dla}&amp;amp; t \ge t_0  &lt;br /&gt;
\end{array}&lt;br /&gt;
\right. &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
W dalszych zadaniach tej sekcji przyjmiemy:&lt;br /&gt;
* ''T'' = 1 s,&lt;br /&gt;
* ''F&amp;lt;sub&amp;gt;s&amp;lt;/sub&amp;gt;'' = 128 Hz,&lt;br /&gt;
* ''t''&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; = 0,3 s,&lt;br /&gt;
* &amp;amp;sigma; = 0,02 s.&lt;br /&gt;
&lt;br /&gt;
===Uśrednianie w modelu addytywnym: sygnał + szum===&lt;br /&gt;
Dla funkcji &amp;lt;math&amp;gt;g_1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;g_2&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;g_3&amp;lt;/math&amp;gt;  wykonaj ''N'' symulacji sygnału opisanego daną funkcją z dodanym szumem gaussowskim (&amp;lt;tt&amp;gt;numpy.random.randn&amp;lt;/tt&amp;gt;). Zaobserwuj zmianę wariancji uśrednianego sygnału wraz z ''N''.&lt;br /&gt;
&lt;br /&gt;
===Uśrednianie w modelu addytywnym: sygnał + szum + niezależna czynność rytmiczna===&lt;br /&gt;
Powtórz poprzednie symulacje dokładając w każdej realizacji sinusoidę o losowo wybranej fazie. Symulacje wykonaj dla różnych częstości sinusoidy, takich których połówka okresu zbliżona jest do szerokości funkcji Gaussa, oraz znacząco od niej różnych.&lt;br /&gt;
&lt;br /&gt;
===Uśrednianie w modelu z resetem fazy===&lt;br /&gt;
Zbuduj sygnał składający się z dwóch fragmentów sinusoidy o częstości ''f'': &lt;br /&gt;
* pierwszy fragment ma losową fazę,&lt;br /&gt;
* drugi fragment ma fazę równą 0.&lt;br /&gt;
Wykonaj ''N'' realizacji takiego sygnału, przy czym każda realizacja ma częstość losowaną z rozkładu Gaussa o średniej 10 i pewnej wariancji (czyli &amp;lt;math&amp;gt;f \in \mathrm{N}(10,\sigma)&amp;lt;/math&amp;gt;). &lt;br /&gt;
Uśrednij otrzymane realizacje. Zaobserwuj zależność średniej od liczby uśrednianych realizacji i od wariancji częstości.&lt;br /&gt;
&lt;br /&gt;
===Uśrednianie potencjału z fluktuacją latencji===&lt;br /&gt;
Wygeneruj sygnały składające się z funkcji &amp;lt;math&amp;gt;g_1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;g_2&amp;lt;/math&amp;gt; albo &amp;lt;math&amp;gt;g_3&amp;lt;/math&amp;gt; z fluktuującą latencją, tzn. z wartością &amp;lt;math&amp;gt;t_0&amp;lt;/math&amp;gt; pochodzącą z jakiegoś rozkładu prawdopodobieństwa. U nas dla ustalenia uwagi niech będzie to rozkład Gaussa. Wykonaj zestaw symulacji obrazujący zależność od liczby realizacji i od wielkości fluktuacji, mierzonej przez wariancję rozkładu. Czy jest związek pomiędzy wariancją fluktuacji &amp;lt;math&amp;gt;t_0&amp;lt;/math&amp;gt; a szerokością załamków?&lt;br /&gt;
&lt;br /&gt;
===Wpływ filtrów===&lt;br /&gt;
# Zaprojektuj następujące filtry (przyjmij częstość próbkowania 128 Hz):&lt;br /&gt;
#* dolnoprzepustowy: Butterwortha z częstością odcięcia: 30, 40, 50 Hz, i rzędach od 1 do 5 (funkcja butter w module scipy.signal),&lt;br /&gt;
#* górnoprzepustowy: Butterwortha z częstością odcięcia: 0,1, 0,5, 2 i 5 Hz, i rzędach od 1 do 5,&lt;br /&gt;
#* notch: Czybyszewa II rodzaju z pasmem zaporowym ustawionym na 50 Hz, i rzędach od 1 do 3 (funkcja cheby2),&lt;br /&gt;
# Zbadaj funkcję odpowiedzi impulsowej i funkcję przenoszenia tych filtrów (w skali dB). Zaobserwuj jak długa jest odpowiedź impulsowa i jak daleko od częstości odcięcia zaburzone jest pasmo przenoszenia.&lt;br /&gt;
# Zastosuj powyższe filtry do funkcji &amp;lt;math&amp;gt;g_1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;g_2&amp;lt;/math&amp;gt; albo &amp;lt;math&amp;gt;g_3&amp;lt;/math&amp;gt;. Filtrowanie przeprowadź w jedną (lfilter) oraz w dwie strony (filtfilt). Zaobserwuj związek między zniekształceniem wprowadzanym przez filtr a funkcją odpowiedzi impulsowej filtru.&lt;br /&gt;
# W ćwiczeniu tym posłuż się symulowanymi sygnałami uzyskanymi z modelu addytywnego: &amp;amp;bdquo;sygnał+szum&amp;amp;rdquo;. Dla funkcji &amp;lt;math&amp;gt;g_1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;g_2&amp;lt;/math&amp;gt; albo &amp;lt;math&amp;gt;g_3&amp;lt;/math&amp;gt;  wykonaj ''N'' = 60 realizacji sygnału opisanego daną funkcją z dodanym szumem gaussowskim (&amp;lt;tt&amp;gt;numpy.random.randn&amp;lt;/tt&amp;gt;). Każdą z realizacji przefiltruj, a następnie uśrednij uzyskane sygnały.&lt;br /&gt;
&lt;br /&gt;
==Zadanie 2: rejestracje i analiza potencjałów wzrokowych==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;! -- ===Synchronizacja występowania bodźców z sygnałem EEG===&lt;br /&gt;
&lt;br /&gt;
Rejestracja potencjałów wywołanych jest przykładem pomiaru czynności elektrycznej mózgu w odpowiedzi na określony bodziec. W przypadku tego rodzaju pomiarów konieczna jest synchronizacja momentu wystąpienia bodźca z sygnałem EEG. Wzmacniacze do pomiaru czynności elektrycznej mózgu wyposażone są w specjalne wejścia, na które można podawać sygnał odpowiadający pojawianiu się bodźca. Jak pamiętamy z zeszłego semestru, wejście to (jak i podawany na nie sygnał) nazywamy trigerem (ang. ''trigger'' &amp;amp;mdash; spust, cyngiel, wyzwalacz). W najprostszym przypadku, bodziec moglibyśmy wyświetlać na monitorze komputerowym, a sygnał związany z jego wystąpieniem wysyłać przez któryś z portów komputera (LPT, COM) na wzmacniacz EEG. Niestety, obecnie dostępne i popularne systemy operacyjne, takie jak Windows czy Linux nie są systemami czasu rzeczywistego (http://pl.wikipedia.org/wiki/System_operacyjny_czasu_rzeczywistego). Od momentu wyświetlania bodźca na ekranie, do pojawiania się sygnału odpowiednim porcie komputerowym może upłynąć kilkadziesiąt milisekund i co gorsza czas ten zwykle jest losowy. W przypadku gdy wzmacniacz próbkuje sygnał z częstością 1000 Hz, moment wystąpienia bodźca możemy określić z dokładnością 1 ms, jednakże wspomniane opóźnienia w systemie operacyjnym uniemożliwiają to. Ponadto, jak dowiedzieliśmy się w rozdziale wstępnym [http://brain.fuw.edu.pl/edu-wiki/action/edit/EEG:Potencja%C5%82y_wywo%C5%82ane?section=T-1], pierwsze załamki związane z potencjałami wywołanymi pojawiają się już 10 ms po wystąpieniu bodźca. W związku z tym, losowe, rzędu kilkudziesięciu milisekund opóźnienia sygnału określającego moment pojawienia się bodźca względem jego rzeczywistego wystąpienia są niedopuszczalne.&lt;br /&gt;
Istnieją pewne techniki programowania, dzięki którym opisywane opóźnienia można zmniejszyć, jednakże są one bardzo trudne  do realizacji. Ponadto, standardowe porty komputera, takie jak LPT, czy COM zostały zaprojektowane przede wszystkim do sterowania urządzeniami zewnętrznymi, a nie ich zasilania. Przykładowo, jedna linia portu drukarkowego (LPT) może być obciążona prądem nie większym niż 5 mA, podczas gdy do zapalenie zwykłej diody LED potrzeba około 10 mA. Taki pobór prądu możliwy jest do uzyskania z portu USB, jednakże  jest on  wyjątkowo trudny do oprogramowania.  &lt;br /&gt;
W celu ominięcia powyższych niedogodności w Zakładzie Fizyki Biomedycznej UW w przeprowadzanych eksperymentach wykorzystywane są  mikrokontrolery [http://pl.wikipedia.org/wiki/Mikrokontroler], w szczególności ATmega16 i ATmega32.  Mikrokontrolery te wyposażone są w procesory o architekturze RISC [http://pl.wikipedia.org/wiki/RISC] i mocy obliczeniowej porównywalnej z szeroko stosowanym kiedyś w komputerach ZX Spectrum, Commodore, Amiga i Atari procesorem Z80. Oprócz jednostki centralnej mikrokontrolery zawierają   stałą pamięć FLASH przeznaczoną do przechowywania kodu programu, pamięć  RAM i pamięć EEPROM, liczniki 8- i 16-bitowe, komparatory, przetworniki analogowo-cyfrowe, porty wejścia/wyjścia, łącze RS232 (popularnie nazywane portem szeregowym) i układy przerwań.&lt;br /&gt;
&lt;br /&gt;
Mikrokontrolery wchodzące w skład zestawów pomiarowych na Pracowni EEG zawierają program, który umożliwia komunikację z nimi poprzez port szeregowy. Obecnie, komputery są coraz rzadziej wyposażane w porty szeregowe. Standard komunikacji RS-232, opracowany w 1962 roku  nadal jest jednak popularny i często wykorzystywany do komunikacji miedzy urządzeniami.  W celu połączenia komputera posiadającego tylko porty USB z mikrokontrolerem zastosowano przejściówkę USB/RS-232. &lt;br /&gt;
&lt;br /&gt;
Jak każde urządzenie w systemie Linuks, przejściówka USB/RS-232 widoczna jest jako plik, znajdujący się w katalogu &amp;lt;tt&amp;gt;/dev&amp;lt;/tt&amp;gt;. Nazwy plików obsługujących urządzenia szeregowe to &amp;lt;tt&amp;gt;ttyXY&amp;lt;/tt&amp;gt;, gdzie &amp;lt;tt&amp;gt;XY&amp;lt;/tt&amp;gt; to kolejny numer przydzielony do urządzenia szeregowego.&lt;br /&gt;
Do komunikacji komputera z mikroknotrolerem  w Zakładzie Fizyki Biomedycznej UW została napisana prosta biblioteka.  Jej użycie jest następujące:&lt;br /&gt;
* Po podłączeniu przejściówki USB/RS232 do komputera mikrokontrolera sprawdź jaki plik w katalogu &amp;lt;tt&amp;gt;/dev&amp;lt;/tt&amp;gt; został utworzony i przydzielony do urządzenia. &lt;br /&gt;
* Zaimportuj bibliotekę do komunikacji z mikrokontrolerem: &lt;br /&gt;
: &amp;lt;tt&amp;gt;import SerialPort as SP&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Otwórz plik powiązany z urządzeniem zewnętrznym:&lt;br /&gt;
: &amp;lt;tt&amp;gt;sp = SP.SerialPort(nazwa_pliku) &amp;lt;/tt&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
: &amp;lt;tt&amp;gt;sp.open()&amp;lt;/tt&amp;gt;&lt;br /&gt;
W naszym przypadku prawidłowa nazwa pliku to &amp;lt;tt&amp;gt;/dev/ttyUSB0&amp;lt;/tt&amp;gt;.&lt;br /&gt;
* Po włączeniu zasilania mikrokontrolera, diody podłączone do niego i wykorzystywane w eksperymencie z potencjałami wywołanymi będą zapalone. Następujące polecenie zgasi obydwie diody:&lt;br /&gt;
: &amp;lt;tt&amp;gt;sp.blinkP300([0, 0])&amp;lt;/tt&amp;gt;&lt;br /&gt;
* Wydanie poniższego polecenia spowoduje, iż mikrokontroler zapali podłączoną do niego diodę numer 1 na czas 100 ms, zaś diodę numer 2 na 200 ms. Jednocześnie, w momencie włączenia jak i wyłączenia diody, sygnał z mikrokontrolera zostanie wysłany na 5-stykowe wejście AUX mikrokontrolera:&lt;br /&gt;
: &amp;lt;tt&amp;gt;sp.blinkP300([100, 200])&amp;lt;/tt&amp;gt;&lt;br /&gt;
* Jeśli chcemy zapalić tylko diodę numer dwa, np. na czas 500 ms w programie podajemy następującą instrukcję:&lt;br /&gt;
: &amp;lt;tt&amp;gt;sp.blinkP300([0, 500])&amp;lt;/tt&amp;gt;&lt;br /&gt;
* Jeśli chcemy zakończyć komunikację z mikrokontrolerem piszemy:&lt;br /&gt;
: &amp;lt;tt&amp;gt;sp.close()&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Kod biblioteki do komunikacji z mikrokontrolerem:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;!--  Kod w Pythonie 2&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# -*- coding: cp1250 -*-&lt;br /&gt;
import serial&lt;br /&gt;
import logging&lt;br /&gt;
import sys&lt;br /&gt;
import os&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def to_hex_word(a):&lt;br /&gt;
    '''encodes a decimal number hexadecimally on two bytes'''&lt;br /&gt;
    return chr(a%256) + chr(a/256)&lt;br /&gt;
&lt;br /&gt;
class SerialPort(object):&lt;br /&gt;
    def __init__(self, port_name):&lt;br /&gt;
        import serial&lt;br /&gt;
        try:&lt;br /&gt;
            self.port = serial.Serial(&lt;br /&gt;
                port=port_name,&lt;br /&gt;
                baudrate=9600,&lt;br /&gt;
                bytesize=serial.EIGHTBITS,&lt;br /&gt;
                parity=serial.PARITY_NONE,&lt;br /&gt;
                stopbits=serial.STOPBITS_ONE,&lt;br /&gt;
                xonxoff=False&lt;br /&gt;
                )&lt;br /&gt;
        except serial.SerialException as e:&lt;br /&gt;
            print(&amp;quot;Nieprawidłowa nazwa portu lub port zajęty.&amp;quot;)&lt;br /&gt;
            raise e&lt;br /&gt;
        self.close()&lt;br /&gt;
        &lt;br /&gt;
    def open(self):&lt;br /&gt;
        self.port.open()&lt;br /&gt;
&lt;br /&gt;
    def close(self):&lt;br /&gt;
        self.port.close()&lt;br /&gt;
&lt;br /&gt;
    def send(self, value):&lt;br /&gt;
        self.port.write(value)&lt;br /&gt;
                           &lt;br /&gt;
    def blinkSSVEP(self,d, p1, p2):&lt;br /&gt;
        '''&lt;br /&gt;
        d = list of frequencies;&lt;br /&gt;
        p1:p2 = ratio LED_on_time/LED_off_time&lt;br /&gt;
        if you want i-th LED to be OFF all the time send  d[i] = 0&lt;br /&gt;
        if you want i-th LED to be ON all the time send  d[i] = -1&lt;br /&gt;
        in these two cases p1 and p2 do not matter&lt;br /&gt;
        '''&lt;br /&gt;
        clock  = 62500&lt;br /&gt;
        factor = float(p1) / float(p1 + p2)&lt;br /&gt;
    &lt;br /&gt;
        str = chr(3) # 'SSVEP_RUN'&lt;br /&gt;
&lt;br /&gt;
        for i in range(len(d)):&lt;br /&gt;
            # i-th LED OFF&lt;br /&gt;
            if d[i] == 0:                       &lt;br /&gt;
                str += to_hex_word(0) + to_hex_word(255) &lt;br /&gt;
            # i-th LED ON&lt;br /&gt;
            elif d[i] == -1:&lt;br /&gt;
                str += to_hex_word(255) + to_hex_word(0)&lt;br /&gt;
                #str = 'S'&lt;br /&gt;
                # i-th LED blinks d[i] times per second&lt;br /&gt;
                # p1:p2 = on_time:off_time in one blink&lt;br /&gt;
            else:&lt;br /&gt;
                period = clock/d[i]&lt;br /&gt;
                bright = int((clock/d[i]) * factor)&lt;br /&gt;
                dark = period - bright&lt;br /&gt;
                str += to_hex_word(bright) + to_hex_word(dark)&lt;br /&gt;
&lt;br /&gt;
        self.send(str)&lt;br /&gt;
&lt;br /&gt;
    def blinkP300(self,d):&lt;br /&gt;
        clock  = 62500&lt;br /&gt;
        str = chr(4) # 'P300_RUN'&lt;br /&gt;
&lt;br /&gt;
        for i in range(len(d)):&lt;br /&gt;
            period = int(clock*d[i]/1000.0)&lt;br /&gt;
            str += to_hex_word(period)&lt;br /&gt;
            print(period)&lt;br /&gt;
&lt;br /&gt;
        self.send(str)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
--&amp;gt; &amp;lt;!-- Kod w Pythonie 3 --&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# -*- coding: cp1250 -*-&lt;br /&gt;
import serial&lt;br /&gt;
import logging&lt;br /&gt;
import sys&lt;br /&gt;
import os&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
def to_hex_word(a):&lt;br /&gt;
    '''encodes a decimal number hexadecimally on two bytes'''&lt;br /&gt;
    return a.to_bytes(2,byteorder=sys.byteorder)&lt;br /&gt;
 &lt;br /&gt;
class SerialPort(object):&lt;br /&gt;
    def __init__(self, port_name):&lt;br /&gt;
        import serial&lt;br /&gt;
        try:&lt;br /&gt;
            self.port = serial.Serial(&lt;br /&gt;
                port=port_name,&lt;br /&gt;
                baudrate=9600,&lt;br /&gt;
                bytesize=serial.EIGHTBITS,&lt;br /&gt;
                parity=serial.PARITY_NONE,&lt;br /&gt;
                stopbits=serial.STOPBITS_ONE,&lt;br /&gt;
                xonxoff=False&lt;br /&gt;
                )&lt;br /&gt;
        except serial.SerialException as e:&lt;br /&gt;
            print(&amp;quot;Nieprawidłowa nazwa portu lub port zajęty.&amp;quot;)&lt;br /&gt;
            raise e&lt;br /&gt;
        self.close()&lt;br /&gt;
 &lt;br /&gt;
    def open(self):&lt;br /&gt;
        self.port.open()&lt;br /&gt;
 &lt;br /&gt;
    def close(self):&lt;br /&gt;
        self.port.close()&lt;br /&gt;
 &lt;br /&gt;
    def send(self, value):&lt;br /&gt;
        self.port.write(value)&lt;br /&gt;
 &lt;br /&gt;
    def blinkSSVEP(self,d, p1, p2):&lt;br /&gt;
        '''&lt;br /&gt;
        d = list of frequencies;&lt;br /&gt;
        p1:p2 = ratio LED_on_time/LED_off_time&lt;br /&gt;
        if you want i-th LED to be OFF all the time send  d[i] = 0&lt;br /&gt;
        if you want i-th LED to be ON all the time send  d[i] = -1&lt;br /&gt;
        in these two cases p1 and p2 do not matter&lt;br /&gt;
        '''&lt;br /&gt;
        clock  = 62500&lt;br /&gt;
        factor = float(p1) / float(p1 + p2)&lt;br /&gt;
 &lt;br /&gt;
        str = (3).to_bytes(1,byteorder=sys.byteorder) # 'SSVEP_RUN'&lt;br /&gt;
 &lt;br /&gt;
        for i in range(len(d)):&lt;br /&gt;
            # i-th LED OFF&lt;br /&gt;
            if d[i] == 0:                       &lt;br /&gt;
                str += to_hex_word(0) + to_hex_word(255) &lt;br /&gt;
            # i-th LED ON&lt;br /&gt;
            elif d[i] == -1:&lt;br /&gt;
                str += to_hex_word(255) + to_hex_word(0)&lt;br /&gt;
                #str = 'S'&lt;br /&gt;
                # i-th LED blinks d[i] times per second&lt;br /&gt;
                # p1:p2 = on_time:off_time in one blink&lt;br /&gt;
            else:&lt;br /&gt;
                period = clock/d[i]&lt;br /&gt;
                bright = int((clock/d[i]) * factor)&lt;br /&gt;
                dark = int(period - bright)&lt;br /&gt;
                str += to_hex_word(bright) + to_hex_word(dark)&lt;br /&gt;
 &lt;br /&gt;
        self.send(str)&lt;br /&gt;
 &lt;br /&gt;
    def blinkP300(self,d):&lt;br /&gt;
        clock  = 62500&lt;br /&gt;
        str = (4).to_bytes(1,byteorder=sys.byteorder) # 'P300_RUN'&lt;br /&gt;
 &lt;br /&gt;
        for i in range(len(d)):&lt;br /&gt;
            period = int(clock*d[i]/1000.0)&lt;br /&gt;
            str += to_hex_word(period)&lt;br /&gt;
 &lt;br /&gt;
        self.send(str)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
--&amp;gt; &lt;br /&gt;
&lt;br /&gt;
===Zestaw eksperymentalny===&lt;br /&gt;
Zestaw składa się ze:&lt;br /&gt;
* wzmacniacza,&lt;br /&gt;
* stymulatora   &lt;br /&gt;
&amp;lt;!--* izolowanego galwanicznie układu generującego impulsy odpowiadające gaszeniu i zapalaniu diody,  o wartościach dopasowanych do akceptowalnych przez wejścia AUX wzmacniacza,--&amp;gt;&lt;br /&gt;
* komputera: w tym eksperymencie komputer będzie służył do zaprogramowania stymulatora i do rejestracji sygnałów.&lt;br /&gt;
&lt;br /&gt;
===Eksperyment 1. Obserwacja bodźca wzrokowego  ===&lt;br /&gt;
&amp;lt;!--Proszę zapoznać się ze standardami rejestracji wzrokowych potencjałów wywołanych [http://www.gcu.ac.uk/media/gcalwebv2/theuniversity/academicschools/sls/psytimetables/SLS%20-%20VEP_Standard_2010.pdf] --&amp;gt;&lt;br /&gt;
Proszę zapoznać się z typowym wyglądem załamków w przypadku potencjałów wzrokowych, jaki jest przedstawiony na [https://link.springer.com/article/10.1007/s10633-009-9195-4/figures/2 rysunku] (cały artykuł jest dostępny [http://link.springer.com/article/10.1007%2Fs10633-009-9195-4 tu]).&lt;br /&gt;
&amp;lt;!--[[Plik:Fig 4 VEP.jpg|thumb|320px|right|&amp;lt;figure id=&amp;quot;fig:zalamki_VEP&amp;quot;&amp;gt;&amp;lt;/figure&amp;gt;&lt;br /&gt;
&amp;lt;xr id=&amp;quot;fig:zalamki_VEP&amp;quot;&amp;gt;Rys. %i.&amp;lt;/xr&amp;gt; Schemat załamków rozpoznawanych we wzrokowych potencjach wywołanych (z pracy: J. V. Odom i in. &amp;amp;bdquo;ISCEV standard for clinical visual evoked potentials&lt;br /&gt;
(2009 update)&amp;amp;rdquo;, Doc Ophthalmol (2010), 120:111–119).]]&lt;br /&gt;
--&amp;gt; &lt;br /&gt;
&lt;br /&gt;
==== Rejestracja ====&lt;br /&gt;
* Paradygmat: z odległości około 40 cm badany obserwuje wyświetalny na ekranie biały kwadrat. Bodźce trwają 300 ms i  powtarzają się co 0.5 sekundy. Bodziec poprzedza punkt fiksacji pokazywany przez 300 ms. Natężenie bodźca ma przyjąć jedną z 4 wartości (manipulujemy jego przeźroczystością: 1, 0.7, 0.3 i 0.1, gdzie 1 oznacza brak przeźroczystości). Każda z intensywności bodźca ma pojawić się 100 razy podczas badania, bodźce podawane mają być w sposób losowy. Zadanie poprzedza krótka instrukcja, kończy podziękowanie. &lt;br /&gt;
&lt;br /&gt;
* Pomiar&lt;br /&gt;
**Zakładamy czepek i elektrody w systemie 10-20, dbamy o to by opory pomiędzy elektrodami były poniżej 10 k&amp;amp;Omega; i różnice pomiędzy oporami różnych elektrod nie przekraczały 20%. [[Plik:Glowka10-20 ERPy.svg|thumb|600px|right]]&lt;br /&gt;
** Elektrodę GND mocujemy w otworze czepka odpowiadającym pozycji AFz (na linii centralnej 10% w stronę nosa od elektrody Fz) &lt;br /&gt;
** Montujemy także elektrody M1 i M2 i FCz.&lt;br /&gt;
&lt;br /&gt;
==== Analiza ====&lt;br /&gt;
# Filtrujemy sygnał w paśmie 1-20 Hz.&lt;br /&gt;
# Z ciągłego zapisu wycinamy fragmenty od &amp;amp;minus;300 ms do +800 ms (zero oznacza moment wystąpienia bodźca). W czasie wycinania badamy wycinane fragmenty pod względem zakresu amplitudy (wszystkie kanały powinny mieć amplitudę w granicach &amp;amp;plusmn;75 &amp;amp;mu;V) i zawartości artefaktów od mrugania (w tym celu trzeba oglądając sygnał w SVAROG-u ustalić próg na amplitudę sygnału w kanałach Fp1 i Fp2).&lt;br /&gt;
# Uśredniamy wycięte sygnały.&lt;br /&gt;
# Rysujemy średni potencjał we wszystkich kanałach.&lt;br /&gt;
# Pierwszy sposób: Identyfikujemy załamki P1 i N2. Mierzymy amplitudę P1 jako różnicę między ekstremalną wartością załamka N2 a ekstremalną wartością załamka N2. &lt;br /&gt;
# Drugi sposób: Identyfikujemy załamki P1 i N2. Mierzymy amplitudę P1 w stosunku do zera. &lt;br /&gt;
#porównujemy uzyskane amplitudy w 4 warunkach za pomocą odpowiedniego testu statystycznego (porównanie warunków ze skrajnymi wartościami amplitudy - zastosuj test permutacyjny (opisany poniżej) lub test t-Studenta/nieparametryczny odpowiednik). &lt;br /&gt;
&lt;br /&gt;
**Opis testu permutacyjnego &lt;br /&gt;
Pytanie: Czy intensywność bodźca wpływa na amplitudę potencjału P1?&lt;br /&gt;
Jak stwierdzić czy amplitudy załamków P1 istotnie różnią się pomiędzy seriami?&lt;br /&gt;
&lt;br /&gt;
Musimy przeprowadzić test statystyczny. Możemy skonstruować go np. tak:&lt;br /&gt;
Mamy dwa warunki I i II. Jako statystykę przyjmiemy różnicę pomiędzy amplitudą załamka zmierzoną w serii z dwoma diodami (P2&amp;lt;sub&amp;gt;II&amp;lt;/sub&amp;gt;) a amplitudą zmierzoną w serii z jedną diodą (P2&amp;lt;sub&amp;gt;I&amp;lt;/sub&amp;gt;):&lt;br /&gt;
: ''S'' = P2&amp;lt;sub&amp;gt;II&amp;lt;/sub&amp;gt; &amp;amp;minus; P2&amp;lt;sub&amp;gt;I&amp;lt;/sub&amp;gt;&lt;br /&gt;
Postawmy hipotezę zerową, że nie ma różnicy w amplitudzie pomiędzy warunkiem II a I oraz hipotezę alternatywną, że różnica taka występuje.&lt;br /&gt;
: H&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;: ''S'' = 0&lt;br /&gt;
: H&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;: ''S'' &amp;amp;ne; 0&lt;br /&gt;
Zgodnie z H&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; dla wartości ''S'' nie ma różnicy czy realizacja została zarejestrowana w warunkach I czy II, zatem można losowo poprzypisywać numery warunków do realizacji i w ten sposób uzyskać rozkład statystyki ''S'' pod warunkiem prawdziwości H&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;, czyli obliczyć średnie potencjały dla &amp;amp;bdquo;pomieszanych&amp;amp;rdquo; tagów, wyliczyć średnie potencjały dla sztucznie wygenerowaych grup, i wyliczyć różnicę amplitud dla tych średnich, czyli wartość statystyki dla hipotezy H&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Zaimplementuj test permutacyjny zgodny z powyższą koncepcją.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- ===Wersja 2: obserwacja habituacji / uśrednianie w blokach ===&lt;br /&gt;
==== Rejestracja ====&lt;br /&gt;
# Paradygmat: &lt;br /&gt;
#* z odległości około 40 cm badany obserwuje błyski diody. &lt;br /&gt;
#* Błyski powtarzają się co 0,5 sekundy. &lt;br /&gt;
#* Rejestrujemy 60 serii po 15 błysków.  &lt;br /&gt;
#* Pomiędzy seriami badany odpoczywa około 10 sekund.&lt;br /&gt;
# Zakładamy czepek i elektrody w systemie 10-20, dbamy o to by opory pomiędzy elektrodami były poniżej 5 k&amp;amp;Omega; i różnice pomiędzy oporami różnych elektrod nie przekraczały 20%.&lt;br /&gt;
#* Elektrodę GND mocujemy w otworze czepka odpowiadającym pozycji AFz (na linii centralnej 10% w stronę nosa od elektrody Fz) &lt;br /&gt;
#* Montujemy także elektrodę FCz (na linii centralnej pomiędzy Fz a Cz), będziemy jej używać w montażu i w czasie analizy jako referencji.&lt;br /&gt;
#* Częstość próbkowania 512 Hz.&lt;br /&gt;
&lt;br /&gt;
==== Analiza ====&lt;br /&gt;
# Filtrujemy sygnał w paśmie 0,1-20 Hz.&lt;br /&gt;
# Z ciągłego zapisu wycinamy fragmenty od &amp;amp;minus;300 ms do +600 ms (zero oznacza moment wystąpienia bodźca). W czasie wycinania badamy wycinane fragmenty pod względem zakresu amplitudy (wszystkie kanały powinny mieć amplitudę w granicach &amp;amp;plusmn;75 &amp;amp;mu;V) i zawartości artefaktów od mrugania (w tym celu trzeba oglądając sygnał w SVAROG-u ustalić próg na amplitudę sygnału w kanałach Fp1 i Fp2).&lt;br /&gt;
# Uśredniamy wycięte sygnały o tym samym numerze wewnątrz serii.&lt;br /&gt;
# Rysujemy serie 15 uśrednionych potencjałów dla tego kanału, który wykazywał najsilniejszy potencjał w pierwszej wersji eksperymentu. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Eksperyment 2: rejestracja i analiza potencjału P3 ===&lt;br /&gt;
====Rejestracja ====&lt;br /&gt;
# Paradygmat: &lt;br /&gt;
#* z odległości około 40 cm badany obserwuje kwadrat, który występuje w dwóch kolorach. &lt;br /&gt;
#* Bodźce trwają 300 ms, poprzedzane punktem fiksacji wyświetlanym na 300 ms, przerwa między próbami jest losowana i wynosi od 0.8-1.2 s.  &lt;br /&gt;
#* Proporcja wystapień bodźców koloru pierwszego i drugiego wynosi 1:5.   &lt;br /&gt;
#* Zadaniem badanego jest liczenie kwadratów w rzadkim kolorze. &lt;br /&gt;
#* Wykonujemy tyle realizacji aby zarejestrować 100 powtórzeń bodźców rzadkich. &lt;br /&gt;
# Zakładamy czepek i elektrody w systemie 10-20, dbamy o to by opory pomiędzy elektrodami były poniżej 5 k&amp;amp;Omega; i różnice pomiędzy oporami różnych elektrod nie przekraczały 20%.&lt;br /&gt;
#* Elektrodę GND mocujemy w otworze czepka odpowiadającym pozycji AFz (na linii centralnej 10% w stronę nosa od elektrody Fz) &lt;br /&gt;
#* Montujemy także elektrody M1 i M2, będziemy ich używać w montażu i w czasie analizy jako referencji typu połączone uszy.&lt;br /&gt;
#* Częstość próbkowania 512 Hz.&lt;br /&gt;
&lt;br /&gt;
==== Analiza ====&lt;br /&gt;
# Filtrujemy sygnał w paśmie 1-20 Hz.&lt;br /&gt;
# Z ciągłego zapisu wycinamy fragmenty od &amp;amp;minus;300 ms do +900 ms (zero oznacza moment wystąpienia bodźca). W czasie wycinania badamy wycinane fragmenty pod względem zakresu amplitudy (wszystkie kanały powinny mieć amplitudę w granicach &amp;amp;plusmn;75 &amp;amp;mu;V) i zawartości artefaktów od mrugania (w tym celu trzeba oglądając sygnał w SVAROG-u ustalić próg na amplitudę sygnału w kanałach Fp1 i Fp2).&lt;br /&gt;
# Uśredniamy osobno realizacje dla każdego koloru kwadratu. &lt;br /&gt;
# Nakładamy na siebie na rysunkach oba typy średnich.&lt;br /&gt;
# wyznaczamy amplitudę P3 i liczymy test statystyczny pomiędzy warunkami&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- ==Ćwiczenie dodatkowe: P300 BCI==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wykorzystujemy elektrody z systemu 10-10 umieszczone nad korą wzrokową: P07, O1, O2, PO8, PO3, PO4, Pz, Cz.&lt;br /&gt;
&lt;br /&gt;
Uruchamiamy &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
obci_gui --presets eeg_workshop&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
i z guzika &amp;amp;bdquo;select amplifier&amp;amp;rdquo; wybieramy właściwy wzmacniacz.&lt;br /&gt;
&lt;br /&gt;
Do kontroli jakości sygnału możemy uruchomić Svaroga.&lt;br /&gt;
&lt;br /&gt;
Dane z kalibracji zapisują się w pliku test1 w katalogu domowym użytkownika, z labiryntu w pliku test2.&lt;br /&gt;
&lt;br /&gt;
Po zakończeniu kalibracji pojawia się napis &amp;amp;bdquo;Trwają obliczenia&amp;amp;rdquo; lub podobny. Odczekujemy kilka minut, aż skończy się peer &amp;amp;bdquo;Calibration&amp;amp;rdquo; (widoczny w obci_gui) i zamykamy okienko klawiszami Alt-F4 lub zatrzymując scenariusz guzikiem &amp;amp;bdquo;Stop&amp;amp;rdquo;. W katalogu domowym pojawi się plik z wynikami kalibracji, co pozwala na uruchomienie scenariusza &amp;amp;bdquo;labirynt&amp;amp;rdquo;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Po zebraniu danych, przed wczytaniem ich do Svaroga należy w tym samym katalogu uruchomić skrypt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
#!/usr/bin/env python&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
&lt;br /&gt;
from obci.analysis.obci_signal_processing.tags import tags_file_writer&lt;br /&gt;
from obci.analysis.obci_signal_processing.read_manager import ReadManager&lt;br /&gt;
&lt;br /&gt;
def main(): &lt;br /&gt;
	file_name = 'test1'&lt;br /&gt;
	&lt;br /&gt;
	mgr = ReadManager(&lt;br /&gt;
		file_name + '.obci.xml',&lt;br /&gt;
		file_name + '.obci.raw',&lt;br /&gt;
		file_name + '.obci.tag')&lt;br /&gt;
	&lt;br /&gt;
	tags = mgr.get_tags()&lt;br /&gt;
	for i in xrange(0, len(tags)):&lt;br /&gt;
		if tags[i]['desc']['index'] == tags[i]['desc']['target']:&lt;br /&gt;
			tags[i]['name'] = 'blink_target'&lt;br /&gt;
		else:&lt;br /&gt;
			tags[i]['name'] = 'blink'&lt;br /&gt;
			&lt;br /&gt;
	tags_writer = tags_file_writer.TagsFileWriter(file_name + '.obci.tag')&lt;br /&gt;
	for tag in tags:&lt;br /&gt;
		tags_writer.tag_received(tag)		&lt;br /&gt;
	tags_writer.finish_saving(0)	&lt;br /&gt;
 &lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Aduszyk</name></author>
		
	</entry>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=Pracownia_EEG/Potencja%C5%82y_wywo%C5%82ane&amp;diff=8978</id>
		<title>Pracownia EEG/Potencjały wywołane</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=Pracownia_EEG/Potencja%C5%82y_wywo%C5%82ane&amp;diff=8978"/>
		<updated>2022-11-08T11:12:03Z</updated>

		<summary type="html">&lt;p&gt;Aduszyk: /* =Eksperyment 2: rejestracja i analiza potencjału P3 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Pracownia EEG|Pracownia EEG]] / Potencjały wywołane&lt;br /&gt;
&lt;br /&gt;
=Wstęp=&lt;br /&gt;
==Potencjały wywołane==&lt;br /&gt;
=== Wstęp ===&lt;br /&gt;
Potencjały wywołane EEG (ang. ''evoked potentials'', EP) są śladami odpowiedzi mózgu na bodźce. W przypadku MEG poprawnie mówi się o polach wywołanych (ang. ''evoked fields'', EF).&lt;br /&gt;
Zwykle reakcja ta jest mała (wyjątek stanowią [[Elektroencefalografia/Metody_analizy_sygnałów_EEG_-_analiza_w_dziedzinie_czasu |kompleksy K]]) i w zapisie pojedynczej realizacji reakcji na bodziec najczęściej niewidoczna wśród czynności pochodzącej od wielu innych procesów zachodzących w tym samym czasie w mózgu. &lt;br /&gt;
Ich wyodrębnienie z tak zwanego tła EEG/MEG, czyli manifestacji elektrycznej innych, trwających w tym samym czasie w mózgu procesów (aktywny prąd niezależny), wymaga w dniu dzisiejszym zapisu odpowiedzi na szereg powtórzeń tego samego bodźca (&amp;lt;xr id=&amp;quot;fig:EP&amp;quot;&amp;gt;rys. %i&amp;lt;/xr&amp;gt;). Pierwsze potencjały wywołane pokazał pod koniec lat 40-tych Dawson (Dawson 1947) wykonując superpozycję pojedynczych realizacji na kliszy fotograficznej.&lt;br /&gt;
Z czasem skomplikowane urządzenia analogowe zastąpione zostały przez cyfrowe uśrednianie kolejnych fragmentów EEG, zsynchronizowanych według momentu wystąpienia bodźca, łatwo realizowane za pomocą komputera.&lt;br /&gt;
&lt;br /&gt;
[[Grafika:EP.png|thumb|640px|center|&amp;lt;figure id=&amp;quot;fig:EP&amp;quot;&amp;gt;&amp;lt;/figure&amp;gt;&lt;br /&gt;
Uśrednianie potencjałów wywołanych. a) ciągły zapis EEG z wyróżnionymi momentami wystąpienia bodźca (w tym przypadku słuchowego) b) kilkadziesiąt kolejnych odcinków, wyciętych jako sekunda EEG od momentu wystąpienia kolejnych bodźców, ustawione jeden pod drugim c) uśredniony potencjał wywołany &amp;amp;mdash; widać m. in. załamek P300 ok. 300 milisekund po bodźcu]]&lt;br /&gt;
&lt;br /&gt;
Techniki te opierają się na założeniu, że zawarta w EEG odpowiedź mózgu na każdy z kolejnych bodźców jest niezmienna, a EEG odzwierciedlające pozostałe procesy traktowane jest jak nieskorelowany z nią proces stochastyczny. Zależnie od rodzaju potencjałów wywołanych, założenia te są mniej lub bardziej nieuzasadnione; podważa je choćby powszechnie znany efekt habituacji, polegający na osłabieniu późnych potencjałów wywołanych kolejnymi powtórzeniami bodźca.&lt;br /&gt;
&lt;br /&gt;
Istota potencjałów wywołanych jest przedmiotem otwartej dyskusji i dziesiątków prac, dotykających od lat podstawowych w tej dziedzinie pytań: czym jest potencjał wywołany, który widzimy w uśrednionym przebiegu? Czy naprawdę wynika z deterministycznie powtarzanej, jednakowej odpowiedzi pojawiającej się po każdym powtórzeniu bodźca niezależnie od &amp;amp;bdquo;tła&amp;amp;rdquo;, czy może wynika z reorganizacji faz tego właśnie &amp;amp;bdquo;tła&amp;amp;rdquo; EEG, czy może kombinacji tych dwóch efektów? Jest to wspaniałe pole dla zastosowań zaawansowanych metod modelowania i analizy sygnałów. W ostatnich latach powstają dziesiątki prac na ten temat, a od czasu do czasu również krytyczne artykuły wykazujące, że dotychczasowe odkrycia są raczej artefaktami stosowanych metod a nie wynikają z własności analizowanych danych (Yeung et al., 2004). Jak widać jest tu wciąż bardzo wiele do zrobienia, gdyż zrozumienie tego mechanizmu stoi na drodze do &amp;amp;bdquo;świętego Graala&amp;amp;rdquo;, którym w tej dziedzinie jest wyodrębnienie pojedynczych potencjałów wywołanych.&lt;br /&gt;
&lt;br /&gt;
Niezależnie od tego, w neurofizjologii klinicznej nazwą potencjał wywołany określa się krzywą widoczną po uśrednieniu odpowiedzi na kilkanaście do kilku tysięcy bodźców (Szelenberger 2000). Gromadzona od dziesięcioleci wiedza o behawioralnych i klinicznych korelatach potencjałów wywołanych opiera się na rozpoznawaniu w przebiegach uśrednionych tak zwanych załamków, czyli przejściowych wzrostów lub spadków potencjału (na przykład na &amp;lt;xr id=&amp;quot;fig:EP&amp;quot;&amp;gt;rys. %i&amp;lt;/xr&amp;gt; widać załamek P300). Nazwy załamków składają się zwykle z litery &amp;amp;bdquo;P&amp;amp;rdquo; (od ang. ''positive''), jeśli wychylenie jest dodatnie, lub &amp;amp;bdquo;N&amp;amp;rdquo; (od ang. ''negative''), jeśli wychylenie jest ujemne, oraz liczby. Uwaga: &lt;br /&gt;
* Nie ma niestety jednej ustalonej konwencji prezentacji potencjałów koniecznie trzeba więc zwracać uwagę na orientację wykresu, a wykonując wykres samemu - zamieszczać informację o orientacji kierunku dodatniego,gdyż kierunek dodatni może być wykresie skierowany do góry lub do dołu. &lt;br /&gt;
* Liczba następująca po N lub P określa przybliżoną liczbę milisekund od wystąpienia bodźca, czyli tak zwaną latencję. Nie można jednak ścisłego związku między tą liczbą a liczbą milisekund np. potencjał P300 w zależności od szczegółów paradygmatu doświadczalnego może wystąpić znacznie później. np. w eksperymentach językowych zdarza się że P300 występuje później niż N400 :-).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;xr id=&amp;quot;fig:zalamki&amp;quot;&amp;gt;Rys. %i&amp;lt;/xr&amp;gt; przedstawia schematycznie najważniejsze załamki rozpoznawane w potencjałach słuchowych, czyli wywoływanych bodźcem dźwiękowym. Dla potencjałów wzrokowych i somatosensorycznych istnieją podobne klasyfikacje.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Grafika:Zalamki.png|thumb|320px|right|&amp;lt;figure id=&amp;quot;fig:zalamki&amp;quot;&amp;gt;&amp;lt;/figure&amp;gt;&lt;br /&gt;
Orientacyjny schemat załamków rozpoznawanych w słuchowych potencjach wywołanych, na podstawie (Szelenberger 2000). Skala czasu logarytmiczna. Najszybsze (do 12 ms) składowe egzogenne to potencjały pniowe (BAEP), oznaczane jako fale I-VII. Litery &amp;amp;bdquo;P&amp;amp;rdquo; i &amp;amp;bdquo;N&amp;amp;rdquo; oznaczają dodatnie i ujemne wychylenia związane z dalszymi załamkami]]&lt;br /&gt;
&lt;br /&gt;
Najszybsze (czyli o najmniejszej latencji) składowe to potencjały egzogenne, odzwierciedlające wstępne fazy przekazu informacji. W potencjałach słuchowych są to potencjały pnia (ang. ''brainstem auditory evoked potentials'', BAEP), składające się z siedmiu fal występujących pomiędzy 1 a 12 ms od bodźca. Są one generowane np. w nerwie słuchowym czy pniu mózgu, i wykorzystywane w klinicznej diagnostyce integralności dróg słuchowych. Podobnie jak inne wczesne potencjały o latencjach poniżej 100 ms, są praktycznie niezależne od stanu uwagi.&lt;br /&gt;
&lt;br /&gt;
Po potencjałach o średniej latencji (między 12 a 50 ms) zaczynają się późne potencjały słuchowe (od 100 ms od podania bodźca), odzwierciedlające bardziej złożone reakcje na bodziec. Potencjały ok. 100 ms obserwowane w okolicach sensorycznych odzwierciedlają odpowiedź tejże kory na bodziec. Ich amplituda zależy od parametrów fizycznych bodźca oraz od uwagi, np. amplituda załamka N100 wzrasta w stanie skupienia uwagi czy pobudzenia emocjonalnego. Pierwszy i najpopularniejszy całkowicie endogenny załamek to P300, pojawiający się po rozpoznaniu bodźca oczekiwanego, na którym skupiamy uwagę: na przykład, jeśli w serii pojawiających się losowo liter mamy zliczać wystąpienia jednej z nich, to na średniej odpowiedzi na pojawienie się tej litery pojawi się załamek P300. Załamek ten występuje również w odpowiedzi na bodźce wyczekiwane, niespodziewane i ważne dla osoby (np. własne imię). &lt;br /&gt;
&lt;br /&gt;
=== Uśrednianie w dziedzinie czasu ===&lt;br /&gt;
Jak już było wspomniane powyżej podstawową techniką stosowaną do analizy potencjałów wywołanych jest uśrednianie wielu realizacji odpowiedzi na bodziec wyrównanych względem jakiegoś charakterystycznego zdarzenia, np. momentu podania bodźca albo momentu behawioralnej reakcji na bodziec (np. wciśnięcie przycisku). Podejście to bazuje na trzech założeniach:&lt;br /&gt;
* Reakcja jest czasowo związana z bodźcem. Tzn. w kolejnych realizacjach występuje ona zawsze z tym samym opóźnieniem.&lt;br /&gt;
* Reakcja na bodziec skutkuje zawsze pojawieniem się w sygnale składowej o stałym kształcie (mówimy o stałej morfologii).&lt;br /&gt;
* Spontaniczna czynność EEG &amp;amp;mdash; ta która nie dotyczy przetwarzania interesującego nas bodźca &amp;amp;mdash; jest niezależnym, stacjonarnym szumem o średniej zero.&lt;br /&gt;
&lt;br /&gt;
Zgodnie z powyższymi założeniami mierzony w ''i''-tej realizacji sygnał można wyrazić jako:&lt;br /&gt;
: &amp;lt;math&amp;gt;x_i(t) = s(t) + n_i(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
Uśrednianie po ''N'' realizacjach daje:&lt;br /&gt;
: &amp;lt;math&amp;gt;\bar x (t) = \frac{1}{N} \sum_{i=1}^N x_i(t) = \frac{1}{N} \left(N s(t) + \sum_{i=1}^N n_i(t) \right) &amp;lt;/math&amp;gt;&lt;br /&gt;
Wartość oczekiwana średniego sygnału wynosi:&lt;br /&gt;
: &amp;lt;math&amp;gt;\mathrm{E}\left[ \bar x(t) \right] = s(t) &amp;lt;/math&amp;gt;&lt;br /&gt;
gdyż dla szumu o średniej zero mamy:&lt;br /&gt;
: &amp;lt;math&amp;gt;\mathrm{E}\left[\frac{1}{N} \sum_{i=1}^N n_i(t)\right] = 0&amp;lt;/math&amp;gt;.&lt;br /&gt;
Wariancja &amp;lt;math&amp;gt;\bar x(t)&amp;lt;/math&amp;gt; wynosi:&lt;br /&gt;
: &amp;lt;math&amp;gt;\sigma^2_{\bar x(t)} = \mathrm{E} \left[  \left( \frac{1}{N} \sum_{i=1}^N n_i(t)\right)^2 \right] \approx \frac{1}{N} \sigma^2_{n(t)}&amp;lt;/math&amp;gt;&lt;br /&gt;
gdyż &amp;lt;math&amp;gt;s(t)&amp;lt;/math&amp;gt; jest deterministyczne. &lt;br /&gt;
&lt;br /&gt;
Dla potencjałów pojawiających się w pierwszych kilkudziesięciu milisekundach po bodźcu model ten można uznać za poprawny, gdyż wykazują one zależność głównie od parametrów fizycznych bodźca. Dla późniejszych składowych staje się on coraz bardziej wątpliwy ze względu na występujące korelacje ze stanem (np. uwagi) badanego.&lt;br /&gt;
&lt;br /&gt;
Dla późniejszych składowych można by postulować bardziej ogólną wersję modelu potencjału wywołanego:&lt;br /&gt;
: &amp;lt;math&amp;gt;x_i(t) = s_i(t) + n_i(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
Ten model uwidacznia, że do opisu potencjału wywołanego potrzebna jest nie tylko średnia, ale i wyższe momenty rozkładu (np. drugi moment centralny czyli wariancja).&lt;br /&gt;
&lt;br /&gt;
====Wariancja w przypadku szumu skorelowanego ====&lt;br /&gt;
W poprzednim paragrafie pokazaliśmy, że w przypadku niezależnego szumu wariancja uśrednionego sygnału (w danej chwili czasu) maleje jak  &amp;lt;math&amp;gt;\frac{1}{N}&amp;lt;/math&amp;gt;. Jednak w przypadku gdy kolejne próbki szumu są skorelowane (np. występuje silna aktywność rytmiczna alfa) sytuacja się komplikuje. Intuicyjnie łatwo możemy to sobie wyobrazić w granicznym przypadku. Załóżmy, że tło dla  potencjałów o stałej morfologii   stanowi sinusoida. Jeśli będziemy podawać bodźce w odstępach będących wielokrotnością okresu tej sinusoidy to w uśrednianych fragmentach sygnału owa sinusoida jest tak samo powtarzalna jak badany potencjał i uśrednianie nie prowadzi do poprawy stosunku amplitudy sygnału do amplitudy tła. &lt;br /&gt;
&lt;br /&gt;
Stopień zależności pomiędzy próbkami można zmierzyć przy pomocy funkcji autokorelacji. &lt;br /&gt;
Jeśli funkcję autokorelacji przybliżymy przez:&lt;br /&gt;
: &amp;lt;math&amp;gt;R_{xx}(\tau) = \sigma^2 \exp(-\beta |\tau|) \cos(2 \pi f_0 \tau)&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\sigma^2&amp;lt;/math&amp;gt; jest wariancją szumu, &amp;lt;math&amp;gt;f_0&amp;lt;/math&amp;gt; jest średnią częstością aktywności rytmicznej, &amp;lt;math&amp;gt;\beta/ \pi&amp;lt;/math&amp;gt; jest szerokością pasma tej czynności, zaś &amp;lt;math&amp;gt;\tau&amp;lt;/math&amp;gt; opóźnieniem, to wariancję potencjału wywołanego można wyrazić jako&amp;lt;!-- \cite{Spekreijse_1976}--&amp;gt;:&lt;br /&gt;
: &amp;lt;math&amp;gt;\sigma^2_{\bar x(t)} = \frac{\sigma^2}{N} \left[ \frac{1-\exp(-2 \beta T)}{1 - 2 \exp(- \beta T) \cos(2 \pi f_0 T) +\exp(-2 \beta T)} \right]&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; jest odstępem między bodźcami. &lt;br /&gt;
Widać stąd, że obecność czynności rytmicznej w tle wpływa na stosunek sygnału do szumu. Z powyższego równania widać, że stosunek wariancji dąży do &amp;lt;math&amp;gt;\frac{\sigma^2}{N}&amp;lt;/math&amp;gt; gdy &amp;lt;math&amp;gt;\beta T&amp;lt;/math&amp;gt; staje się duże.  &lt;br /&gt;
&lt;br /&gt;
Periodyczna stymulacja może ponadto prowadzić do wzbudzenia czynności rytmicznej o częstości równej częstości pobudzania bądź jej harmonicznej.&lt;br /&gt;
&lt;br /&gt;
===Wariancja latencji===&lt;br /&gt;
&lt;br /&gt;
Jedną z form zmienności potencjału wywołanego w pojedynczych realizacjach jest wariancja latencji. &lt;br /&gt;
[[Grafika:Wariancja_latencji.png|thumb|500px|right|&lt;br /&gt;
Czerwona linia: Uśrednianie 100 potencjałów wywołanych o latncjach z rozkładu normalnego N(300,30 ), Niebieskie linie: przykładowe pojedyncze realizacje wzięte do średniej]]&amp;lt;!--# -*- coding: utf-8 -*-&lt;br /&gt;
from __future__ import division&lt;br /&gt;
import numpy as np&lt;br /&gt;
from matplotlib.pyplot import plot, show ,subplot, figure, title, xlabel, ylabel, ylim&lt;br /&gt;
 &lt;br /&gt;
def fun(t,lat=100):&lt;br /&gt;
    return np.exp(-(t-lat)**2/(2*30**2))&lt;br /&gt;
Fs = 1&lt;br /&gt;
N = 100&lt;br /&gt;
t = np.arange(0,700)&lt;br /&gt;
f = np.zeros((N,700))&lt;br /&gt;
f_sr = np.zeros(t.shape)&lt;br /&gt;
for i in range(N):&lt;br /&gt;
    f[i,:] = fun(t,lat = 300 + 30* np.random.randn())&lt;br /&gt;
for i in range(3):&lt;br /&gt;
    plot(t,f[i,:], 'b')&lt;br /&gt;
plot(t,f.mean(0),'r')&lt;br /&gt;
show()--&amp;gt;&lt;br /&gt;
Zmienność latencji prowadzi do:&lt;br /&gt;
* zmniejszenia amplitudy &amp;lt;math&amp;gt;\bar x&amp;lt;/math&amp;gt;&lt;br /&gt;
* wzrostu rozciągłości czasowej załamka&lt;br /&gt;
&lt;br /&gt;
O tych konsekwencjach zmienności latencji należy w szczególności pamiętać porównując średnie potencjały uzyskane w różnych warunkach eksperymentalnych. Gdy zauważymy, że średnie potencjały różnią się amplitudą należy rozważyć możliwość, że w istocie warunki eksperymentalne wpływają na różnice w wariancji latencji. &lt;br /&gt;
&lt;br /&gt;
Naturalne jest, że zmienność latencji jest bardziej widoczna w przypadku załamków trwających krótko niż w przypadku załamków trwających długo. Wariancja latencji rożnie wraz z jej wartością, stąd wśród późnych składowych potencjałów wywołanych nie obserwuje się komponentów krótkotrwałych.&lt;br /&gt;
&amp;lt;!--====Uśrednianie metodą Woody'ego ====&lt;br /&gt;
&lt;br /&gt;
Model potencjału ze zmienną latencją i sposób na jego efektywniejsze uśrednianie zaproponował Woody (1967). Model ten zakłada, że w każdej realizacji występuje komponent addytywny &amp;lt;math&amp;gt;s_i(t)\;&amp;lt;/math&amp;gt;, który co do kształtu jest stały, a pomiędzy realizacjami różni się tylko latencją:&lt;br /&gt;
: &amp;lt;math&amp;gt; s_i(t) = s(t +\Delta t_i)\;&amp;lt;/math&amp;gt;&lt;br /&gt;
Woody zaproponował aby &amp;lt;math&amp;gt;\Delta t_i\;&amp;lt;/math&amp;gt; szacować na podstawie maksimum funkcji korelacji wzajemnej pomiędzy ''i''-tą realizacją a wzorcem. W pierwszym kroku wzorcem jest średni potencjał uzyskany przez proste uśrednienie realizacji.  Następnie w sposób iteracyjny dokonuje się:&lt;br /&gt;
* poprawek w wyrównaniu poszczególnych realizacji,&lt;br /&gt;
* obliczenia nowego wzorca poprzez uśrednienie realizacji po korekcie wyrównania,&lt;br /&gt;
* obliczenia nowych poprawek do wyrównania realizacji.--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Habituacja ===&lt;br /&gt;
Zmienność w odpowiedziach na kolejno występujące po sobie bodźce można podzielić na komponent stochastyczny i deterministyczny. Komponent deterministyczny odzwierciedla zmianę czułości  układu nerwowego  na kolejne bodźce. Nowy bodziec często wywołuje reakcje pobudzenia widoczną w wielu parametrach takich jak przewodnictwo skóry, rytm serca i reaktywność kory mózgowej. Powszechnie obserwowanym zjawiskiem jest spadek reaktywności na powtarzające się bodźce zwany habituacją. Niekiedy obserwuje się także zjawisko przeciwne &amp;amp;mdash; wzrost reaktywności na bodziec &amp;amp;mdash; zwane sensytyzacją. &lt;br /&gt;
&lt;br /&gt;
Klasycznym sposobem na badanie tych zjawisk w potencjałach wywołanych jest uśrednianie w podzbiorach lub  uśrednianie blokowe. Wymaga ono  zmiany paradygmatu rejestracji danych. Załóżmy, że interesującym nas bodźcem jest błysk światła. Chcemy zaobserwować ewentualne zmiany amplitudy i latencji w ciągu 100 potencjałów będących reakcją na błysk powtarzający się co 500 ms.&lt;br /&gt;
====Uśrednianie w podzbiorach ====&lt;br /&gt;
W metodzie tej musimy założyć, że proces habituacji jest powolny, tzn. zmiany pomiędzy kolejnymi reakcjami są bardzo małe. W takim przypadku możemy podzielić długą serię bodźców na ciąg pod-serii i uśrednienie przeprowadzić dla każdej pod-serii osobno.&lt;br /&gt;
[[Plik:Usrednianie_podzbiory.svg‎|640px|thumb|center|Ilustracja uśredniania w podzbiorach]]&lt;br /&gt;
&lt;br /&gt;
====Uśrednianie blokowe====&lt;br /&gt;
W tym celu eksperyment wykonujemy w wielu seriach. Jedna seria składa się ze 100 błysków powtarzanych co 500 ms.  Po serii następuje przerwa trwająca np. 5 s (długość przerwy wyraża nasze oszacowanie czasu potrzebnego na zanik habituacji). Po przerwie seria jest powtarzana. Powtórzeń serii wykonujemy ''N''.&lt;br /&gt;
Następnie uśredniamy fragmenty sygnałów odpowiadające sobie w kolejnych seriach. &lt;br /&gt;
&lt;br /&gt;
W tym paradygmacie zakładamy, że każda seria rejestrowana jest w tych samych warunkach. Zaniedbujemy efekty związane ze zmęczeniem i zmianami w np. stopniu koncentracji badanego.&lt;br /&gt;
[[Plik:Usrednianie blokowe.svg|Usrednianie blokowe.svg|640px|thumb|center|Ilustracja uśredniania w blokach]]&lt;br /&gt;
&lt;br /&gt;
===Załamki w krzywej potencjału wywołanego vs ukryte komponenty===&lt;br /&gt;
Komponenta potencjału wywołanego to bardzo ważne ale jednocześnie źle określone pojęcie. Krzywa otrzymana w wyniku uśredniania potencjałów wywołanych przedstawia serię załamków dodatnich i ujemnych, ale trzeba być świadomym, że ten przebieg napięcia rejestrowany przez elektrody przedstawia tak naprawdę sumę potencjałów pochodzących od wielu dość niezależnie działających źródeł w mózgu. Przyczynek pochodzący od jednego funkcjonalnego źródła będziemy określać jako komponentę. &lt;br /&gt;
&lt;br /&gt;
Komentarza wymaga też pojęcie źródła funkcjonalnego. Czynność elektryczną synchronicznie działających neuronów piramidalnych w określonym fragmencie kory mózgowej z pewnej odległości można przybliżyć potencjałem dipola prądowego. Taki aktywny fragment kory stanowi źródło dające przyczynek do mierzonego na powierzchni głowy potencjału. W najprostszej sytuacji taki przyczynek może być obserwowany jako komponenta. Mózg jest jednak obiektem niezwykle złożonym i gęsto połączonym. Wiele obszarów korowych może być funkcjonalnie połączonych i aktywowanych synchronicznie w celu realizacji określonego zadania &amp;amp;mdash; o takim funkcjonalnym zespole też możemy myśleć jako o pojedynczym źródle, choć może ono mieć złożoną strukturę przestrzenną. Często zatem myślimy o komponentach ukrytych potencjału wywołanego jako o aktywności takich funkcjonalnych zespołów. &lt;br /&gt;
&lt;br /&gt;
Po tym wstępie widać już chyba, że do zrozumienia co dzieje się w czasie reakcji na bodziec, którą obserwujemy w potencjale wywołanym, bardziej pożądane byłoby badanie komponent ukrytych niż poszczególnych załamków krzywej potencjału wywołanego, która stanowi ważoną sumę owych komponentów. Zanim przejdziemy do omówienia technik służących &amp;amp;bdquo;wyłuskiwaniu&amp;amp;rdquo; komponent prześledźmy kilka symulacji i wnioski z nich płynące.&lt;br /&gt;
&lt;br /&gt;
==== Załamki i komponenty nie są tym samym.====&lt;br /&gt;
Tę samą krzywą można otrzymać na nieskończenie wiele sposobów  przez sumowanie rożnych kombinacji domniemanych komponentów. Przykładowy rysunek pokazuje, jak tę samą krzywą można złożyć z dwóch rożnych zestawów komponentów (kod wytwarzający przykładową symulację pokazany jest poniżej).&lt;br /&gt;
[[Plik:Sumowanie_komponentow1.png|center|thumb|600px| Panel a) przedstawia hipotetyczną krzywą ERP, panel b) jedna z możliwych dekompozycji sygnału w panelu a), panel c) inna możliwa dekompozycja sygnału z panelu a) ]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
from __future__ import division&lt;br /&gt;
import numpy as np&lt;br /&gt;
from matplotlib.pyplot import plot, show ,subplot, figure, title, xlabel, ylabel, ylim&lt;br /&gt;
&lt;br /&gt;
Fs = 1&lt;br /&gt;
t = np.arange(0,700)&lt;br /&gt;
&lt;br /&gt;
C1 = np.exp(-(t-100)**2/(2*30**2))&lt;br /&gt;
C2 = np.exp(-(t-200)**2/(2*50**2))&lt;br /&gt;
C3 = np.exp(-(t-350)**2/(2*100**2))&lt;br /&gt;
ERP = 0.5*C1-C2+C3&lt;br /&gt;
&lt;br /&gt;
C2p = np.concatenate((C2[0:200], np.ones(30), C2[200:700-30] ))&lt;br /&gt;
C3p = ERP - 0.5*C1 + C2p&lt;br /&gt;
ERP_v2 = 0.5*C1-C2p+C3p&lt;br /&gt;
&lt;br /&gt;
subplot(3,1,1)&lt;br /&gt;
plot(t,ERP, t[::10],ERP_v2[::10],'g.')&lt;br /&gt;
ylabel('a)',rotation='horizontal')&lt;br /&gt;
ylim([-1, 1.5])&lt;br /&gt;
&lt;br /&gt;
subplot(3,1,2)&lt;br /&gt;
plot(t,0.5*C1,t,-C2,t,C3)&lt;br /&gt;
ylabel('b)',rotation='horizontal')&lt;br /&gt;
ylim([-1, 1.5])&lt;br /&gt;
&lt;br /&gt;
subplot(3,1,3)&lt;br /&gt;
plot(t,0.5*C1,t,-C2p,t,C3p)&lt;br /&gt;
ylabel('c)',rotation='horizontal')&lt;br /&gt;
ylim([-1, 1.5])&lt;br /&gt;
&lt;br /&gt;
show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Zmiana jednej komponenty może powodować zmiany w amplitudzie i latencji więcej niż jednego załamka.====&lt;br /&gt;
Poniższy rysunek przedstawia sytuację gdy zmiana amplitudy jednego komponentu może znacząco wpływać na amplitudę i latencję innych załamków.&lt;br /&gt;
&lt;br /&gt;
[[Plik:Sumowanie_komponentow2.png|center|thumb|768px| Panel a) przedstawia dwie hipotetyczne krzywe ERP, panel b) panel b i c komponenty z których powstały owe krzywe. Zmiana amplitudy komponentu oznaczonego kolorem powoduje zmianę amplitudy oznaczonych załamków ale także zmianę latencji wcześniejszego załamka. ]]&lt;br /&gt;
Poniżej kod odtwarzający powyższy przykład:&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
from __future__ import division&lt;br /&gt;
import numpy as np&lt;br /&gt;
from matplotlib.pyplot import plot, show, subplot, figure, title, xlabel, ylabel, ylim&lt;br /&gt;
&lt;br /&gt;
Fs = 1&lt;br /&gt;
t = np.arange(0,700)&lt;br /&gt;
&lt;br /&gt;
C1 = np.exp(-(t-100)**2/(2*30**2))&lt;br /&gt;
C2 = np.exp(-(t-200)**2/(2*50**2))&lt;br /&gt;
C3 = np.exp(-(t-350)**2/(2*100**2))&lt;br /&gt;
ERP1 = 0.5*C1-C2+C3&lt;br /&gt;
ERP2 = 0.5*C1-C2+1.5*C3&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
subplot(3,1,1)&lt;br /&gt;
plot(t,ERP1,'b', t,ERP2,'g')&lt;br /&gt;
plot(t[np.argmin(ERP1)],np.min(ERP1),'r.' )&lt;br /&gt;
plot(t[np.argmax(ERP1)],np.max(ERP1),'m.' )&lt;br /&gt;
plot(t[np.argmin(ERP2)],np.min(ERP2),'r.' )&lt;br /&gt;
plot(t[np.argmax(ERP2)],np.max(ERP2),'m.' )&lt;br /&gt;
&lt;br /&gt;
ylabel('a)',rotation='horizontal')&lt;br /&gt;
ylim([-1, 1.6])&lt;br /&gt;
&lt;br /&gt;
subplot(3,1,2)&lt;br /&gt;
plot(t,0.5*C1,'k',t,-C2,'k',t,C3,'b')&lt;br /&gt;
ylabel('b)',rotation='horizontal')&lt;br /&gt;
ylim([-1, 1.6])&lt;br /&gt;
&lt;br /&gt;
subplot(3,1,3)&lt;br /&gt;
plot(t,0.5*C1,'k',t,-C2,'k',t,1.5*C3,'g')&lt;br /&gt;
ylabel('c)',rotation='horizontal')&lt;br /&gt;
ylim([-1, 1.6])&lt;br /&gt;
&lt;br /&gt;
show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Instrukcje do ćwiczeń =&lt;br /&gt;
&lt;br /&gt;
==Zadanie 1: uśrednianie symulowanych sygnałów==&lt;br /&gt;
w tym ćwiczeniu chcemy pokazać efekty:&lt;br /&gt;
# uśredniania sygnałów związanych fazowo z bodźcem i nieskorelowanych z bodźcem / wpływ liczby realizacji,&lt;br /&gt;
# uśredniania sygnałów z fluktuacją latencji,&lt;br /&gt;
# wpływ filtrów o różnych funkcjach odpowiedzi impulsowej na morfologię uśrednionego potencjału.&lt;br /&gt;
&lt;br /&gt;
===Sygnały testowe===&lt;br /&gt;
Proszę zaimplementować funkcje generujące następujące przebiegi czasowe (oznaczenia: ''F&amp;lt;sub&amp;gt;s&amp;lt;/sub&amp;gt;'' &amp;amp;mdash; częstość próbkowania, ''T'' &amp;amp;mdash; czas trwania w sekundach, [[%C4%86wiczenia_1#Sygna.C5.82y_testowe|analogicznie do tego]]):&lt;br /&gt;
* sinusoida o zadanej częstości ''f'' i fazie &amp;lt;math&amp;gt;\phi&amp;lt;/math&amp;gt;: &amp;lt;tt&amp;gt;y = sin(f, phi, Fs, T)&amp;lt;/tt&amp;gt;,&lt;br /&gt;
* funkcja Gaussa o zadanym położeniu i szerokości &amp;lt;tt&amp;gt;y = g_1(t0, sigma, Fs, T) &amp;lt;/tt&amp;gt;&lt;br /&gt;
: &amp;lt;math&amp;gt;g_1(t) = \exp\left(-\frac{(t-t_0)^2}{2 \sigma^2}\right)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* pochodną funkcji Gaussa o zadanym położeniu i szerokości &amp;lt;tt&amp;gt;y = g_2(t0, sigma, Fs, T)&amp;lt;/tt&amp;gt;,&lt;br /&gt;
* połowę funkcji Gaussa o zadanym położeniu i szerokości &amp;lt;tt&amp;gt;y = g_3(t0, sigma, Fs, T)&amp;lt;/tt&amp;gt;,&lt;br /&gt;
: &amp;lt;math&amp;gt;g_{3}(t) = \left\{ &lt;br /&gt;
\begin{array}{lll}&lt;br /&gt;
0 &amp;amp; \mathrm{dla}&amp;amp; t&amp;lt;t_0 \\&lt;br /&gt;
\exp\left(-\frac{(t-t_0)^2}{2 \sigma^2}\right)&amp;amp; \mathrm{dla}&amp;amp; t \ge t_0  &lt;br /&gt;
\end{array}&lt;br /&gt;
\right. &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
W dalszych zadaniach tej sekcji przyjmiemy:&lt;br /&gt;
* ''T'' = 1 s,&lt;br /&gt;
* ''F&amp;lt;sub&amp;gt;s&amp;lt;/sub&amp;gt;'' = 128 Hz,&lt;br /&gt;
* ''t''&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; = 0,3 s,&lt;br /&gt;
* &amp;amp;sigma; = 0,02 s.&lt;br /&gt;
&lt;br /&gt;
===Uśrednianie w modelu addytywnym: sygnał + szum===&lt;br /&gt;
Dla funkcji &amp;lt;math&amp;gt;g_1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;g_2&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;g_3&amp;lt;/math&amp;gt;  wykonaj ''N'' symulacji sygnału opisanego daną funkcją z dodanym szumem gaussowskim (&amp;lt;tt&amp;gt;numpy.random.randn&amp;lt;/tt&amp;gt;). Zaobserwuj zmianę wariancji uśrednianego sygnału wraz z ''N''.&lt;br /&gt;
&lt;br /&gt;
===Uśrednianie w modelu addytywnym: sygnał + szum + niezależna czynność rytmiczna===&lt;br /&gt;
Powtórz poprzednie symulacje dokładając w każdej realizacji sinusoidę o losowo wybranej fazie. Symulacje wykonaj dla różnych częstości sinusoidy, takich których połówka okresu zbliżona jest do szerokości funkcji Gaussa, oraz znacząco od niej różnych.&lt;br /&gt;
&lt;br /&gt;
===Uśrednianie w modelu z resetem fazy===&lt;br /&gt;
Zbuduj sygnał składający się z dwóch fragmentów sinusoidy o częstości ''f'': &lt;br /&gt;
* pierwszy fragment ma losową fazę,&lt;br /&gt;
* drugi fragment ma fazę równą 0.&lt;br /&gt;
Wykonaj ''N'' realizacji takiego sygnału, przy czym każda realizacja ma częstość losowaną z rozkładu Gaussa o średniej 10 i pewnej wariancji (czyli &amp;lt;math&amp;gt;f \in \mathrm{N}(10,\sigma)&amp;lt;/math&amp;gt;). &lt;br /&gt;
Uśrednij otrzymane realizacje. Zaobserwuj zależność średniej od liczby uśrednianych realizacji i od wariancji częstości.&lt;br /&gt;
&lt;br /&gt;
===Uśrednianie potencjału z fluktuacją latencji===&lt;br /&gt;
Wygeneruj sygnały składające się z funkcji &amp;lt;math&amp;gt;g_1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;g_2&amp;lt;/math&amp;gt; albo &amp;lt;math&amp;gt;g_3&amp;lt;/math&amp;gt; z fluktuującą latencją, tzn. z wartością &amp;lt;math&amp;gt;t_0&amp;lt;/math&amp;gt; pochodzącą z jakiegoś rozkładu prawdopodobieństwa. U nas dla ustalenia uwagi niech będzie to rozkład Gaussa. Wykonaj zestaw symulacji obrazujący zależność od liczby realizacji i od wielkości fluktuacji, mierzonej przez wariancję rozkładu. Czy jest związek pomiędzy wariancją fluktuacji &amp;lt;math&amp;gt;t_0&amp;lt;/math&amp;gt; a szerokością załamków?&lt;br /&gt;
&lt;br /&gt;
===Wpływ filtrów===&lt;br /&gt;
# Zaprojektuj następujące filtry (przyjmij częstość próbkowania 128 Hz):&lt;br /&gt;
#* dolnoprzepustowy: Butterwortha z częstością odcięcia: 30, 40, 50 Hz, i rzędach od 1 do 5 (funkcja butter w module scipy.signal),&lt;br /&gt;
#* górnoprzepustowy: Butterwortha z częstością odcięcia: 0,1, 0,5, 2 i 5 Hz, i rzędach od 1 do 5,&lt;br /&gt;
#* notch: Czybyszewa II rodzaju z pasmem zaporowym ustawionym na 50 Hz, i rzędach od 1 do 3 (funkcja cheby2),&lt;br /&gt;
# Zbadaj funkcję odpowiedzi impulsowej i funkcję przenoszenia tych filtrów (w skali dB). Zaobserwuj jak długa jest odpowiedź impulsowa i jak daleko od częstości odcięcia zaburzone jest pasmo przenoszenia.&lt;br /&gt;
# Zastosuj powyższe filtry do funkcji &amp;lt;math&amp;gt;g_1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;g_2&amp;lt;/math&amp;gt; albo &amp;lt;math&amp;gt;g_3&amp;lt;/math&amp;gt;. Filtrowanie przeprowadź w jedną (lfilter) oraz w dwie strony (filtfilt). Zaobserwuj związek między zniekształceniem wprowadzanym przez filtr a funkcją odpowiedzi impulsowej filtru.&lt;br /&gt;
# W ćwiczeniu tym posłuż się symulowanymi sygnałami uzyskanymi z modelu addytywnego: &amp;amp;bdquo;sygnał+szum&amp;amp;rdquo;. Dla funkcji &amp;lt;math&amp;gt;g_1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;g_2&amp;lt;/math&amp;gt; albo &amp;lt;math&amp;gt;g_3&amp;lt;/math&amp;gt;  wykonaj ''N'' = 60 realizacji sygnału opisanego daną funkcją z dodanym szumem gaussowskim (&amp;lt;tt&amp;gt;numpy.random.randn&amp;lt;/tt&amp;gt;). Każdą z realizacji przefiltruj, a następnie uśrednij uzyskane sygnały.&lt;br /&gt;
&lt;br /&gt;
==Zadanie 2: rejestracje i analiza potencjałów wzrokowych==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;! -- ===Synchronizacja występowania bodźców z sygnałem EEG===&lt;br /&gt;
&lt;br /&gt;
Rejestracja potencjałów wywołanych jest przykładem pomiaru czynności elektrycznej mózgu w odpowiedzi na określony bodziec. W przypadku tego rodzaju pomiarów konieczna jest synchronizacja momentu wystąpienia bodźca z sygnałem EEG. Wzmacniacze do pomiaru czynności elektrycznej mózgu wyposażone są w specjalne wejścia, na które można podawać sygnał odpowiadający pojawianiu się bodźca. Jak pamiętamy z zeszłego semestru, wejście to (jak i podawany na nie sygnał) nazywamy trigerem (ang. ''trigger'' &amp;amp;mdash; spust, cyngiel, wyzwalacz). W najprostszym przypadku, bodziec moglibyśmy wyświetlać na monitorze komputerowym, a sygnał związany z jego wystąpieniem wysyłać przez któryś z portów komputera (LPT, COM) na wzmacniacz EEG. Niestety, obecnie dostępne i popularne systemy operacyjne, takie jak Windows czy Linux nie są systemami czasu rzeczywistego (http://pl.wikipedia.org/wiki/System_operacyjny_czasu_rzeczywistego). Od momentu wyświetlania bodźca na ekranie, do pojawiania się sygnału odpowiednim porcie komputerowym może upłynąć kilkadziesiąt milisekund i co gorsza czas ten zwykle jest losowy. W przypadku gdy wzmacniacz próbkuje sygnał z częstością 1000 Hz, moment wystąpienia bodźca możemy określić z dokładnością 1 ms, jednakże wspomniane opóźnienia w systemie operacyjnym uniemożliwiają to. Ponadto, jak dowiedzieliśmy się w rozdziale wstępnym [http://brain.fuw.edu.pl/edu-wiki/action/edit/EEG:Potencja%C5%82y_wywo%C5%82ane?section=T-1], pierwsze załamki związane z potencjałami wywołanymi pojawiają się już 10 ms po wystąpieniu bodźca. W związku z tym, losowe, rzędu kilkudziesięciu milisekund opóźnienia sygnału określającego moment pojawienia się bodźca względem jego rzeczywistego wystąpienia są niedopuszczalne.&lt;br /&gt;
Istnieją pewne techniki programowania, dzięki którym opisywane opóźnienia można zmniejszyć, jednakże są one bardzo trudne  do realizacji. Ponadto, standardowe porty komputera, takie jak LPT, czy COM zostały zaprojektowane przede wszystkim do sterowania urządzeniami zewnętrznymi, a nie ich zasilania. Przykładowo, jedna linia portu drukarkowego (LPT) może być obciążona prądem nie większym niż 5 mA, podczas gdy do zapalenie zwykłej diody LED potrzeba około 10 mA. Taki pobór prądu możliwy jest do uzyskania z portu USB, jednakże  jest on  wyjątkowo trudny do oprogramowania.  &lt;br /&gt;
W celu ominięcia powyższych niedogodności w Zakładzie Fizyki Biomedycznej UW w przeprowadzanych eksperymentach wykorzystywane są  mikrokontrolery [http://pl.wikipedia.org/wiki/Mikrokontroler], w szczególności ATmega16 i ATmega32.  Mikrokontrolery te wyposażone są w procesory o architekturze RISC [http://pl.wikipedia.org/wiki/RISC] i mocy obliczeniowej porównywalnej z szeroko stosowanym kiedyś w komputerach ZX Spectrum, Commodore, Amiga i Atari procesorem Z80. Oprócz jednostki centralnej mikrokontrolery zawierają   stałą pamięć FLASH przeznaczoną do przechowywania kodu programu, pamięć  RAM i pamięć EEPROM, liczniki 8- i 16-bitowe, komparatory, przetworniki analogowo-cyfrowe, porty wejścia/wyjścia, łącze RS232 (popularnie nazywane portem szeregowym) i układy przerwań.&lt;br /&gt;
&lt;br /&gt;
Mikrokontrolery wchodzące w skład zestawów pomiarowych na Pracowni EEG zawierają program, który umożliwia komunikację z nimi poprzez port szeregowy. Obecnie, komputery są coraz rzadziej wyposażane w porty szeregowe. Standard komunikacji RS-232, opracowany w 1962 roku  nadal jest jednak popularny i często wykorzystywany do komunikacji miedzy urządzeniami.  W celu połączenia komputera posiadającego tylko porty USB z mikrokontrolerem zastosowano przejściówkę USB/RS-232. &lt;br /&gt;
&lt;br /&gt;
Jak każde urządzenie w systemie Linuks, przejściówka USB/RS-232 widoczna jest jako plik, znajdujący się w katalogu &amp;lt;tt&amp;gt;/dev&amp;lt;/tt&amp;gt;. Nazwy plików obsługujących urządzenia szeregowe to &amp;lt;tt&amp;gt;ttyXY&amp;lt;/tt&amp;gt;, gdzie &amp;lt;tt&amp;gt;XY&amp;lt;/tt&amp;gt; to kolejny numer przydzielony do urządzenia szeregowego.&lt;br /&gt;
Do komunikacji komputera z mikroknotrolerem  w Zakładzie Fizyki Biomedycznej UW została napisana prosta biblioteka.  Jej użycie jest następujące:&lt;br /&gt;
* Po podłączeniu przejściówki USB/RS232 do komputera mikrokontrolera sprawdź jaki plik w katalogu &amp;lt;tt&amp;gt;/dev&amp;lt;/tt&amp;gt; został utworzony i przydzielony do urządzenia. &lt;br /&gt;
* Zaimportuj bibliotekę do komunikacji z mikrokontrolerem: &lt;br /&gt;
: &amp;lt;tt&amp;gt;import SerialPort as SP&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Otwórz plik powiązany z urządzeniem zewnętrznym:&lt;br /&gt;
: &amp;lt;tt&amp;gt;sp = SP.SerialPort(nazwa_pliku) &amp;lt;/tt&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
: &amp;lt;tt&amp;gt;sp.open()&amp;lt;/tt&amp;gt;&lt;br /&gt;
W naszym przypadku prawidłowa nazwa pliku to &amp;lt;tt&amp;gt;/dev/ttyUSB0&amp;lt;/tt&amp;gt;.&lt;br /&gt;
* Po włączeniu zasilania mikrokontrolera, diody podłączone do niego i wykorzystywane w eksperymencie z potencjałami wywołanymi będą zapalone. Następujące polecenie zgasi obydwie diody:&lt;br /&gt;
: &amp;lt;tt&amp;gt;sp.blinkP300([0, 0])&amp;lt;/tt&amp;gt;&lt;br /&gt;
* Wydanie poniższego polecenia spowoduje, iż mikrokontroler zapali podłączoną do niego diodę numer 1 na czas 100 ms, zaś diodę numer 2 na 200 ms. Jednocześnie, w momencie włączenia jak i wyłączenia diody, sygnał z mikrokontrolera zostanie wysłany na 5-stykowe wejście AUX mikrokontrolera:&lt;br /&gt;
: &amp;lt;tt&amp;gt;sp.blinkP300([100, 200])&amp;lt;/tt&amp;gt;&lt;br /&gt;
* Jeśli chcemy zapalić tylko diodę numer dwa, np. na czas 500 ms w programie podajemy następującą instrukcję:&lt;br /&gt;
: &amp;lt;tt&amp;gt;sp.blinkP300([0, 500])&amp;lt;/tt&amp;gt;&lt;br /&gt;
* Jeśli chcemy zakończyć komunikację z mikrokontrolerem piszemy:&lt;br /&gt;
: &amp;lt;tt&amp;gt;sp.close()&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Kod biblioteki do komunikacji z mikrokontrolerem:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;!--  Kod w Pythonie 2&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# -*- coding: cp1250 -*-&lt;br /&gt;
import serial&lt;br /&gt;
import logging&lt;br /&gt;
import sys&lt;br /&gt;
import os&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def to_hex_word(a):&lt;br /&gt;
    '''encodes a decimal number hexadecimally on two bytes'''&lt;br /&gt;
    return chr(a%256) + chr(a/256)&lt;br /&gt;
&lt;br /&gt;
class SerialPort(object):&lt;br /&gt;
    def __init__(self, port_name):&lt;br /&gt;
        import serial&lt;br /&gt;
        try:&lt;br /&gt;
            self.port = serial.Serial(&lt;br /&gt;
                port=port_name,&lt;br /&gt;
                baudrate=9600,&lt;br /&gt;
                bytesize=serial.EIGHTBITS,&lt;br /&gt;
                parity=serial.PARITY_NONE,&lt;br /&gt;
                stopbits=serial.STOPBITS_ONE,&lt;br /&gt;
                xonxoff=False&lt;br /&gt;
                )&lt;br /&gt;
        except serial.SerialException as e:&lt;br /&gt;
            print(&amp;quot;Nieprawidłowa nazwa portu lub port zajęty.&amp;quot;)&lt;br /&gt;
            raise e&lt;br /&gt;
        self.close()&lt;br /&gt;
        &lt;br /&gt;
    def open(self):&lt;br /&gt;
        self.port.open()&lt;br /&gt;
&lt;br /&gt;
    def close(self):&lt;br /&gt;
        self.port.close()&lt;br /&gt;
&lt;br /&gt;
    def send(self, value):&lt;br /&gt;
        self.port.write(value)&lt;br /&gt;
                           &lt;br /&gt;
    def blinkSSVEP(self,d, p1, p2):&lt;br /&gt;
        '''&lt;br /&gt;
        d = list of frequencies;&lt;br /&gt;
        p1:p2 = ratio LED_on_time/LED_off_time&lt;br /&gt;
        if you want i-th LED to be OFF all the time send  d[i] = 0&lt;br /&gt;
        if you want i-th LED to be ON all the time send  d[i] = -1&lt;br /&gt;
        in these two cases p1 and p2 do not matter&lt;br /&gt;
        '''&lt;br /&gt;
        clock  = 62500&lt;br /&gt;
        factor = float(p1) / float(p1 + p2)&lt;br /&gt;
    &lt;br /&gt;
        str = chr(3) # 'SSVEP_RUN'&lt;br /&gt;
&lt;br /&gt;
        for i in range(len(d)):&lt;br /&gt;
            # i-th LED OFF&lt;br /&gt;
            if d[i] == 0:                       &lt;br /&gt;
                str += to_hex_word(0) + to_hex_word(255) &lt;br /&gt;
            # i-th LED ON&lt;br /&gt;
            elif d[i] == -1:&lt;br /&gt;
                str += to_hex_word(255) + to_hex_word(0)&lt;br /&gt;
                #str = 'S'&lt;br /&gt;
                # i-th LED blinks d[i] times per second&lt;br /&gt;
                # p1:p2 = on_time:off_time in one blink&lt;br /&gt;
            else:&lt;br /&gt;
                period = clock/d[i]&lt;br /&gt;
                bright = int((clock/d[i]) * factor)&lt;br /&gt;
                dark = period - bright&lt;br /&gt;
                str += to_hex_word(bright) + to_hex_word(dark)&lt;br /&gt;
&lt;br /&gt;
        self.send(str)&lt;br /&gt;
&lt;br /&gt;
    def blinkP300(self,d):&lt;br /&gt;
        clock  = 62500&lt;br /&gt;
        str = chr(4) # 'P300_RUN'&lt;br /&gt;
&lt;br /&gt;
        for i in range(len(d)):&lt;br /&gt;
            period = int(clock*d[i]/1000.0)&lt;br /&gt;
            str += to_hex_word(period)&lt;br /&gt;
            print(period)&lt;br /&gt;
&lt;br /&gt;
        self.send(str)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
--&amp;gt; &amp;lt;!-- Kod w Pythonie 3 --&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# -*- coding: cp1250 -*-&lt;br /&gt;
import serial&lt;br /&gt;
import logging&lt;br /&gt;
import sys&lt;br /&gt;
import os&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
def to_hex_word(a):&lt;br /&gt;
    '''encodes a decimal number hexadecimally on two bytes'''&lt;br /&gt;
    return a.to_bytes(2,byteorder=sys.byteorder)&lt;br /&gt;
 &lt;br /&gt;
class SerialPort(object):&lt;br /&gt;
    def __init__(self, port_name):&lt;br /&gt;
        import serial&lt;br /&gt;
        try:&lt;br /&gt;
            self.port = serial.Serial(&lt;br /&gt;
                port=port_name,&lt;br /&gt;
                baudrate=9600,&lt;br /&gt;
                bytesize=serial.EIGHTBITS,&lt;br /&gt;
                parity=serial.PARITY_NONE,&lt;br /&gt;
                stopbits=serial.STOPBITS_ONE,&lt;br /&gt;
                xonxoff=False&lt;br /&gt;
                )&lt;br /&gt;
        except serial.SerialException as e:&lt;br /&gt;
            print(&amp;quot;Nieprawidłowa nazwa portu lub port zajęty.&amp;quot;)&lt;br /&gt;
            raise e&lt;br /&gt;
        self.close()&lt;br /&gt;
 &lt;br /&gt;
    def open(self):&lt;br /&gt;
        self.port.open()&lt;br /&gt;
 &lt;br /&gt;
    def close(self):&lt;br /&gt;
        self.port.close()&lt;br /&gt;
 &lt;br /&gt;
    def send(self, value):&lt;br /&gt;
        self.port.write(value)&lt;br /&gt;
 &lt;br /&gt;
    def blinkSSVEP(self,d, p1, p2):&lt;br /&gt;
        '''&lt;br /&gt;
        d = list of frequencies;&lt;br /&gt;
        p1:p2 = ratio LED_on_time/LED_off_time&lt;br /&gt;
        if you want i-th LED to be OFF all the time send  d[i] = 0&lt;br /&gt;
        if you want i-th LED to be ON all the time send  d[i] = -1&lt;br /&gt;
        in these two cases p1 and p2 do not matter&lt;br /&gt;
        '''&lt;br /&gt;
        clock  = 62500&lt;br /&gt;
        factor = float(p1) / float(p1 + p2)&lt;br /&gt;
 &lt;br /&gt;
        str = (3).to_bytes(1,byteorder=sys.byteorder) # 'SSVEP_RUN'&lt;br /&gt;
 &lt;br /&gt;
        for i in range(len(d)):&lt;br /&gt;
            # i-th LED OFF&lt;br /&gt;
            if d[i] == 0:                       &lt;br /&gt;
                str += to_hex_word(0) + to_hex_word(255) &lt;br /&gt;
            # i-th LED ON&lt;br /&gt;
            elif d[i] == -1:&lt;br /&gt;
                str += to_hex_word(255) + to_hex_word(0)&lt;br /&gt;
                #str = 'S'&lt;br /&gt;
                # i-th LED blinks d[i] times per second&lt;br /&gt;
                # p1:p2 = on_time:off_time in one blink&lt;br /&gt;
            else:&lt;br /&gt;
                period = clock/d[i]&lt;br /&gt;
                bright = int((clock/d[i]) * factor)&lt;br /&gt;
                dark = int(period - bright)&lt;br /&gt;
                str += to_hex_word(bright) + to_hex_word(dark)&lt;br /&gt;
 &lt;br /&gt;
        self.send(str)&lt;br /&gt;
 &lt;br /&gt;
    def blinkP300(self,d):&lt;br /&gt;
        clock  = 62500&lt;br /&gt;
        str = (4).to_bytes(1,byteorder=sys.byteorder) # 'P300_RUN'&lt;br /&gt;
 &lt;br /&gt;
        for i in range(len(d)):&lt;br /&gt;
            period = int(clock*d[i]/1000.0)&lt;br /&gt;
            str += to_hex_word(period)&lt;br /&gt;
 &lt;br /&gt;
        self.send(str)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
--&amp;gt; &lt;br /&gt;
&lt;br /&gt;
===Zestaw eksperymentalny===&lt;br /&gt;
Zestaw składa się ze:&lt;br /&gt;
* wzmacniacza,&lt;br /&gt;
* stymulatora   &lt;br /&gt;
&amp;lt;!--* izolowanego galwanicznie układu generującego impulsy odpowiadające gaszeniu i zapalaniu diody,  o wartościach dopasowanych do akceptowalnych przez wejścia AUX wzmacniacza,--&amp;gt;&lt;br /&gt;
* komputera: w tym eksperymencie komputer będzie służył do zaprogramowania stymulatora i do rejestracji sygnałów.&lt;br /&gt;
&lt;br /&gt;
===Eksperyment 1. Obserwacja bodźca wzrokowego  ===&lt;br /&gt;
&amp;lt;!--Proszę zapoznać się ze standardami rejestracji wzrokowych potencjałów wywołanych [http://www.gcu.ac.uk/media/gcalwebv2/theuniversity/academicschools/sls/psytimetables/SLS%20-%20VEP_Standard_2010.pdf] --&amp;gt;&lt;br /&gt;
Proszę zapoznać się z typowym wyglądem załamków w przypadku potencjałów wzrokowych, jaki jest przedstawiony na [https://link.springer.com/article/10.1007/s10633-009-9195-4/figures/2 rysunku] (cały artykuł jest dostępny [http://link.springer.com/article/10.1007%2Fs10633-009-9195-4 tu]).&lt;br /&gt;
&amp;lt;!--[[Plik:Fig 4 VEP.jpg|thumb|320px|right|&amp;lt;figure id=&amp;quot;fig:zalamki_VEP&amp;quot;&amp;gt;&amp;lt;/figure&amp;gt;&lt;br /&gt;
&amp;lt;xr id=&amp;quot;fig:zalamki_VEP&amp;quot;&amp;gt;Rys. %i.&amp;lt;/xr&amp;gt; Schemat załamków rozpoznawanych we wzrokowych potencjach wywołanych (z pracy: J. V. Odom i in. &amp;amp;bdquo;ISCEV standard for clinical visual evoked potentials&lt;br /&gt;
(2009 update)&amp;amp;rdquo;, Doc Ophthalmol (2010), 120:111–119).]]&lt;br /&gt;
--&amp;gt; &lt;br /&gt;
&lt;br /&gt;
==== Rejestracja ====&lt;br /&gt;
* Paradygmat: z odległości około 40 cm badany obserwuje wyświetalny na ekranie biały kwadrat. Bodźce trwają 300 ms i  powtarzają się co 0.5 sekundy. Bodziec poprzedza punkt fiksacji pokazywany przez 300 ms. Natężenie bodźca ma przyjąć jedną z 4 wartości (manipulujemy jego przeźroczystością: 1, 0.7, 0.3 i 0.1, gdzie 1 oznacza brak przeźroczystości). Każda z intensywności bodźca ma pojawić się 100 razy podczas badania, bodźce podawane mają być w sposób losowy. Zadanie poprzedza krótka instrukcja, kończy podziękowanie. &lt;br /&gt;
&lt;br /&gt;
* Pomiar&lt;br /&gt;
**Zakładamy czepek i elektrody w systemie 10-20, dbamy o to by opory pomiędzy elektrodami były poniżej 10 k&amp;amp;Omega; i różnice pomiędzy oporami różnych elektrod nie przekraczały 20%. [[Plik:Glowka10-20 ERPy.svg|thumb|600px|right]]&lt;br /&gt;
** Elektrodę GND mocujemy w otworze czepka odpowiadającym pozycji AFz (na linii centralnej 10% w stronę nosa od elektrody Fz) &lt;br /&gt;
** Montujemy także elektrody M1 i M2 i FCz.&lt;br /&gt;
&lt;br /&gt;
==== Analiza ====&lt;br /&gt;
# Filtrujemy sygnał w paśmie 1-20 Hz.&lt;br /&gt;
# Z ciągłego zapisu wycinamy fragmenty od &amp;amp;minus;300 ms do +800 ms (zero oznacza moment wystąpienia bodźca). W czasie wycinania badamy wycinane fragmenty pod względem zakresu amplitudy (wszystkie kanały powinny mieć amplitudę w granicach &amp;amp;plusmn;75 &amp;amp;mu;V) i zawartości artefaktów od mrugania (w tym celu trzeba oglądając sygnał w SVAROG-u ustalić próg na amplitudę sygnału w kanałach Fp1 i Fp2).&lt;br /&gt;
# Uśredniamy wycięte sygnały.&lt;br /&gt;
# Rysujemy średni potencjał we wszystkich kanałach.&lt;br /&gt;
# Pierwszy sposób: Identyfikujemy załamki P1 i N2. Mierzymy amplitudę P1 jako różnicę między ekstremalną wartością załamka N2 a ekstremalną wartością załamka N2. &lt;br /&gt;
# Drugi sposób: Identyfikujemy załamki P1 i N2. Mierzymy amplitudę P1 w stosunku do zera. &lt;br /&gt;
#porównujemy uzyskane amplitudy w 4 warunkach za pomocą odpowiedniego testu statystycznego (porównanie warunków ze skrajnymi wartościami amplitudy - zastosuj test permutacyjny (opisany poniżej) lub test t-Studenta/nieparametryczny odpowiednik). &lt;br /&gt;
&lt;br /&gt;
**Opis testu permutacyjnego &lt;br /&gt;
Pytanie: Czy intensywność bodźca wpływa na amplitudę potencjału P1?&lt;br /&gt;
Jak stwierdzić czy amplitudy załamków P1 istotnie różnią się pomiędzy seriami?&lt;br /&gt;
&lt;br /&gt;
Musimy przeprowadzić test statystyczny. Możemy skonstruować go np. tak:&lt;br /&gt;
Mamy dwa warunki I i II. Jako statystykę przyjmiemy różnicę pomiędzy amplitudą załamka zmierzoną w serii z dwoma diodami (P2&amp;lt;sub&amp;gt;II&amp;lt;/sub&amp;gt;) a amplitudą zmierzoną w serii z jedną diodą (P2&amp;lt;sub&amp;gt;I&amp;lt;/sub&amp;gt;):&lt;br /&gt;
: ''S'' = P2&amp;lt;sub&amp;gt;II&amp;lt;/sub&amp;gt; &amp;amp;minus; P2&amp;lt;sub&amp;gt;I&amp;lt;/sub&amp;gt;&lt;br /&gt;
Postawmy hipotezę zerową, że nie ma różnicy w amplitudzie pomiędzy warunkiem II a I oraz hipotezę alternatywną, że różnica taka występuje.&lt;br /&gt;
: H&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;: ''S'' = 0&lt;br /&gt;
: H&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;: ''S'' &amp;amp;ne; 0&lt;br /&gt;
Zgodnie z H&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; dla wartości ''S'' nie ma różnicy czy realizacja została zarejestrowana w warunkach I czy II, zatem można losowo poprzypisywać numery warunków do realizacji i w ten sposób uzyskać rozkład statystyki ''S'' pod warunkiem prawdziwości H&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;, czyli obliczyć średnie potencjały dla &amp;amp;bdquo;pomieszanych&amp;amp;rdquo; tagów, wyliczyć średnie potencjały dla sztucznie wygenerowaych grup, i wyliczyć różnicę amplitud dla tych średnich, czyli wartość statystyki dla hipotezy H&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Zaimplementuj test permutacyjny zgodny z powyższą koncepcją.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- ===Wersja 2: obserwacja habituacji / uśrednianie w blokach ===&lt;br /&gt;
==== Rejestracja ====&lt;br /&gt;
# Paradygmat: &lt;br /&gt;
#* z odległości około 40 cm badany obserwuje błyski diody. &lt;br /&gt;
#* Błyski powtarzają się co 0,5 sekundy. &lt;br /&gt;
#* Rejestrujemy 60 serii po 15 błysków.  &lt;br /&gt;
#* Pomiędzy seriami badany odpoczywa około 10 sekund.&lt;br /&gt;
# Zakładamy czepek i elektrody w systemie 10-20, dbamy o to by opory pomiędzy elektrodami były poniżej 5 k&amp;amp;Omega; i różnice pomiędzy oporami różnych elektrod nie przekraczały 20%.&lt;br /&gt;
#* Elektrodę GND mocujemy w otworze czepka odpowiadającym pozycji AFz (na linii centralnej 10% w stronę nosa od elektrody Fz) &lt;br /&gt;
#* Montujemy także elektrodę FCz (na linii centralnej pomiędzy Fz a Cz), będziemy jej używać w montażu i w czasie analizy jako referencji.&lt;br /&gt;
#* Częstość próbkowania 512 Hz.&lt;br /&gt;
&lt;br /&gt;
==== Analiza ====&lt;br /&gt;
# Filtrujemy sygnał w paśmie 0,1-20 Hz.&lt;br /&gt;
# Z ciągłego zapisu wycinamy fragmenty od &amp;amp;minus;300 ms do +600 ms (zero oznacza moment wystąpienia bodźca). W czasie wycinania badamy wycinane fragmenty pod względem zakresu amplitudy (wszystkie kanały powinny mieć amplitudę w granicach &amp;amp;plusmn;75 &amp;amp;mu;V) i zawartości artefaktów od mrugania (w tym celu trzeba oglądając sygnał w SVAROG-u ustalić próg na amplitudę sygnału w kanałach Fp1 i Fp2).&lt;br /&gt;
# Uśredniamy wycięte sygnały o tym samym numerze wewnątrz serii.&lt;br /&gt;
# Rysujemy serie 15 uśrednionych potencjałów dla tego kanału, który wykazywał najsilniejszy potencjał w pierwszej wersji eksperymentu. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Eksperyment 2: rejestracja i analiza potencjału P3 ====&lt;br /&gt;
=====Rejestracja =====&lt;br /&gt;
# Paradygmat: &lt;br /&gt;
#* z odległości około 40 cm badany obserwuje kwadrat, który występuje w dwóch kolorach. &lt;br /&gt;
#* Bodźce trwają 300 ms, poprzedzane punktem fiksacji wyświetlanym na 300 ms, przerwa między próbami jest losowana i wynosi od 0.8-1.2 s.  &lt;br /&gt;
#* Proporcja wystapień bodźców koloru pierwszego i drugiego wynosi 1:5.   &lt;br /&gt;
#* Zadaniem badanego jest liczenie kwadratów w rzadkim kolorze. &lt;br /&gt;
#* Wykonujemy tyle realizacji aby zarejestrować 100 powtórzeń bodźców rzadkich. &lt;br /&gt;
# Zakładamy czepek i elektrody w systemie 10-20, dbamy o to by opory pomiędzy elektrodami były poniżej 5 k&amp;amp;Omega; i różnice pomiędzy oporami różnych elektrod nie przekraczały 20%.&lt;br /&gt;
#* Elektrodę GND mocujemy w otworze czepka odpowiadającym pozycji AFz (na linii centralnej 10% w stronę nosa od elektrody Fz) &lt;br /&gt;
#* Montujemy także elektrody M1 i M2, będziemy ich używać w montażu i w czasie analizy jako referencji typu połączone uszy.&lt;br /&gt;
#* Częstość próbkowania 512 Hz.&lt;br /&gt;
&lt;br /&gt;
===== Analiza =====&lt;br /&gt;
# Filtrujemy sygnał w paśmie 1-20 Hz.&lt;br /&gt;
# Z ciągłego zapisu wycinamy fragmenty od &amp;amp;minus;300 ms do +900 ms (zero oznacza moment wystąpienia bodźca). W czasie wycinania badamy wycinane fragmenty pod względem zakresu amplitudy (wszystkie kanały powinny mieć amplitudę w granicach &amp;amp;plusmn;75 &amp;amp;mu;V) i zawartości artefaktów od mrugania (w tym celu trzeba oglądając sygnał w SVAROG-u ustalić próg na amplitudę sygnału w kanałach Fp1 i Fp2).&lt;br /&gt;
# Uśredniamy osobno realizacje dla każdego koloru kwadratu. &lt;br /&gt;
# Nakładamy na siebie na rysunkach oba typy średnich.&lt;br /&gt;
# wyznaczamy amplitudę P3 i liczymy test statystyczny pomiędzy warunkami&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- ==Ćwiczenie dodatkowe: P300 BCI==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wykorzystujemy elektrody z systemu 10-10 umieszczone nad korą wzrokową: P07, O1, O2, PO8, PO3, PO4, Pz, Cz.&lt;br /&gt;
&lt;br /&gt;
Uruchamiamy &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
obci_gui --presets eeg_workshop&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
i z guzika &amp;amp;bdquo;select amplifier&amp;amp;rdquo; wybieramy właściwy wzmacniacz.&lt;br /&gt;
&lt;br /&gt;
Do kontroli jakości sygnału możemy uruchomić Svaroga.&lt;br /&gt;
&lt;br /&gt;
Dane z kalibracji zapisują się w pliku test1 w katalogu domowym użytkownika, z labiryntu w pliku test2.&lt;br /&gt;
&lt;br /&gt;
Po zakończeniu kalibracji pojawia się napis &amp;amp;bdquo;Trwają obliczenia&amp;amp;rdquo; lub podobny. Odczekujemy kilka minut, aż skończy się peer &amp;amp;bdquo;Calibration&amp;amp;rdquo; (widoczny w obci_gui) i zamykamy okienko klawiszami Alt-F4 lub zatrzymując scenariusz guzikiem &amp;amp;bdquo;Stop&amp;amp;rdquo;. W katalogu domowym pojawi się plik z wynikami kalibracji, co pozwala na uruchomienie scenariusza &amp;amp;bdquo;labirynt&amp;amp;rdquo;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Po zebraniu danych, przed wczytaniem ich do Svaroga należy w tym samym katalogu uruchomić skrypt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
#!/usr/bin/env python&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
&lt;br /&gt;
from obci.analysis.obci_signal_processing.tags import tags_file_writer&lt;br /&gt;
from obci.analysis.obci_signal_processing.read_manager import ReadManager&lt;br /&gt;
&lt;br /&gt;
def main(): &lt;br /&gt;
	file_name = 'test1'&lt;br /&gt;
	&lt;br /&gt;
	mgr = ReadManager(&lt;br /&gt;
		file_name + '.obci.xml',&lt;br /&gt;
		file_name + '.obci.raw',&lt;br /&gt;
		file_name + '.obci.tag')&lt;br /&gt;
	&lt;br /&gt;
	tags = mgr.get_tags()&lt;br /&gt;
	for i in xrange(0, len(tags)):&lt;br /&gt;
		if tags[i]['desc']['index'] == tags[i]['desc']['target']:&lt;br /&gt;
			tags[i]['name'] = 'blink_target'&lt;br /&gt;
		else:&lt;br /&gt;
			tags[i]['name'] = 'blink'&lt;br /&gt;
			&lt;br /&gt;
	tags_writer = tags_file_writer.TagsFileWriter(file_name + '.obci.tag')&lt;br /&gt;
	for tag in tags:&lt;br /&gt;
		tags_writer.tag_received(tag)		&lt;br /&gt;
	tags_writer.finish_saving(0)	&lt;br /&gt;
 &lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Aduszyk</name></author>
		
	</entry>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=Pracownia_EEG/Potencja%C5%82y_wywo%C5%82ane&amp;diff=8977</id>
		<title>Pracownia EEG/Potencjały wywołane</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=Pracownia_EEG/Potencja%C5%82y_wywo%C5%82ane&amp;diff=8977"/>
		<updated>2022-11-08T11:10:31Z</updated>

		<summary type="html">&lt;p&gt;Aduszyk: /* Eksperyment 2: rejestracja i analiza potencjału P3 = */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Pracownia EEG|Pracownia EEG]] / Potencjały wywołane&lt;br /&gt;
&lt;br /&gt;
=Wstęp=&lt;br /&gt;
==Potencjały wywołane==&lt;br /&gt;
=== Wstęp ===&lt;br /&gt;
Potencjały wywołane EEG (ang. ''evoked potentials'', EP) są śladami odpowiedzi mózgu na bodźce. W przypadku MEG poprawnie mówi się o polach wywołanych (ang. ''evoked fields'', EF).&lt;br /&gt;
Zwykle reakcja ta jest mała (wyjątek stanowią [[Elektroencefalografia/Metody_analizy_sygnałów_EEG_-_analiza_w_dziedzinie_czasu |kompleksy K]]) i w zapisie pojedynczej realizacji reakcji na bodziec najczęściej niewidoczna wśród czynności pochodzącej od wielu innych procesów zachodzących w tym samym czasie w mózgu. &lt;br /&gt;
Ich wyodrębnienie z tak zwanego tła EEG/MEG, czyli manifestacji elektrycznej innych, trwających w tym samym czasie w mózgu procesów (aktywny prąd niezależny), wymaga w dniu dzisiejszym zapisu odpowiedzi na szereg powtórzeń tego samego bodźca (&amp;lt;xr id=&amp;quot;fig:EP&amp;quot;&amp;gt;rys. %i&amp;lt;/xr&amp;gt;). Pierwsze potencjały wywołane pokazał pod koniec lat 40-tych Dawson (Dawson 1947) wykonując superpozycję pojedynczych realizacji na kliszy fotograficznej.&lt;br /&gt;
Z czasem skomplikowane urządzenia analogowe zastąpione zostały przez cyfrowe uśrednianie kolejnych fragmentów EEG, zsynchronizowanych według momentu wystąpienia bodźca, łatwo realizowane za pomocą komputera.&lt;br /&gt;
&lt;br /&gt;
[[Grafika:EP.png|thumb|640px|center|&amp;lt;figure id=&amp;quot;fig:EP&amp;quot;&amp;gt;&amp;lt;/figure&amp;gt;&lt;br /&gt;
Uśrednianie potencjałów wywołanych. a) ciągły zapis EEG z wyróżnionymi momentami wystąpienia bodźca (w tym przypadku słuchowego) b) kilkadziesiąt kolejnych odcinków, wyciętych jako sekunda EEG od momentu wystąpienia kolejnych bodźców, ustawione jeden pod drugim c) uśredniony potencjał wywołany &amp;amp;mdash; widać m. in. załamek P300 ok. 300 milisekund po bodźcu]]&lt;br /&gt;
&lt;br /&gt;
Techniki te opierają się na założeniu, że zawarta w EEG odpowiedź mózgu na każdy z kolejnych bodźców jest niezmienna, a EEG odzwierciedlające pozostałe procesy traktowane jest jak nieskorelowany z nią proces stochastyczny. Zależnie od rodzaju potencjałów wywołanych, założenia te są mniej lub bardziej nieuzasadnione; podważa je choćby powszechnie znany efekt habituacji, polegający na osłabieniu późnych potencjałów wywołanych kolejnymi powtórzeniami bodźca.&lt;br /&gt;
&lt;br /&gt;
Istota potencjałów wywołanych jest przedmiotem otwartej dyskusji i dziesiątków prac, dotykających od lat podstawowych w tej dziedzinie pytań: czym jest potencjał wywołany, który widzimy w uśrednionym przebiegu? Czy naprawdę wynika z deterministycznie powtarzanej, jednakowej odpowiedzi pojawiającej się po każdym powtórzeniu bodźca niezależnie od &amp;amp;bdquo;tła&amp;amp;rdquo;, czy może wynika z reorganizacji faz tego właśnie &amp;amp;bdquo;tła&amp;amp;rdquo; EEG, czy może kombinacji tych dwóch efektów? Jest to wspaniałe pole dla zastosowań zaawansowanych metod modelowania i analizy sygnałów. W ostatnich latach powstają dziesiątki prac na ten temat, a od czasu do czasu również krytyczne artykuły wykazujące, że dotychczasowe odkrycia są raczej artefaktami stosowanych metod a nie wynikają z własności analizowanych danych (Yeung et al., 2004). Jak widać jest tu wciąż bardzo wiele do zrobienia, gdyż zrozumienie tego mechanizmu stoi na drodze do &amp;amp;bdquo;świętego Graala&amp;amp;rdquo;, którym w tej dziedzinie jest wyodrębnienie pojedynczych potencjałów wywołanych.&lt;br /&gt;
&lt;br /&gt;
Niezależnie od tego, w neurofizjologii klinicznej nazwą potencjał wywołany określa się krzywą widoczną po uśrednieniu odpowiedzi na kilkanaście do kilku tysięcy bodźców (Szelenberger 2000). Gromadzona od dziesięcioleci wiedza o behawioralnych i klinicznych korelatach potencjałów wywołanych opiera się na rozpoznawaniu w przebiegach uśrednionych tak zwanych załamków, czyli przejściowych wzrostów lub spadków potencjału (na przykład na &amp;lt;xr id=&amp;quot;fig:EP&amp;quot;&amp;gt;rys. %i&amp;lt;/xr&amp;gt; widać załamek P300). Nazwy załamków składają się zwykle z litery &amp;amp;bdquo;P&amp;amp;rdquo; (od ang. ''positive''), jeśli wychylenie jest dodatnie, lub &amp;amp;bdquo;N&amp;amp;rdquo; (od ang. ''negative''), jeśli wychylenie jest ujemne, oraz liczby. Uwaga: &lt;br /&gt;
* Nie ma niestety jednej ustalonej konwencji prezentacji potencjałów koniecznie trzeba więc zwracać uwagę na orientację wykresu, a wykonując wykres samemu - zamieszczać informację o orientacji kierunku dodatniego,gdyż kierunek dodatni może być wykresie skierowany do góry lub do dołu. &lt;br /&gt;
* Liczba następująca po N lub P określa przybliżoną liczbę milisekund od wystąpienia bodźca, czyli tak zwaną latencję. Nie można jednak ścisłego związku między tą liczbą a liczbą milisekund np. potencjał P300 w zależności od szczegółów paradygmatu doświadczalnego może wystąpić znacznie później. np. w eksperymentach językowych zdarza się że P300 występuje później niż N400 :-).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;xr id=&amp;quot;fig:zalamki&amp;quot;&amp;gt;Rys. %i&amp;lt;/xr&amp;gt; przedstawia schematycznie najważniejsze załamki rozpoznawane w potencjałach słuchowych, czyli wywoływanych bodźcem dźwiękowym. Dla potencjałów wzrokowych i somatosensorycznych istnieją podobne klasyfikacje.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Grafika:Zalamki.png|thumb|320px|right|&amp;lt;figure id=&amp;quot;fig:zalamki&amp;quot;&amp;gt;&amp;lt;/figure&amp;gt;&lt;br /&gt;
Orientacyjny schemat załamków rozpoznawanych w słuchowych potencjach wywołanych, na podstawie (Szelenberger 2000). Skala czasu logarytmiczna. Najszybsze (do 12 ms) składowe egzogenne to potencjały pniowe (BAEP), oznaczane jako fale I-VII. Litery &amp;amp;bdquo;P&amp;amp;rdquo; i &amp;amp;bdquo;N&amp;amp;rdquo; oznaczają dodatnie i ujemne wychylenia związane z dalszymi załamkami]]&lt;br /&gt;
&lt;br /&gt;
Najszybsze (czyli o najmniejszej latencji) składowe to potencjały egzogenne, odzwierciedlające wstępne fazy przekazu informacji. W potencjałach słuchowych są to potencjały pnia (ang. ''brainstem auditory evoked potentials'', BAEP), składające się z siedmiu fal występujących pomiędzy 1 a 12 ms od bodźca. Są one generowane np. w nerwie słuchowym czy pniu mózgu, i wykorzystywane w klinicznej diagnostyce integralności dróg słuchowych. Podobnie jak inne wczesne potencjały o latencjach poniżej 100 ms, są praktycznie niezależne od stanu uwagi.&lt;br /&gt;
&lt;br /&gt;
Po potencjałach o średniej latencji (między 12 a 50 ms) zaczynają się późne potencjały słuchowe (od 100 ms od podania bodźca), odzwierciedlające bardziej złożone reakcje na bodziec. Potencjały ok. 100 ms obserwowane w okolicach sensorycznych odzwierciedlają odpowiedź tejże kory na bodziec. Ich amplituda zależy od parametrów fizycznych bodźca oraz od uwagi, np. amplituda załamka N100 wzrasta w stanie skupienia uwagi czy pobudzenia emocjonalnego. Pierwszy i najpopularniejszy całkowicie endogenny załamek to P300, pojawiający się po rozpoznaniu bodźca oczekiwanego, na którym skupiamy uwagę: na przykład, jeśli w serii pojawiających się losowo liter mamy zliczać wystąpienia jednej z nich, to na średniej odpowiedzi na pojawienie się tej litery pojawi się załamek P300. Załamek ten występuje również w odpowiedzi na bodźce wyczekiwane, niespodziewane i ważne dla osoby (np. własne imię). &lt;br /&gt;
&lt;br /&gt;
=== Uśrednianie w dziedzinie czasu ===&lt;br /&gt;
Jak już było wspomniane powyżej podstawową techniką stosowaną do analizy potencjałów wywołanych jest uśrednianie wielu realizacji odpowiedzi na bodziec wyrównanych względem jakiegoś charakterystycznego zdarzenia, np. momentu podania bodźca albo momentu behawioralnej reakcji na bodziec (np. wciśnięcie przycisku). Podejście to bazuje na trzech założeniach:&lt;br /&gt;
* Reakcja jest czasowo związana z bodźcem. Tzn. w kolejnych realizacjach występuje ona zawsze z tym samym opóźnieniem.&lt;br /&gt;
* Reakcja na bodziec skutkuje zawsze pojawieniem się w sygnale składowej o stałym kształcie (mówimy o stałej morfologii).&lt;br /&gt;
* Spontaniczna czynność EEG &amp;amp;mdash; ta która nie dotyczy przetwarzania interesującego nas bodźca &amp;amp;mdash; jest niezależnym, stacjonarnym szumem o średniej zero.&lt;br /&gt;
&lt;br /&gt;
Zgodnie z powyższymi założeniami mierzony w ''i''-tej realizacji sygnał można wyrazić jako:&lt;br /&gt;
: &amp;lt;math&amp;gt;x_i(t) = s(t) + n_i(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
Uśrednianie po ''N'' realizacjach daje:&lt;br /&gt;
: &amp;lt;math&amp;gt;\bar x (t) = \frac{1}{N} \sum_{i=1}^N x_i(t) = \frac{1}{N} \left(N s(t) + \sum_{i=1}^N n_i(t) \right) &amp;lt;/math&amp;gt;&lt;br /&gt;
Wartość oczekiwana średniego sygnału wynosi:&lt;br /&gt;
: &amp;lt;math&amp;gt;\mathrm{E}\left[ \bar x(t) \right] = s(t) &amp;lt;/math&amp;gt;&lt;br /&gt;
gdyż dla szumu o średniej zero mamy:&lt;br /&gt;
: &amp;lt;math&amp;gt;\mathrm{E}\left[\frac{1}{N} \sum_{i=1}^N n_i(t)\right] = 0&amp;lt;/math&amp;gt;.&lt;br /&gt;
Wariancja &amp;lt;math&amp;gt;\bar x(t)&amp;lt;/math&amp;gt; wynosi:&lt;br /&gt;
: &amp;lt;math&amp;gt;\sigma^2_{\bar x(t)} = \mathrm{E} \left[  \left( \frac{1}{N} \sum_{i=1}^N n_i(t)\right)^2 \right] \approx \frac{1}{N} \sigma^2_{n(t)}&amp;lt;/math&amp;gt;&lt;br /&gt;
gdyż &amp;lt;math&amp;gt;s(t)&amp;lt;/math&amp;gt; jest deterministyczne. &lt;br /&gt;
&lt;br /&gt;
Dla potencjałów pojawiających się w pierwszych kilkudziesięciu milisekundach po bodźcu model ten można uznać za poprawny, gdyż wykazują one zależność głównie od parametrów fizycznych bodźca. Dla późniejszych składowych staje się on coraz bardziej wątpliwy ze względu na występujące korelacje ze stanem (np. uwagi) badanego.&lt;br /&gt;
&lt;br /&gt;
Dla późniejszych składowych można by postulować bardziej ogólną wersję modelu potencjału wywołanego:&lt;br /&gt;
: &amp;lt;math&amp;gt;x_i(t) = s_i(t) + n_i(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
Ten model uwidacznia, że do opisu potencjału wywołanego potrzebna jest nie tylko średnia, ale i wyższe momenty rozkładu (np. drugi moment centralny czyli wariancja).&lt;br /&gt;
&lt;br /&gt;
====Wariancja w przypadku szumu skorelowanego ====&lt;br /&gt;
W poprzednim paragrafie pokazaliśmy, że w przypadku niezależnego szumu wariancja uśrednionego sygnału (w danej chwili czasu) maleje jak  &amp;lt;math&amp;gt;\frac{1}{N}&amp;lt;/math&amp;gt;. Jednak w przypadku gdy kolejne próbki szumu są skorelowane (np. występuje silna aktywność rytmiczna alfa) sytuacja się komplikuje. Intuicyjnie łatwo możemy to sobie wyobrazić w granicznym przypadku. Załóżmy, że tło dla  potencjałów o stałej morfologii   stanowi sinusoida. Jeśli będziemy podawać bodźce w odstępach będących wielokrotnością okresu tej sinusoidy to w uśrednianych fragmentach sygnału owa sinusoida jest tak samo powtarzalna jak badany potencjał i uśrednianie nie prowadzi do poprawy stosunku amplitudy sygnału do amplitudy tła. &lt;br /&gt;
&lt;br /&gt;
Stopień zależności pomiędzy próbkami można zmierzyć przy pomocy funkcji autokorelacji. &lt;br /&gt;
Jeśli funkcję autokorelacji przybliżymy przez:&lt;br /&gt;
: &amp;lt;math&amp;gt;R_{xx}(\tau) = \sigma^2 \exp(-\beta |\tau|) \cos(2 \pi f_0 \tau)&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\sigma^2&amp;lt;/math&amp;gt; jest wariancją szumu, &amp;lt;math&amp;gt;f_0&amp;lt;/math&amp;gt; jest średnią częstością aktywności rytmicznej, &amp;lt;math&amp;gt;\beta/ \pi&amp;lt;/math&amp;gt; jest szerokością pasma tej czynności, zaś &amp;lt;math&amp;gt;\tau&amp;lt;/math&amp;gt; opóźnieniem, to wariancję potencjału wywołanego można wyrazić jako&amp;lt;!-- \cite{Spekreijse_1976}--&amp;gt;:&lt;br /&gt;
: &amp;lt;math&amp;gt;\sigma^2_{\bar x(t)} = \frac{\sigma^2}{N} \left[ \frac{1-\exp(-2 \beta T)}{1 - 2 \exp(- \beta T) \cos(2 \pi f_0 T) +\exp(-2 \beta T)} \right]&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; jest odstępem między bodźcami. &lt;br /&gt;
Widać stąd, że obecność czynności rytmicznej w tle wpływa na stosunek sygnału do szumu. Z powyższego równania widać, że stosunek wariancji dąży do &amp;lt;math&amp;gt;\frac{\sigma^2}{N}&amp;lt;/math&amp;gt; gdy &amp;lt;math&amp;gt;\beta T&amp;lt;/math&amp;gt; staje się duże.  &lt;br /&gt;
&lt;br /&gt;
Periodyczna stymulacja może ponadto prowadzić do wzbudzenia czynności rytmicznej o częstości równej częstości pobudzania bądź jej harmonicznej.&lt;br /&gt;
&lt;br /&gt;
===Wariancja latencji===&lt;br /&gt;
&lt;br /&gt;
Jedną z form zmienności potencjału wywołanego w pojedynczych realizacjach jest wariancja latencji. &lt;br /&gt;
[[Grafika:Wariancja_latencji.png|thumb|500px|right|&lt;br /&gt;
Czerwona linia: Uśrednianie 100 potencjałów wywołanych o latncjach z rozkładu normalnego N(300,30 ), Niebieskie linie: przykładowe pojedyncze realizacje wzięte do średniej]]&amp;lt;!--# -*- coding: utf-8 -*-&lt;br /&gt;
from __future__ import division&lt;br /&gt;
import numpy as np&lt;br /&gt;
from matplotlib.pyplot import plot, show ,subplot, figure, title, xlabel, ylabel, ylim&lt;br /&gt;
 &lt;br /&gt;
def fun(t,lat=100):&lt;br /&gt;
    return np.exp(-(t-lat)**2/(2*30**2))&lt;br /&gt;
Fs = 1&lt;br /&gt;
N = 100&lt;br /&gt;
t = np.arange(0,700)&lt;br /&gt;
f = np.zeros((N,700))&lt;br /&gt;
f_sr = np.zeros(t.shape)&lt;br /&gt;
for i in range(N):&lt;br /&gt;
    f[i,:] = fun(t,lat = 300 + 30* np.random.randn())&lt;br /&gt;
for i in range(3):&lt;br /&gt;
    plot(t,f[i,:], 'b')&lt;br /&gt;
plot(t,f.mean(0),'r')&lt;br /&gt;
show()--&amp;gt;&lt;br /&gt;
Zmienność latencji prowadzi do:&lt;br /&gt;
* zmniejszenia amplitudy &amp;lt;math&amp;gt;\bar x&amp;lt;/math&amp;gt;&lt;br /&gt;
* wzrostu rozciągłości czasowej załamka&lt;br /&gt;
&lt;br /&gt;
O tych konsekwencjach zmienności latencji należy w szczególności pamiętać porównując średnie potencjały uzyskane w różnych warunkach eksperymentalnych. Gdy zauważymy, że średnie potencjały różnią się amplitudą należy rozważyć możliwość, że w istocie warunki eksperymentalne wpływają na różnice w wariancji latencji. &lt;br /&gt;
&lt;br /&gt;
Naturalne jest, że zmienność latencji jest bardziej widoczna w przypadku załamków trwających krótko niż w przypadku załamków trwających długo. Wariancja latencji rożnie wraz z jej wartością, stąd wśród późnych składowych potencjałów wywołanych nie obserwuje się komponentów krótkotrwałych.&lt;br /&gt;
&amp;lt;!--====Uśrednianie metodą Woody'ego ====&lt;br /&gt;
&lt;br /&gt;
Model potencjału ze zmienną latencją i sposób na jego efektywniejsze uśrednianie zaproponował Woody (1967). Model ten zakłada, że w każdej realizacji występuje komponent addytywny &amp;lt;math&amp;gt;s_i(t)\;&amp;lt;/math&amp;gt;, który co do kształtu jest stały, a pomiędzy realizacjami różni się tylko latencją:&lt;br /&gt;
: &amp;lt;math&amp;gt; s_i(t) = s(t +\Delta t_i)\;&amp;lt;/math&amp;gt;&lt;br /&gt;
Woody zaproponował aby &amp;lt;math&amp;gt;\Delta t_i\;&amp;lt;/math&amp;gt; szacować na podstawie maksimum funkcji korelacji wzajemnej pomiędzy ''i''-tą realizacją a wzorcem. W pierwszym kroku wzorcem jest średni potencjał uzyskany przez proste uśrednienie realizacji.  Następnie w sposób iteracyjny dokonuje się:&lt;br /&gt;
* poprawek w wyrównaniu poszczególnych realizacji,&lt;br /&gt;
* obliczenia nowego wzorca poprzez uśrednienie realizacji po korekcie wyrównania,&lt;br /&gt;
* obliczenia nowych poprawek do wyrównania realizacji.--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Habituacja ===&lt;br /&gt;
Zmienność w odpowiedziach na kolejno występujące po sobie bodźce można podzielić na komponent stochastyczny i deterministyczny. Komponent deterministyczny odzwierciedla zmianę czułości  układu nerwowego  na kolejne bodźce. Nowy bodziec często wywołuje reakcje pobudzenia widoczną w wielu parametrach takich jak przewodnictwo skóry, rytm serca i reaktywność kory mózgowej. Powszechnie obserwowanym zjawiskiem jest spadek reaktywności na powtarzające się bodźce zwany habituacją. Niekiedy obserwuje się także zjawisko przeciwne &amp;amp;mdash; wzrost reaktywności na bodziec &amp;amp;mdash; zwane sensytyzacją. &lt;br /&gt;
&lt;br /&gt;
Klasycznym sposobem na badanie tych zjawisk w potencjałach wywołanych jest uśrednianie w podzbiorach lub  uśrednianie blokowe. Wymaga ono  zmiany paradygmatu rejestracji danych. Załóżmy, że interesującym nas bodźcem jest błysk światła. Chcemy zaobserwować ewentualne zmiany amplitudy i latencji w ciągu 100 potencjałów będących reakcją na błysk powtarzający się co 500 ms.&lt;br /&gt;
====Uśrednianie w podzbiorach ====&lt;br /&gt;
W metodzie tej musimy założyć, że proces habituacji jest powolny, tzn. zmiany pomiędzy kolejnymi reakcjami są bardzo małe. W takim przypadku możemy podzielić długą serię bodźców na ciąg pod-serii i uśrednienie przeprowadzić dla każdej pod-serii osobno.&lt;br /&gt;
[[Plik:Usrednianie_podzbiory.svg‎|640px|thumb|center|Ilustracja uśredniania w podzbiorach]]&lt;br /&gt;
&lt;br /&gt;
====Uśrednianie blokowe====&lt;br /&gt;
W tym celu eksperyment wykonujemy w wielu seriach. Jedna seria składa się ze 100 błysków powtarzanych co 500 ms.  Po serii następuje przerwa trwająca np. 5 s (długość przerwy wyraża nasze oszacowanie czasu potrzebnego na zanik habituacji). Po przerwie seria jest powtarzana. Powtórzeń serii wykonujemy ''N''.&lt;br /&gt;
Następnie uśredniamy fragmenty sygnałów odpowiadające sobie w kolejnych seriach. &lt;br /&gt;
&lt;br /&gt;
W tym paradygmacie zakładamy, że każda seria rejestrowana jest w tych samych warunkach. Zaniedbujemy efekty związane ze zmęczeniem i zmianami w np. stopniu koncentracji badanego.&lt;br /&gt;
[[Plik:Usrednianie blokowe.svg|Usrednianie blokowe.svg|640px|thumb|center|Ilustracja uśredniania w blokach]]&lt;br /&gt;
&lt;br /&gt;
===Załamki w krzywej potencjału wywołanego vs ukryte komponenty===&lt;br /&gt;
Komponenta potencjału wywołanego to bardzo ważne ale jednocześnie źle określone pojęcie. Krzywa otrzymana w wyniku uśredniania potencjałów wywołanych przedstawia serię załamków dodatnich i ujemnych, ale trzeba być świadomym, że ten przebieg napięcia rejestrowany przez elektrody przedstawia tak naprawdę sumę potencjałów pochodzących od wielu dość niezależnie działających źródeł w mózgu. Przyczynek pochodzący od jednego funkcjonalnego źródła będziemy określać jako komponentę. &lt;br /&gt;
&lt;br /&gt;
Komentarza wymaga też pojęcie źródła funkcjonalnego. Czynność elektryczną synchronicznie działających neuronów piramidalnych w określonym fragmencie kory mózgowej z pewnej odległości można przybliżyć potencjałem dipola prądowego. Taki aktywny fragment kory stanowi źródło dające przyczynek do mierzonego na powierzchni głowy potencjału. W najprostszej sytuacji taki przyczynek może być obserwowany jako komponenta. Mózg jest jednak obiektem niezwykle złożonym i gęsto połączonym. Wiele obszarów korowych może być funkcjonalnie połączonych i aktywowanych synchronicznie w celu realizacji określonego zadania &amp;amp;mdash; o takim funkcjonalnym zespole też możemy myśleć jako o pojedynczym źródle, choć może ono mieć złożoną strukturę przestrzenną. Często zatem myślimy o komponentach ukrytych potencjału wywołanego jako o aktywności takich funkcjonalnych zespołów. &lt;br /&gt;
&lt;br /&gt;
Po tym wstępie widać już chyba, że do zrozumienia co dzieje się w czasie reakcji na bodziec, którą obserwujemy w potencjale wywołanym, bardziej pożądane byłoby badanie komponent ukrytych niż poszczególnych załamków krzywej potencjału wywołanego, która stanowi ważoną sumę owych komponentów. Zanim przejdziemy do omówienia technik służących &amp;amp;bdquo;wyłuskiwaniu&amp;amp;rdquo; komponent prześledźmy kilka symulacji i wnioski z nich płynące.&lt;br /&gt;
&lt;br /&gt;
==== Załamki i komponenty nie są tym samym.====&lt;br /&gt;
Tę samą krzywą można otrzymać na nieskończenie wiele sposobów  przez sumowanie rożnych kombinacji domniemanych komponentów. Przykładowy rysunek pokazuje, jak tę samą krzywą można złożyć z dwóch rożnych zestawów komponentów (kod wytwarzający przykładową symulację pokazany jest poniżej).&lt;br /&gt;
[[Plik:Sumowanie_komponentow1.png|center|thumb|600px| Panel a) przedstawia hipotetyczną krzywą ERP, panel b) jedna z możliwych dekompozycji sygnału w panelu a), panel c) inna możliwa dekompozycja sygnału z panelu a) ]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
from __future__ import division&lt;br /&gt;
import numpy as np&lt;br /&gt;
from matplotlib.pyplot import plot, show ,subplot, figure, title, xlabel, ylabel, ylim&lt;br /&gt;
&lt;br /&gt;
Fs = 1&lt;br /&gt;
t = np.arange(0,700)&lt;br /&gt;
&lt;br /&gt;
C1 = np.exp(-(t-100)**2/(2*30**2))&lt;br /&gt;
C2 = np.exp(-(t-200)**2/(2*50**2))&lt;br /&gt;
C3 = np.exp(-(t-350)**2/(2*100**2))&lt;br /&gt;
ERP = 0.5*C1-C2+C3&lt;br /&gt;
&lt;br /&gt;
C2p = np.concatenate((C2[0:200], np.ones(30), C2[200:700-30] ))&lt;br /&gt;
C3p = ERP - 0.5*C1 + C2p&lt;br /&gt;
ERP_v2 = 0.5*C1-C2p+C3p&lt;br /&gt;
&lt;br /&gt;
subplot(3,1,1)&lt;br /&gt;
plot(t,ERP, t[::10],ERP_v2[::10],'g.')&lt;br /&gt;
ylabel('a)',rotation='horizontal')&lt;br /&gt;
ylim([-1, 1.5])&lt;br /&gt;
&lt;br /&gt;
subplot(3,1,2)&lt;br /&gt;
plot(t,0.5*C1,t,-C2,t,C3)&lt;br /&gt;
ylabel('b)',rotation='horizontal')&lt;br /&gt;
ylim([-1, 1.5])&lt;br /&gt;
&lt;br /&gt;
subplot(3,1,3)&lt;br /&gt;
plot(t,0.5*C1,t,-C2p,t,C3p)&lt;br /&gt;
ylabel('c)',rotation='horizontal')&lt;br /&gt;
ylim([-1, 1.5])&lt;br /&gt;
&lt;br /&gt;
show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Zmiana jednej komponenty może powodować zmiany w amplitudzie i latencji więcej niż jednego załamka.====&lt;br /&gt;
Poniższy rysunek przedstawia sytuację gdy zmiana amplitudy jednego komponentu może znacząco wpływać na amplitudę i latencję innych załamków.&lt;br /&gt;
&lt;br /&gt;
[[Plik:Sumowanie_komponentow2.png|center|thumb|768px| Panel a) przedstawia dwie hipotetyczne krzywe ERP, panel b) panel b i c komponenty z których powstały owe krzywe. Zmiana amplitudy komponentu oznaczonego kolorem powoduje zmianę amplitudy oznaczonych załamków ale także zmianę latencji wcześniejszego załamka. ]]&lt;br /&gt;
Poniżej kod odtwarzający powyższy przykład:&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
from __future__ import division&lt;br /&gt;
import numpy as np&lt;br /&gt;
from matplotlib.pyplot import plot, show, subplot, figure, title, xlabel, ylabel, ylim&lt;br /&gt;
&lt;br /&gt;
Fs = 1&lt;br /&gt;
t = np.arange(0,700)&lt;br /&gt;
&lt;br /&gt;
C1 = np.exp(-(t-100)**2/(2*30**2))&lt;br /&gt;
C2 = np.exp(-(t-200)**2/(2*50**2))&lt;br /&gt;
C3 = np.exp(-(t-350)**2/(2*100**2))&lt;br /&gt;
ERP1 = 0.5*C1-C2+C3&lt;br /&gt;
ERP2 = 0.5*C1-C2+1.5*C3&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
subplot(3,1,1)&lt;br /&gt;
plot(t,ERP1,'b', t,ERP2,'g')&lt;br /&gt;
plot(t[np.argmin(ERP1)],np.min(ERP1),'r.' )&lt;br /&gt;
plot(t[np.argmax(ERP1)],np.max(ERP1),'m.' )&lt;br /&gt;
plot(t[np.argmin(ERP2)],np.min(ERP2),'r.' )&lt;br /&gt;
plot(t[np.argmax(ERP2)],np.max(ERP2),'m.' )&lt;br /&gt;
&lt;br /&gt;
ylabel('a)',rotation='horizontal')&lt;br /&gt;
ylim([-1, 1.6])&lt;br /&gt;
&lt;br /&gt;
subplot(3,1,2)&lt;br /&gt;
plot(t,0.5*C1,'k',t,-C2,'k',t,C3,'b')&lt;br /&gt;
ylabel('b)',rotation='horizontal')&lt;br /&gt;
ylim([-1, 1.6])&lt;br /&gt;
&lt;br /&gt;
subplot(3,1,3)&lt;br /&gt;
plot(t,0.5*C1,'k',t,-C2,'k',t,1.5*C3,'g')&lt;br /&gt;
ylabel('c)',rotation='horizontal')&lt;br /&gt;
ylim([-1, 1.6])&lt;br /&gt;
&lt;br /&gt;
show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Instrukcje do ćwiczeń =&lt;br /&gt;
&lt;br /&gt;
==Zadanie 1: uśrednianie symulowanych sygnałów==&lt;br /&gt;
w tym ćwiczeniu chcemy pokazać efekty:&lt;br /&gt;
# uśredniania sygnałów związanych fazowo z bodźcem i nieskorelowanych z bodźcem / wpływ liczby realizacji,&lt;br /&gt;
# uśredniania sygnałów z fluktuacją latencji,&lt;br /&gt;
# wpływ filtrów o różnych funkcjach odpowiedzi impulsowej na morfologię uśrednionego potencjału.&lt;br /&gt;
&lt;br /&gt;
===Sygnały testowe===&lt;br /&gt;
Proszę zaimplementować funkcje generujące następujące przebiegi czasowe (oznaczenia: ''F&amp;lt;sub&amp;gt;s&amp;lt;/sub&amp;gt;'' &amp;amp;mdash; częstość próbkowania, ''T'' &amp;amp;mdash; czas trwania w sekundach, [[%C4%86wiczenia_1#Sygna.C5.82y_testowe|analogicznie do tego]]):&lt;br /&gt;
* sinusoida o zadanej częstości ''f'' i fazie &amp;lt;math&amp;gt;\phi&amp;lt;/math&amp;gt;: &amp;lt;tt&amp;gt;y = sin(f, phi, Fs, T)&amp;lt;/tt&amp;gt;,&lt;br /&gt;
* funkcja Gaussa o zadanym położeniu i szerokości &amp;lt;tt&amp;gt;y = g_1(t0, sigma, Fs, T) &amp;lt;/tt&amp;gt;&lt;br /&gt;
: &amp;lt;math&amp;gt;g_1(t) = \exp\left(-\frac{(t-t_0)^2}{2 \sigma^2}\right)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* pochodną funkcji Gaussa o zadanym położeniu i szerokości &amp;lt;tt&amp;gt;y = g_2(t0, sigma, Fs, T)&amp;lt;/tt&amp;gt;,&lt;br /&gt;
* połowę funkcji Gaussa o zadanym położeniu i szerokości &amp;lt;tt&amp;gt;y = g_3(t0, sigma, Fs, T)&amp;lt;/tt&amp;gt;,&lt;br /&gt;
: &amp;lt;math&amp;gt;g_{3}(t) = \left\{ &lt;br /&gt;
\begin{array}{lll}&lt;br /&gt;
0 &amp;amp; \mathrm{dla}&amp;amp; t&amp;lt;t_0 \\&lt;br /&gt;
\exp\left(-\frac{(t-t_0)^2}{2 \sigma^2}\right)&amp;amp; \mathrm{dla}&amp;amp; t \ge t_0  &lt;br /&gt;
\end{array}&lt;br /&gt;
\right. &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
W dalszych zadaniach tej sekcji przyjmiemy:&lt;br /&gt;
* ''T'' = 1 s,&lt;br /&gt;
* ''F&amp;lt;sub&amp;gt;s&amp;lt;/sub&amp;gt;'' = 128 Hz,&lt;br /&gt;
* ''t''&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; = 0,3 s,&lt;br /&gt;
* &amp;amp;sigma; = 0,02 s.&lt;br /&gt;
&lt;br /&gt;
===Uśrednianie w modelu addytywnym: sygnał + szum===&lt;br /&gt;
Dla funkcji &amp;lt;math&amp;gt;g_1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;g_2&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;g_3&amp;lt;/math&amp;gt;  wykonaj ''N'' symulacji sygnału opisanego daną funkcją z dodanym szumem gaussowskim (&amp;lt;tt&amp;gt;numpy.random.randn&amp;lt;/tt&amp;gt;). Zaobserwuj zmianę wariancji uśrednianego sygnału wraz z ''N''.&lt;br /&gt;
&lt;br /&gt;
===Uśrednianie w modelu addytywnym: sygnał + szum + niezależna czynność rytmiczna===&lt;br /&gt;
Powtórz poprzednie symulacje dokładając w każdej realizacji sinusoidę o losowo wybranej fazie. Symulacje wykonaj dla różnych częstości sinusoidy, takich których połówka okresu zbliżona jest do szerokości funkcji Gaussa, oraz znacząco od niej różnych.&lt;br /&gt;
&lt;br /&gt;
===Uśrednianie w modelu z resetem fazy===&lt;br /&gt;
Zbuduj sygnał składający się z dwóch fragmentów sinusoidy o częstości ''f'': &lt;br /&gt;
* pierwszy fragment ma losową fazę,&lt;br /&gt;
* drugi fragment ma fazę równą 0.&lt;br /&gt;
Wykonaj ''N'' realizacji takiego sygnału, przy czym każda realizacja ma częstość losowaną z rozkładu Gaussa o średniej 10 i pewnej wariancji (czyli &amp;lt;math&amp;gt;f \in \mathrm{N}(10,\sigma)&amp;lt;/math&amp;gt;). &lt;br /&gt;
Uśrednij otrzymane realizacje. Zaobserwuj zależność średniej od liczby uśrednianych realizacji i od wariancji częstości.&lt;br /&gt;
&lt;br /&gt;
===Uśrednianie potencjału z fluktuacją latencji===&lt;br /&gt;
Wygeneruj sygnały składające się z funkcji &amp;lt;math&amp;gt;g_1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;g_2&amp;lt;/math&amp;gt; albo &amp;lt;math&amp;gt;g_3&amp;lt;/math&amp;gt; z fluktuującą latencją, tzn. z wartością &amp;lt;math&amp;gt;t_0&amp;lt;/math&amp;gt; pochodzącą z jakiegoś rozkładu prawdopodobieństwa. U nas dla ustalenia uwagi niech będzie to rozkład Gaussa. Wykonaj zestaw symulacji obrazujący zależność od liczby realizacji i od wielkości fluktuacji, mierzonej przez wariancję rozkładu. Czy jest związek pomiędzy wariancją fluktuacji &amp;lt;math&amp;gt;t_0&amp;lt;/math&amp;gt; a szerokością załamków?&lt;br /&gt;
&lt;br /&gt;
===Wpływ filtrów===&lt;br /&gt;
# Zaprojektuj następujące filtry (przyjmij częstość próbkowania 128 Hz):&lt;br /&gt;
#* dolnoprzepustowy: Butterwortha z częstością odcięcia: 30, 40, 50 Hz, i rzędach od 1 do 5 (funkcja butter w module scipy.signal),&lt;br /&gt;
#* górnoprzepustowy: Butterwortha z częstością odcięcia: 0,1, 0,5, 2 i 5 Hz, i rzędach od 1 do 5,&lt;br /&gt;
#* notch: Czybyszewa II rodzaju z pasmem zaporowym ustawionym na 50 Hz, i rzędach od 1 do 3 (funkcja cheby2),&lt;br /&gt;
# Zbadaj funkcję odpowiedzi impulsowej i funkcję przenoszenia tych filtrów (w skali dB). Zaobserwuj jak długa jest odpowiedź impulsowa i jak daleko od częstości odcięcia zaburzone jest pasmo przenoszenia.&lt;br /&gt;
# Zastosuj powyższe filtry do funkcji &amp;lt;math&amp;gt;g_1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;g_2&amp;lt;/math&amp;gt; albo &amp;lt;math&amp;gt;g_3&amp;lt;/math&amp;gt;. Filtrowanie przeprowadź w jedną (lfilter) oraz w dwie strony (filtfilt). Zaobserwuj związek między zniekształceniem wprowadzanym przez filtr a funkcją odpowiedzi impulsowej filtru.&lt;br /&gt;
# W ćwiczeniu tym posłuż się symulowanymi sygnałami uzyskanymi z modelu addytywnego: &amp;amp;bdquo;sygnał+szum&amp;amp;rdquo;. Dla funkcji &amp;lt;math&amp;gt;g_1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;g_2&amp;lt;/math&amp;gt; albo &amp;lt;math&amp;gt;g_3&amp;lt;/math&amp;gt;  wykonaj ''N'' = 60 realizacji sygnału opisanego daną funkcją z dodanym szumem gaussowskim (&amp;lt;tt&amp;gt;numpy.random.randn&amp;lt;/tt&amp;gt;). Każdą z realizacji przefiltruj, a następnie uśrednij uzyskane sygnały.&lt;br /&gt;
&lt;br /&gt;
==Zadanie 2: rejestracje i analiza potencjałów wzrokowych==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;! -- ===Synchronizacja występowania bodźców z sygnałem EEG===&lt;br /&gt;
&lt;br /&gt;
Rejestracja potencjałów wywołanych jest przykładem pomiaru czynności elektrycznej mózgu w odpowiedzi na określony bodziec. W przypadku tego rodzaju pomiarów konieczna jest synchronizacja momentu wystąpienia bodźca z sygnałem EEG. Wzmacniacze do pomiaru czynności elektrycznej mózgu wyposażone są w specjalne wejścia, na które można podawać sygnał odpowiadający pojawianiu się bodźca. Jak pamiętamy z zeszłego semestru, wejście to (jak i podawany na nie sygnał) nazywamy trigerem (ang. ''trigger'' &amp;amp;mdash; spust, cyngiel, wyzwalacz). W najprostszym przypadku, bodziec moglibyśmy wyświetlać na monitorze komputerowym, a sygnał związany z jego wystąpieniem wysyłać przez któryś z portów komputera (LPT, COM) na wzmacniacz EEG. Niestety, obecnie dostępne i popularne systemy operacyjne, takie jak Windows czy Linux nie są systemami czasu rzeczywistego (http://pl.wikipedia.org/wiki/System_operacyjny_czasu_rzeczywistego). Od momentu wyświetlania bodźca na ekranie, do pojawiania się sygnału odpowiednim porcie komputerowym może upłynąć kilkadziesiąt milisekund i co gorsza czas ten zwykle jest losowy. W przypadku gdy wzmacniacz próbkuje sygnał z częstością 1000 Hz, moment wystąpienia bodźca możemy określić z dokładnością 1 ms, jednakże wspomniane opóźnienia w systemie operacyjnym uniemożliwiają to. Ponadto, jak dowiedzieliśmy się w rozdziale wstępnym [http://brain.fuw.edu.pl/edu-wiki/action/edit/EEG:Potencja%C5%82y_wywo%C5%82ane?section=T-1], pierwsze załamki związane z potencjałami wywołanymi pojawiają się już 10 ms po wystąpieniu bodźca. W związku z tym, losowe, rzędu kilkudziesięciu milisekund opóźnienia sygnału określającego moment pojawienia się bodźca względem jego rzeczywistego wystąpienia są niedopuszczalne.&lt;br /&gt;
Istnieją pewne techniki programowania, dzięki którym opisywane opóźnienia można zmniejszyć, jednakże są one bardzo trudne  do realizacji. Ponadto, standardowe porty komputera, takie jak LPT, czy COM zostały zaprojektowane przede wszystkim do sterowania urządzeniami zewnętrznymi, a nie ich zasilania. Przykładowo, jedna linia portu drukarkowego (LPT) może być obciążona prądem nie większym niż 5 mA, podczas gdy do zapalenie zwykłej diody LED potrzeba około 10 mA. Taki pobór prądu możliwy jest do uzyskania z portu USB, jednakże  jest on  wyjątkowo trudny do oprogramowania.  &lt;br /&gt;
W celu ominięcia powyższych niedogodności w Zakładzie Fizyki Biomedycznej UW w przeprowadzanych eksperymentach wykorzystywane są  mikrokontrolery [http://pl.wikipedia.org/wiki/Mikrokontroler], w szczególności ATmega16 i ATmega32.  Mikrokontrolery te wyposażone są w procesory o architekturze RISC [http://pl.wikipedia.org/wiki/RISC] i mocy obliczeniowej porównywalnej z szeroko stosowanym kiedyś w komputerach ZX Spectrum, Commodore, Amiga i Atari procesorem Z80. Oprócz jednostki centralnej mikrokontrolery zawierają   stałą pamięć FLASH przeznaczoną do przechowywania kodu programu, pamięć  RAM i pamięć EEPROM, liczniki 8- i 16-bitowe, komparatory, przetworniki analogowo-cyfrowe, porty wejścia/wyjścia, łącze RS232 (popularnie nazywane portem szeregowym) i układy przerwań.&lt;br /&gt;
&lt;br /&gt;
Mikrokontrolery wchodzące w skład zestawów pomiarowych na Pracowni EEG zawierają program, który umożliwia komunikację z nimi poprzez port szeregowy. Obecnie, komputery są coraz rzadziej wyposażane w porty szeregowe. Standard komunikacji RS-232, opracowany w 1962 roku  nadal jest jednak popularny i często wykorzystywany do komunikacji miedzy urządzeniami.  W celu połączenia komputera posiadającego tylko porty USB z mikrokontrolerem zastosowano przejściówkę USB/RS-232. &lt;br /&gt;
&lt;br /&gt;
Jak każde urządzenie w systemie Linuks, przejściówka USB/RS-232 widoczna jest jako plik, znajdujący się w katalogu &amp;lt;tt&amp;gt;/dev&amp;lt;/tt&amp;gt;. Nazwy plików obsługujących urządzenia szeregowe to &amp;lt;tt&amp;gt;ttyXY&amp;lt;/tt&amp;gt;, gdzie &amp;lt;tt&amp;gt;XY&amp;lt;/tt&amp;gt; to kolejny numer przydzielony do urządzenia szeregowego.&lt;br /&gt;
Do komunikacji komputera z mikroknotrolerem  w Zakładzie Fizyki Biomedycznej UW została napisana prosta biblioteka.  Jej użycie jest następujące:&lt;br /&gt;
* Po podłączeniu przejściówki USB/RS232 do komputera mikrokontrolera sprawdź jaki plik w katalogu &amp;lt;tt&amp;gt;/dev&amp;lt;/tt&amp;gt; został utworzony i przydzielony do urządzenia. &lt;br /&gt;
* Zaimportuj bibliotekę do komunikacji z mikrokontrolerem: &lt;br /&gt;
: &amp;lt;tt&amp;gt;import SerialPort as SP&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Otwórz plik powiązany z urządzeniem zewnętrznym:&lt;br /&gt;
: &amp;lt;tt&amp;gt;sp = SP.SerialPort(nazwa_pliku) &amp;lt;/tt&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
: &amp;lt;tt&amp;gt;sp.open()&amp;lt;/tt&amp;gt;&lt;br /&gt;
W naszym przypadku prawidłowa nazwa pliku to &amp;lt;tt&amp;gt;/dev/ttyUSB0&amp;lt;/tt&amp;gt;.&lt;br /&gt;
* Po włączeniu zasilania mikrokontrolera, diody podłączone do niego i wykorzystywane w eksperymencie z potencjałami wywołanymi będą zapalone. Następujące polecenie zgasi obydwie diody:&lt;br /&gt;
: &amp;lt;tt&amp;gt;sp.blinkP300([0, 0])&amp;lt;/tt&amp;gt;&lt;br /&gt;
* Wydanie poniższego polecenia spowoduje, iż mikrokontroler zapali podłączoną do niego diodę numer 1 na czas 100 ms, zaś diodę numer 2 na 200 ms. Jednocześnie, w momencie włączenia jak i wyłączenia diody, sygnał z mikrokontrolera zostanie wysłany na 5-stykowe wejście AUX mikrokontrolera:&lt;br /&gt;
: &amp;lt;tt&amp;gt;sp.blinkP300([100, 200])&amp;lt;/tt&amp;gt;&lt;br /&gt;
* Jeśli chcemy zapalić tylko diodę numer dwa, np. na czas 500 ms w programie podajemy następującą instrukcję:&lt;br /&gt;
: &amp;lt;tt&amp;gt;sp.blinkP300([0, 500])&amp;lt;/tt&amp;gt;&lt;br /&gt;
* Jeśli chcemy zakończyć komunikację z mikrokontrolerem piszemy:&lt;br /&gt;
: &amp;lt;tt&amp;gt;sp.close()&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Kod biblioteki do komunikacji z mikrokontrolerem:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;!--  Kod w Pythonie 2&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# -*- coding: cp1250 -*-&lt;br /&gt;
import serial&lt;br /&gt;
import logging&lt;br /&gt;
import sys&lt;br /&gt;
import os&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def to_hex_word(a):&lt;br /&gt;
    '''encodes a decimal number hexadecimally on two bytes'''&lt;br /&gt;
    return chr(a%256) + chr(a/256)&lt;br /&gt;
&lt;br /&gt;
class SerialPort(object):&lt;br /&gt;
    def __init__(self, port_name):&lt;br /&gt;
        import serial&lt;br /&gt;
        try:&lt;br /&gt;
            self.port = serial.Serial(&lt;br /&gt;
                port=port_name,&lt;br /&gt;
                baudrate=9600,&lt;br /&gt;
                bytesize=serial.EIGHTBITS,&lt;br /&gt;
                parity=serial.PARITY_NONE,&lt;br /&gt;
                stopbits=serial.STOPBITS_ONE,&lt;br /&gt;
                xonxoff=False&lt;br /&gt;
                )&lt;br /&gt;
        except serial.SerialException as e:&lt;br /&gt;
            print(&amp;quot;Nieprawidłowa nazwa portu lub port zajęty.&amp;quot;)&lt;br /&gt;
            raise e&lt;br /&gt;
        self.close()&lt;br /&gt;
        &lt;br /&gt;
    def open(self):&lt;br /&gt;
        self.port.open()&lt;br /&gt;
&lt;br /&gt;
    def close(self):&lt;br /&gt;
        self.port.close()&lt;br /&gt;
&lt;br /&gt;
    def send(self, value):&lt;br /&gt;
        self.port.write(value)&lt;br /&gt;
                           &lt;br /&gt;
    def blinkSSVEP(self,d, p1, p2):&lt;br /&gt;
        '''&lt;br /&gt;
        d = list of frequencies;&lt;br /&gt;
        p1:p2 = ratio LED_on_time/LED_off_time&lt;br /&gt;
        if you want i-th LED to be OFF all the time send  d[i] = 0&lt;br /&gt;
        if you want i-th LED to be ON all the time send  d[i] = -1&lt;br /&gt;
        in these two cases p1 and p2 do not matter&lt;br /&gt;
        '''&lt;br /&gt;
        clock  = 62500&lt;br /&gt;
        factor = float(p1) / float(p1 + p2)&lt;br /&gt;
    &lt;br /&gt;
        str = chr(3) # 'SSVEP_RUN'&lt;br /&gt;
&lt;br /&gt;
        for i in range(len(d)):&lt;br /&gt;
            # i-th LED OFF&lt;br /&gt;
            if d[i] == 0:                       &lt;br /&gt;
                str += to_hex_word(0) + to_hex_word(255) &lt;br /&gt;
            # i-th LED ON&lt;br /&gt;
            elif d[i] == -1:&lt;br /&gt;
                str += to_hex_word(255) + to_hex_word(0)&lt;br /&gt;
                #str = 'S'&lt;br /&gt;
                # i-th LED blinks d[i] times per second&lt;br /&gt;
                # p1:p2 = on_time:off_time in one blink&lt;br /&gt;
            else:&lt;br /&gt;
                period = clock/d[i]&lt;br /&gt;
                bright = int((clock/d[i]) * factor)&lt;br /&gt;
                dark = period - bright&lt;br /&gt;
                str += to_hex_word(bright) + to_hex_word(dark)&lt;br /&gt;
&lt;br /&gt;
        self.send(str)&lt;br /&gt;
&lt;br /&gt;
    def blinkP300(self,d):&lt;br /&gt;
        clock  = 62500&lt;br /&gt;
        str = chr(4) # 'P300_RUN'&lt;br /&gt;
&lt;br /&gt;
        for i in range(len(d)):&lt;br /&gt;
            period = int(clock*d[i]/1000.0)&lt;br /&gt;
            str += to_hex_word(period)&lt;br /&gt;
            print(period)&lt;br /&gt;
&lt;br /&gt;
        self.send(str)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
--&amp;gt; &amp;lt;!-- Kod w Pythonie 3 --&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# -*- coding: cp1250 -*-&lt;br /&gt;
import serial&lt;br /&gt;
import logging&lt;br /&gt;
import sys&lt;br /&gt;
import os&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
def to_hex_word(a):&lt;br /&gt;
    '''encodes a decimal number hexadecimally on two bytes'''&lt;br /&gt;
    return a.to_bytes(2,byteorder=sys.byteorder)&lt;br /&gt;
 &lt;br /&gt;
class SerialPort(object):&lt;br /&gt;
    def __init__(self, port_name):&lt;br /&gt;
        import serial&lt;br /&gt;
        try:&lt;br /&gt;
            self.port = serial.Serial(&lt;br /&gt;
                port=port_name,&lt;br /&gt;
                baudrate=9600,&lt;br /&gt;
                bytesize=serial.EIGHTBITS,&lt;br /&gt;
                parity=serial.PARITY_NONE,&lt;br /&gt;
                stopbits=serial.STOPBITS_ONE,&lt;br /&gt;
                xonxoff=False&lt;br /&gt;
                )&lt;br /&gt;
        except serial.SerialException as e:&lt;br /&gt;
            print(&amp;quot;Nieprawidłowa nazwa portu lub port zajęty.&amp;quot;)&lt;br /&gt;
            raise e&lt;br /&gt;
        self.close()&lt;br /&gt;
 &lt;br /&gt;
    def open(self):&lt;br /&gt;
        self.port.open()&lt;br /&gt;
 &lt;br /&gt;
    def close(self):&lt;br /&gt;
        self.port.close()&lt;br /&gt;
 &lt;br /&gt;
    def send(self, value):&lt;br /&gt;
        self.port.write(value)&lt;br /&gt;
 &lt;br /&gt;
    def blinkSSVEP(self,d, p1, p2):&lt;br /&gt;
        '''&lt;br /&gt;
        d = list of frequencies;&lt;br /&gt;
        p1:p2 = ratio LED_on_time/LED_off_time&lt;br /&gt;
        if you want i-th LED to be OFF all the time send  d[i] = 0&lt;br /&gt;
        if you want i-th LED to be ON all the time send  d[i] = -1&lt;br /&gt;
        in these two cases p1 and p2 do not matter&lt;br /&gt;
        '''&lt;br /&gt;
        clock  = 62500&lt;br /&gt;
        factor = float(p1) / float(p1 + p2)&lt;br /&gt;
 &lt;br /&gt;
        str = (3).to_bytes(1,byteorder=sys.byteorder) # 'SSVEP_RUN'&lt;br /&gt;
 &lt;br /&gt;
        for i in range(len(d)):&lt;br /&gt;
            # i-th LED OFF&lt;br /&gt;
            if d[i] == 0:                       &lt;br /&gt;
                str += to_hex_word(0) + to_hex_word(255) &lt;br /&gt;
            # i-th LED ON&lt;br /&gt;
            elif d[i] == -1:&lt;br /&gt;
                str += to_hex_word(255) + to_hex_word(0)&lt;br /&gt;
                #str = 'S'&lt;br /&gt;
                # i-th LED blinks d[i] times per second&lt;br /&gt;
                # p1:p2 = on_time:off_time in one blink&lt;br /&gt;
            else:&lt;br /&gt;
                period = clock/d[i]&lt;br /&gt;
                bright = int((clock/d[i]) * factor)&lt;br /&gt;
                dark = int(period - bright)&lt;br /&gt;
                str += to_hex_word(bright) + to_hex_word(dark)&lt;br /&gt;
 &lt;br /&gt;
        self.send(str)&lt;br /&gt;
 &lt;br /&gt;
    def blinkP300(self,d):&lt;br /&gt;
        clock  = 62500&lt;br /&gt;
        str = (4).to_bytes(1,byteorder=sys.byteorder) # 'P300_RUN'&lt;br /&gt;
 &lt;br /&gt;
        for i in range(len(d)):&lt;br /&gt;
            period = int(clock*d[i]/1000.0)&lt;br /&gt;
            str += to_hex_word(period)&lt;br /&gt;
 &lt;br /&gt;
        self.send(str)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
--&amp;gt; &lt;br /&gt;
&lt;br /&gt;
===Zestaw eksperymentalny===&lt;br /&gt;
Zestaw składa się ze:&lt;br /&gt;
* wzmacniacza,&lt;br /&gt;
* stymulatora   &lt;br /&gt;
&amp;lt;!--* izolowanego galwanicznie układu generującego impulsy odpowiadające gaszeniu i zapalaniu diody,  o wartościach dopasowanych do akceptowalnych przez wejścia AUX wzmacniacza,--&amp;gt;&lt;br /&gt;
* komputera: w tym eksperymencie komputer będzie służył do zaprogramowania stymulatora i do rejestracji sygnałów.&lt;br /&gt;
&lt;br /&gt;
===Eksperyment 1. Obserwacja bodźca wzrokowego  ===&lt;br /&gt;
&amp;lt;!--Proszę zapoznać się ze standardami rejestracji wzrokowych potencjałów wywołanych [http://www.gcu.ac.uk/media/gcalwebv2/theuniversity/academicschools/sls/psytimetables/SLS%20-%20VEP_Standard_2010.pdf] --&amp;gt;&lt;br /&gt;
Proszę zapoznać się z typowym wyglądem załamków w przypadku potencjałów wzrokowych, jaki jest przedstawiony na [https://link.springer.com/article/10.1007/s10633-009-9195-4/figures/2 rysunku] (cały artykuł jest dostępny [http://link.springer.com/article/10.1007%2Fs10633-009-9195-4 tu]).&lt;br /&gt;
&amp;lt;!--[[Plik:Fig 4 VEP.jpg|thumb|320px|right|&amp;lt;figure id=&amp;quot;fig:zalamki_VEP&amp;quot;&amp;gt;&amp;lt;/figure&amp;gt;&lt;br /&gt;
&amp;lt;xr id=&amp;quot;fig:zalamki_VEP&amp;quot;&amp;gt;Rys. %i.&amp;lt;/xr&amp;gt; Schemat załamków rozpoznawanych we wzrokowych potencjach wywołanych (z pracy: J. V. Odom i in. &amp;amp;bdquo;ISCEV standard for clinical visual evoked potentials&lt;br /&gt;
(2009 update)&amp;amp;rdquo;, Doc Ophthalmol (2010), 120:111–119).]]&lt;br /&gt;
--&amp;gt; &lt;br /&gt;
&lt;br /&gt;
==== Rejestracja ====&lt;br /&gt;
* Paradygmat: z odległości około 40 cm badany obserwuje wyświetalny na ekranie biały kwadrat. Bodźce trwają 300 ms i  powtarzają się co 0.5 sekundy. Bodziec poprzedza punkt fiksacji pokazywany przez 300 ms. Natężenie bodźca ma przyjąć jedną z 4 wartości (manipulujemy jego przeźroczystością: 1, 0.7, 0.3 i 0.1, gdzie 1 oznacza brak przeźroczystości). Każda z intensywności bodźca ma pojawić się 100 razy podczas badania, bodźce podawane mają być w sposób losowy. Zadanie poprzedza krótka instrukcja, kończy podziękowanie. &lt;br /&gt;
&lt;br /&gt;
* Pomiar&lt;br /&gt;
**Zakładamy czepek i elektrody w systemie 10-20, dbamy o to by opory pomiędzy elektrodami były poniżej 10 k&amp;amp;Omega; i różnice pomiędzy oporami różnych elektrod nie przekraczały 20%. [[Plik:Glowka10-20 ERPy.svg|thumb|600px|right]]&lt;br /&gt;
** Elektrodę GND mocujemy w otworze czepka odpowiadającym pozycji AFz (na linii centralnej 10% w stronę nosa od elektrody Fz) &lt;br /&gt;
** Montujemy także elektrody M1 i M2 i FCz.&lt;br /&gt;
&lt;br /&gt;
==== Analiza ====&lt;br /&gt;
# Filtrujemy sygnał w paśmie 1-20 Hz.&lt;br /&gt;
# Z ciągłego zapisu wycinamy fragmenty od &amp;amp;minus;300 ms do +800 ms (zero oznacza moment wystąpienia bodźca). W czasie wycinania badamy wycinane fragmenty pod względem zakresu amplitudy (wszystkie kanały powinny mieć amplitudę w granicach &amp;amp;plusmn;75 &amp;amp;mu;V) i zawartości artefaktów od mrugania (w tym celu trzeba oglądając sygnał w SVAROG-u ustalić próg na amplitudę sygnału w kanałach Fp1 i Fp2).&lt;br /&gt;
# Uśredniamy wycięte sygnały.&lt;br /&gt;
# Rysujemy średni potencjał we wszystkich kanałach.&lt;br /&gt;
# Pierwszy sposób: Identyfikujemy załamki P1 i N2. Mierzymy amplitudę P1 jako różnicę między ekstremalną wartością załamka N2 a ekstremalną wartością załamka N2. &lt;br /&gt;
# Drugi sposób: Identyfikujemy załamki P1 i N2. Mierzymy amplitudę P1 w stosunku do zera. &lt;br /&gt;
#porównujemy uzyskane amplitudy w 4 warunkach za pomocą odpowiedniego testu statystycznego (porównanie warunków ze skrajnymi wartościami amplitudy - zastosuj test permutacyjny (opisany poniżej) lub test t-Studenta/nieparametryczny odpowiednik). &lt;br /&gt;
&lt;br /&gt;
**Opis testu permutacyjnego &lt;br /&gt;
Pytanie: Czy intensywność bodźca wpływa na amplitudę potencjału P1?&lt;br /&gt;
Jak stwierdzić czy amplitudy załamków P1 istotnie różnią się pomiędzy seriami?&lt;br /&gt;
&lt;br /&gt;
Musimy przeprowadzić test statystyczny. Możemy skonstruować go np. tak:&lt;br /&gt;
Mamy dwa warunki I i II. Jako statystykę przyjmiemy różnicę pomiędzy amplitudą załamka zmierzoną w serii z dwoma diodami (P2&amp;lt;sub&amp;gt;II&amp;lt;/sub&amp;gt;) a amplitudą zmierzoną w serii z jedną diodą (P2&amp;lt;sub&amp;gt;I&amp;lt;/sub&amp;gt;):&lt;br /&gt;
: ''S'' = P2&amp;lt;sub&amp;gt;II&amp;lt;/sub&amp;gt; &amp;amp;minus; P2&amp;lt;sub&amp;gt;I&amp;lt;/sub&amp;gt;&lt;br /&gt;
Postawmy hipotezę zerową, że nie ma różnicy w amplitudzie pomiędzy warunkiem II a I oraz hipotezę alternatywną, że różnica taka występuje.&lt;br /&gt;
: H&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;: ''S'' = 0&lt;br /&gt;
: H&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;: ''S'' &amp;amp;ne; 0&lt;br /&gt;
Zgodnie z H&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; dla wartości ''S'' nie ma różnicy czy realizacja została zarejestrowana w warunkach I czy II, zatem można losowo poprzypisywać numery warunków do realizacji i w ten sposób uzyskać rozkład statystyki ''S'' pod warunkiem prawdziwości H&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;, czyli obliczyć średnie potencjały dla &amp;amp;bdquo;pomieszanych&amp;amp;rdquo; tagów, wyliczyć średnie potencjały dla sztucznie wygenerowaych grup, i wyliczyć różnicę amplitud dla tych średnich, czyli wartość statystyki dla hipotezy H&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Zaimplementuj test permutacyjny zgodny z powyższą koncepcją.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- ===Wersja 2: obserwacja habituacji / uśrednianie w blokach ===&lt;br /&gt;
==== Rejestracja ====&lt;br /&gt;
# Paradygmat: &lt;br /&gt;
#* z odległości około 40 cm badany obserwuje błyski diody. &lt;br /&gt;
#* Błyski powtarzają się co 0,5 sekundy. &lt;br /&gt;
#* Rejestrujemy 60 serii po 15 błysków.  &lt;br /&gt;
#* Pomiędzy seriami badany odpoczywa około 10 sekund.&lt;br /&gt;
# Zakładamy czepek i elektrody w systemie 10-20, dbamy o to by opory pomiędzy elektrodami były poniżej 5 k&amp;amp;Omega; i różnice pomiędzy oporami różnych elektrod nie przekraczały 20%.&lt;br /&gt;
#* Elektrodę GND mocujemy w otworze czepka odpowiadającym pozycji AFz (na linii centralnej 10% w stronę nosa od elektrody Fz) &lt;br /&gt;
#* Montujemy także elektrodę FCz (na linii centralnej pomiędzy Fz a Cz), będziemy jej używać w montażu i w czasie analizy jako referencji.&lt;br /&gt;
#* Częstość próbkowania 512 Hz.&lt;br /&gt;
&lt;br /&gt;
==== Analiza ====&lt;br /&gt;
# Filtrujemy sygnał w paśmie 0,1-20 Hz.&lt;br /&gt;
# Z ciągłego zapisu wycinamy fragmenty od &amp;amp;minus;300 ms do +600 ms (zero oznacza moment wystąpienia bodźca). W czasie wycinania badamy wycinane fragmenty pod względem zakresu amplitudy (wszystkie kanały powinny mieć amplitudę w granicach &amp;amp;plusmn;75 &amp;amp;mu;V) i zawartości artefaktów od mrugania (w tym celu trzeba oglądając sygnał w SVAROG-u ustalić próg na amplitudę sygnału w kanałach Fp1 i Fp2).&lt;br /&gt;
# Uśredniamy wycięte sygnały o tym samym numerze wewnątrz serii.&lt;br /&gt;
# Rysujemy serie 15 uśrednionych potencjałów dla tego kanału, który wykazywał najsilniejszy potencjał w pierwszej wersji eksperymentu. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Eksperyment 2: rejestracja i analiza potencjału P3 ==&lt;br /&gt;
==== Rejestracja ====&lt;br /&gt;
# Paradygmat: &lt;br /&gt;
#* z odległości około 40 cm badany obserwuje kwadrat, który występuje w dwóch kolorach. &lt;br /&gt;
#* Bodźce trwają 300 ms, poprzedzane punktem fiksacji wyświetlanym na 300 ms, przerwa między próbami jest losowana i wynosi od 0.8-1.2 s.  &lt;br /&gt;
#* Proporcja wystapień bodźców koloru pierwszego i drugiego wynosi 1:5.   &lt;br /&gt;
#* Zadaniem badanego jest liczenie kwadratów w rzadkim kolorze. &lt;br /&gt;
#* Wykonujemy tyle realizacji aby zarejestrować 100 powtórzeń bodźców rzadkich. &lt;br /&gt;
# Zakładamy czepek i elektrody w systemie 10-20, dbamy o to by opory pomiędzy elektrodami były poniżej 5 k&amp;amp;Omega; i różnice pomiędzy oporami różnych elektrod nie przekraczały 20%.&lt;br /&gt;
#* Elektrodę GND mocujemy w otworze czepka odpowiadającym pozycji AFz (na linii centralnej 10% w stronę nosa od elektrody Fz) &lt;br /&gt;
#* Montujemy także elektrody M1 i M2, będziemy ich używać w montażu i w czasie analizy jako referencji typu połączone uszy.&lt;br /&gt;
#* Częstość próbkowania 512 Hz.&lt;br /&gt;
&lt;br /&gt;
==== Analiza ===&lt;br /&gt;
# Filtrujemy sygnał w paśmie 1-20 Hz.&lt;br /&gt;
# Z ciągłego zapisu wycinamy fragmenty od &amp;amp;minus;300 ms do +900 ms (zero oznacza moment wystąpienia bodźca). W czasie wycinania badamy wycinane fragmenty pod względem zakresu amplitudy (wszystkie kanały powinny mieć amplitudę w granicach &amp;amp;plusmn;75 &amp;amp;mu;V) i zawartości artefaktów od mrugania (w tym celu trzeba oglądając sygnał w SVAROG-u ustalić próg na amplitudę sygnału w kanałach Fp1 i Fp2).&lt;br /&gt;
# Uśredniamy osobno realizacje dla każdego koloru kwadratu. &lt;br /&gt;
# Nakładamy na siebie na rysunkach oba typy średnich.&lt;br /&gt;
# wyznaczamy amplitudę P3 i liczymy test statystyczny pomiędzy warunkami&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- ==Ćwiczenie dodatkowe: P300 BCI==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wykorzystujemy elektrody z systemu 10-10 umieszczone nad korą wzrokową: P07, O1, O2, PO8, PO3, PO4, Pz, Cz.&lt;br /&gt;
&lt;br /&gt;
Uruchamiamy &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
obci_gui --presets eeg_workshop&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
i z guzika &amp;amp;bdquo;select amplifier&amp;amp;rdquo; wybieramy właściwy wzmacniacz.&lt;br /&gt;
&lt;br /&gt;
Do kontroli jakości sygnału możemy uruchomić Svaroga.&lt;br /&gt;
&lt;br /&gt;
Dane z kalibracji zapisują się w pliku test1 w katalogu domowym użytkownika, z labiryntu w pliku test2.&lt;br /&gt;
&lt;br /&gt;
Po zakończeniu kalibracji pojawia się napis &amp;amp;bdquo;Trwają obliczenia&amp;amp;rdquo; lub podobny. Odczekujemy kilka minut, aż skończy się peer &amp;amp;bdquo;Calibration&amp;amp;rdquo; (widoczny w obci_gui) i zamykamy okienko klawiszami Alt-F4 lub zatrzymując scenariusz guzikiem &amp;amp;bdquo;Stop&amp;amp;rdquo;. W katalogu domowym pojawi się plik z wynikami kalibracji, co pozwala na uruchomienie scenariusza &amp;amp;bdquo;labirynt&amp;amp;rdquo;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Po zebraniu danych, przed wczytaniem ich do Svaroga należy w tym samym katalogu uruchomić skrypt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
#!/usr/bin/env python&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
&lt;br /&gt;
from obci.analysis.obci_signal_processing.tags import tags_file_writer&lt;br /&gt;
from obci.analysis.obci_signal_processing.read_manager import ReadManager&lt;br /&gt;
&lt;br /&gt;
def main(): &lt;br /&gt;
	file_name = 'test1'&lt;br /&gt;
	&lt;br /&gt;
	mgr = ReadManager(&lt;br /&gt;
		file_name + '.obci.xml',&lt;br /&gt;
		file_name + '.obci.raw',&lt;br /&gt;
		file_name + '.obci.tag')&lt;br /&gt;
	&lt;br /&gt;
	tags = mgr.get_tags()&lt;br /&gt;
	for i in xrange(0, len(tags)):&lt;br /&gt;
		if tags[i]['desc']['index'] == tags[i]['desc']['target']:&lt;br /&gt;
			tags[i]['name'] = 'blink_target'&lt;br /&gt;
		else:&lt;br /&gt;
			tags[i]['name'] = 'blink'&lt;br /&gt;
			&lt;br /&gt;
	tags_writer = tags_file_writer.TagsFileWriter(file_name + '.obci.tag')&lt;br /&gt;
	for tag in tags:&lt;br /&gt;
		tags_writer.tag_received(tag)		&lt;br /&gt;
	tags_writer.finish_saving(0)	&lt;br /&gt;
 &lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Aduszyk</name></author>
		
	</entry>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=Pracownia_EEG/Potencja%C5%82y_wywo%C5%82ane&amp;diff=8976</id>
		<title>Pracownia EEG/Potencjały wywołane</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=Pracownia_EEG/Potencja%C5%82y_wywo%C5%82ane&amp;diff=8976"/>
		<updated>2022-11-08T11:09:04Z</updated>

		<summary type="html">&lt;p&gt;Aduszyk: /* Eksperyment 2: rejestracja i analiza potencjału P3 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Pracownia EEG|Pracownia EEG]] / Potencjały wywołane&lt;br /&gt;
&lt;br /&gt;
=Wstęp=&lt;br /&gt;
==Potencjały wywołane==&lt;br /&gt;
=== Wstęp ===&lt;br /&gt;
Potencjały wywołane EEG (ang. ''evoked potentials'', EP) są śladami odpowiedzi mózgu na bodźce. W przypadku MEG poprawnie mówi się o polach wywołanych (ang. ''evoked fields'', EF).&lt;br /&gt;
Zwykle reakcja ta jest mała (wyjątek stanowią [[Elektroencefalografia/Metody_analizy_sygnałów_EEG_-_analiza_w_dziedzinie_czasu |kompleksy K]]) i w zapisie pojedynczej realizacji reakcji na bodziec najczęściej niewidoczna wśród czynności pochodzącej od wielu innych procesów zachodzących w tym samym czasie w mózgu. &lt;br /&gt;
Ich wyodrębnienie z tak zwanego tła EEG/MEG, czyli manifestacji elektrycznej innych, trwających w tym samym czasie w mózgu procesów (aktywny prąd niezależny), wymaga w dniu dzisiejszym zapisu odpowiedzi na szereg powtórzeń tego samego bodźca (&amp;lt;xr id=&amp;quot;fig:EP&amp;quot;&amp;gt;rys. %i&amp;lt;/xr&amp;gt;). Pierwsze potencjały wywołane pokazał pod koniec lat 40-tych Dawson (Dawson 1947) wykonując superpozycję pojedynczych realizacji na kliszy fotograficznej.&lt;br /&gt;
Z czasem skomplikowane urządzenia analogowe zastąpione zostały przez cyfrowe uśrednianie kolejnych fragmentów EEG, zsynchronizowanych według momentu wystąpienia bodźca, łatwo realizowane za pomocą komputera.&lt;br /&gt;
&lt;br /&gt;
[[Grafika:EP.png|thumb|640px|center|&amp;lt;figure id=&amp;quot;fig:EP&amp;quot;&amp;gt;&amp;lt;/figure&amp;gt;&lt;br /&gt;
Uśrednianie potencjałów wywołanych. a) ciągły zapis EEG z wyróżnionymi momentami wystąpienia bodźca (w tym przypadku słuchowego) b) kilkadziesiąt kolejnych odcinków, wyciętych jako sekunda EEG od momentu wystąpienia kolejnych bodźców, ustawione jeden pod drugim c) uśredniony potencjał wywołany &amp;amp;mdash; widać m. in. załamek P300 ok. 300 milisekund po bodźcu]]&lt;br /&gt;
&lt;br /&gt;
Techniki te opierają się na założeniu, że zawarta w EEG odpowiedź mózgu na każdy z kolejnych bodźców jest niezmienna, a EEG odzwierciedlające pozostałe procesy traktowane jest jak nieskorelowany z nią proces stochastyczny. Zależnie od rodzaju potencjałów wywołanych, założenia te są mniej lub bardziej nieuzasadnione; podważa je choćby powszechnie znany efekt habituacji, polegający na osłabieniu późnych potencjałów wywołanych kolejnymi powtórzeniami bodźca.&lt;br /&gt;
&lt;br /&gt;
Istota potencjałów wywołanych jest przedmiotem otwartej dyskusji i dziesiątków prac, dotykających od lat podstawowych w tej dziedzinie pytań: czym jest potencjał wywołany, który widzimy w uśrednionym przebiegu? Czy naprawdę wynika z deterministycznie powtarzanej, jednakowej odpowiedzi pojawiającej się po każdym powtórzeniu bodźca niezależnie od &amp;amp;bdquo;tła&amp;amp;rdquo;, czy może wynika z reorganizacji faz tego właśnie &amp;amp;bdquo;tła&amp;amp;rdquo; EEG, czy może kombinacji tych dwóch efektów? Jest to wspaniałe pole dla zastosowań zaawansowanych metod modelowania i analizy sygnałów. W ostatnich latach powstają dziesiątki prac na ten temat, a od czasu do czasu również krytyczne artykuły wykazujące, że dotychczasowe odkrycia są raczej artefaktami stosowanych metod a nie wynikają z własności analizowanych danych (Yeung et al., 2004). Jak widać jest tu wciąż bardzo wiele do zrobienia, gdyż zrozumienie tego mechanizmu stoi na drodze do &amp;amp;bdquo;świętego Graala&amp;amp;rdquo;, którym w tej dziedzinie jest wyodrębnienie pojedynczych potencjałów wywołanych.&lt;br /&gt;
&lt;br /&gt;
Niezależnie od tego, w neurofizjologii klinicznej nazwą potencjał wywołany określa się krzywą widoczną po uśrednieniu odpowiedzi na kilkanaście do kilku tysięcy bodźców (Szelenberger 2000). Gromadzona od dziesięcioleci wiedza o behawioralnych i klinicznych korelatach potencjałów wywołanych opiera się na rozpoznawaniu w przebiegach uśrednionych tak zwanych załamków, czyli przejściowych wzrostów lub spadków potencjału (na przykład na &amp;lt;xr id=&amp;quot;fig:EP&amp;quot;&amp;gt;rys. %i&amp;lt;/xr&amp;gt; widać załamek P300). Nazwy załamków składają się zwykle z litery &amp;amp;bdquo;P&amp;amp;rdquo; (od ang. ''positive''), jeśli wychylenie jest dodatnie, lub &amp;amp;bdquo;N&amp;amp;rdquo; (od ang. ''negative''), jeśli wychylenie jest ujemne, oraz liczby. Uwaga: &lt;br /&gt;
* Nie ma niestety jednej ustalonej konwencji prezentacji potencjałów koniecznie trzeba więc zwracać uwagę na orientację wykresu, a wykonując wykres samemu - zamieszczać informację o orientacji kierunku dodatniego,gdyż kierunek dodatni może być wykresie skierowany do góry lub do dołu. &lt;br /&gt;
* Liczba następująca po N lub P określa przybliżoną liczbę milisekund od wystąpienia bodźca, czyli tak zwaną latencję. Nie można jednak ścisłego związku między tą liczbą a liczbą milisekund np. potencjał P300 w zależności od szczegółów paradygmatu doświadczalnego może wystąpić znacznie później. np. w eksperymentach językowych zdarza się że P300 występuje później niż N400 :-).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;xr id=&amp;quot;fig:zalamki&amp;quot;&amp;gt;Rys. %i&amp;lt;/xr&amp;gt; przedstawia schematycznie najważniejsze załamki rozpoznawane w potencjałach słuchowych, czyli wywoływanych bodźcem dźwiękowym. Dla potencjałów wzrokowych i somatosensorycznych istnieją podobne klasyfikacje.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Grafika:Zalamki.png|thumb|320px|right|&amp;lt;figure id=&amp;quot;fig:zalamki&amp;quot;&amp;gt;&amp;lt;/figure&amp;gt;&lt;br /&gt;
Orientacyjny schemat załamków rozpoznawanych w słuchowych potencjach wywołanych, na podstawie (Szelenberger 2000). Skala czasu logarytmiczna. Najszybsze (do 12 ms) składowe egzogenne to potencjały pniowe (BAEP), oznaczane jako fale I-VII. Litery &amp;amp;bdquo;P&amp;amp;rdquo; i &amp;amp;bdquo;N&amp;amp;rdquo; oznaczają dodatnie i ujemne wychylenia związane z dalszymi załamkami]]&lt;br /&gt;
&lt;br /&gt;
Najszybsze (czyli o najmniejszej latencji) składowe to potencjały egzogenne, odzwierciedlające wstępne fazy przekazu informacji. W potencjałach słuchowych są to potencjały pnia (ang. ''brainstem auditory evoked potentials'', BAEP), składające się z siedmiu fal występujących pomiędzy 1 a 12 ms od bodźca. Są one generowane np. w nerwie słuchowym czy pniu mózgu, i wykorzystywane w klinicznej diagnostyce integralności dróg słuchowych. Podobnie jak inne wczesne potencjały o latencjach poniżej 100 ms, są praktycznie niezależne od stanu uwagi.&lt;br /&gt;
&lt;br /&gt;
Po potencjałach o średniej latencji (między 12 a 50 ms) zaczynają się późne potencjały słuchowe (od 100 ms od podania bodźca), odzwierciedlające bardziej złożone reakcje na bodziec. Potencjały ok. 100 ms obserwowane w okolicach sensorycznych odzwierciedlają odpowiedź tejże kory na bodziec. Ich amplituda zależy od parametrów fizycznych bodźca oraz od uwagi, np. amplituda załamka N100 wzrasta w stanie skupienia uwagi czy pobudzenia emocjonalnego. Pierwszy i najpopularniejszy całkowicie endogenny załamek to P300, pojawiający się po rozpoznaniu bodźca oczekiwanego, na którym skupiamy uwagę: na przykład, jeśli w serii pojawiających się losowo liter mamy zliczać wystąpienia jednej z nich, to na średniej odpowiedzi na pojawienie się tej litery pojawi się załamek P300. Załamek ten występuje również w odpowiedzi na bodźce wyczekiwane, niespodziewane i ważne dla osoby (np. własne imię). &lt;br /&gt;
&lt;br /&gt;
=== Uśrednianie w dziedzinie czasu ===&lt;br /&gt;
Jak już było wspomniane powyżej podstawową techniką stosowaną do analizy potencjałów wywołanych jest uśrednianie wielu realizacji odpowiedzi na bodziec wyrównanych względem jakiegoś charakterystycznego zdarzenia, np. momentu podania bodźca albo momentu behawioralnej reakcji na bodziec (np. wciśnięcie przycisku). Podejście to bazuje na trzech założeniach:&lt;br /&gt;
* Reakcja jest czasowo związana z bodźcem. Tzn. w kolejnych realizacjach występuje ona zawsze z tym samym opóźnieniem.&lt;br /&gt;
* Reakcja na bodziec skutkuje zawsze pojawieniem się w sygnale składowej o stałym kształcie (mówimy o stałej morfologii).&lt;br /&gt;
* Spontaniczna czynność EEG &amp;amp;mdash; ta która nie dotyczy przetwarzania interesującego nas bodźca &amp;amp;mdash; jest niezależnym, stacjonarnym szumem o średniej zero.&lt;br /&gt;
&lt;br /&gt;
Zgodnie z powyższymi założeniami mierzony w ''i''-tej realizacji sygnał można wyrazić jako:&lt;br /&gt;
: &amp;lt;math&amp;gt;x_i(t) = s(t) + n_i(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
Uśrednianie po ''N'' realizacjach daje:&lt;br /&gt;
: &amp;lt;math&amp;gt;\bar x (t) = \frac{1}{N} \sum_{i=1}^N x_i(t) = \frac{1}{N} \left(N s(t) + \sum_{i=1}^N n_i(t) \right) &amp;lt;/math&amp;gt;&lt;br /&gt;
Wartość oczekiwana średniego sygnału wynosi:&lt;br /&gt;
: &amp;lt;math&amp;gt;\mathrm{E}\left[ \bar x(t) \right] = s(t) &amp;lt;/math&amp;gt;&lt;br /&gt;
gdyż dla szumu o średniej zero mamy:&lt;br /&gt;
: &amp;lt;math&amp;gt;\mathrm{E}\left[\frac{1}{N} \sum_{i=1}^N n_i(t)\right] = 0&amp;lt;/math&amp;gt;.&lt;br /&gt;
Wariancja &amp;lt;math&amp;gt;\bar x(t)&amp;lt;/math&amp;gt; wynosi:&lt;br /&gt;
: &amp;lt;math&amp;gt;\sigma^2_{\bar x(t)} = \mathrm{E} \left[  \left( \frac{1}{N} \sum_{i=1}^N n_i(t)\right)^2 \right] \approx \frac{1}{N} \sigma^2_{n(t)}&amp;lt;/math&amp;gt;&lt;br /&gt;
gdyż &amp;lt;math&amp;gt;s(t)&amp;lt;/math&amp;gt; jest deterministyczne. &lt;br /&gt;
&lt;br /&gt;
Dla potencjałów pojawiających się w pierwszych kilkudziesięciu milisekundach po bodźcu model ten można uznać za poprawny, gdyż wykazują one zależność głównie od parametrów fizycznych bodźca. Dla późniejszych składowych staje się on coraz bardziej wątpliwy ze względu na występujące korelacje ze stanem (np. uwagi) badanego.&lt;br /&gt;
&lt;br /&gt;
Dla późniejszych składowych można by postulować bardziej ogólną wersję modelu potencjału wywołanego:&lt;br /&gt;
: &amp;lt;math&amp;gt;x_i(t) = s_i(t) + n_i(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
Ten model uwidacznia, że do opisu potencjału wywołanego potrzebna jest nie tylko średnia, ale i wyższe momenty rozkładu (np. drugi moment centralny czyli wariancja).&lt;br /&gt;
&lt;br /&gt;
====Wariancja w przypadku szumu skorelowanego ====&lt;br /&gt;
W poprzednim paragrafie pokazaliśmy, że w przypadku niezależnego szumu wariancja uśrednionego sygnału (w danej chwili czasu) maleje jak  &amp;lt;math&amp;gt;\frac{1}{N}&amp;lt;/math&amp;gt;. Jednak w przypadku gdy kolejne próbki szumu są skorelowane (np. występuje silna aktywność rytmiczna alfa) sytuacja się komplikuje. Intuicyjnie łatwo możemy to sobie wyobrazić w granicznym przypadku. Załóżmy, że tło dla  potencjałów o stałej morfologii   stanowi sinusoida. Jeśli będziemy podawać bodźce w odstępach będących wielokrotnością okresu tej sinusoidy to w uśrednianych fragmentach sygnału owa sinusoida jest tak samo powtarzalna jak badany potencjał i uśrednianie nie prowadzi do poprawy stosunku amplitudy sygnału do amplitudy tła. &lt;br /&gt;
&lt;br /&gt;
Stopień zależności pomiędzy próbkami można zmierzyć przy pomocy funkcji autokorelacji. &lt;br /&gt;
Jeśli funkcję autokorelacji przybliżymy przez:&lt;br /&gt;
: &amp;lt;math&amp;gt;R_{xx}(\tau) = \sigma^2 \exp(-\beta |\tau|) \cos(2 \pi f_0 \tau)&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\sigma^2&amp;lt;/math&amp;gt; jest wariancją szumu, &amp;lt;math&amp;gt;f_0&amp;lt;/math&amp;gt; jest średnią częstością aktywności rytmicznej, &amp;lt;math&amp;gt;\beta/ \pi&amp;lt;/math&amp;gt; jest szerokością pasma tej czynności, zaś &amp;lt;math&amp;gt;\tau&amp;lt;/math&amp;gt; opóźnieniem, to wariancję potencjału wywołanego można wyrazić jako&amp;lt;!-- \cite{Spekreijse_1976}--&amp;gt;:&lt;br /&gt;
: &amp;lt;math&amp;gt;\sigma^2_{\bar x(t)} = \frac{\sigma^2}{N} \left[ \frac{1-\exp(-2 \beta T)}{1 - 2 \exp(- \beta T) \cos(2 \pi f_0 T) +\exp(-2 \beta T)} \right]&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; jest odstępem między bodźcami. &lt;br /&gt;
Widać stąd, że obecność czynności rytmicznej w tle wpływa na stosunek sygnału do szumu. Z powyższego równania widać, że stosunek wariancji dąży do &amp;lt;math&amp;gt;\frac{\sigma^2}{N}&amp;lt;/math&amp;gt; gdy &amp;lt;math&amp;gt;\beta T&amp;lt;/math&amp;gt; staje się duże.  &lt;br /&gt;
&lt;br /&gt;
Periodyczna stymulacja może ponadto prowadzić do wzbudzenia czynności rytmicznej o częstości równej częstości pobudzania bądź jej harmonicznej.&lt;br /&gt;
&lt;br /&gt;
===Wariancja latencji===&lt;br /&gt;
&lt;br /&gt;
Jedną z form zmienności potencjału wywołanego w pojedynczych realizacjach jest wariancja latencji. &lt;br /&gt;
[[Grafika:Wariancja_latencji.png|thumb|500px|right|&lt;br /&gt;
Czerwona linia: Uśrednianie 100 potencjałów wywołanych o latncjach z rozkładu normalnego N(300,30 ), Niebieskie linie: przykładowe pojedyncze realizacje wzięte do średniej]]&amp;lt;!--# -*- coding: utf-8 -*-&lt;br /&gt;
from __future__ import division&lt;br /&gt;
import numpy as np&lt;br /&gt;
from matplotlib.pyplot import plot, show ,subplot, figure, title, xlabel, ylabel, ylim&lt;br /&gt;
 &lt;br /&gt;
def fun(t,lat=100):&lt;br /&gt;
    return np.exp(-(t-lat)**2/(2*30**2))&lt;br /&gt;
Fs = 1&lt;br /&gt;
N = 100&lt;br /&gt;
t = np.arange(0,700)&lt;br /&gt;
f = np.zeros((N,700))&lt;br /&gt;
f_sr = np.zeros(t.shape)&lt;br /&gt;
for i in range(N):&lt;br /&gt;
    f[i,:] = fun(t,lat = 300 + 30* np.random.randn())&lt;br /&gt;
for i in range(3):&lt;br /&gt;
    plot(t,f[i,:], 'b')&lt;br /&gt;
plot(t,f.mean(0),'r')&lt;br /&gt;
show()--&amp;gt;&lt;br /&gt;
Zmienność latencji prowadzi do:&lt;br /&gt;
* zmniejszenia amplitudy &amp;lt;math&amp;gt;\bar x&amp;lt;/math&amp;gt;&lt;br /&gt;
* wzrostu rozciągłości czasowej załamka&lt;br /&gt;
&lt;br /&gt;
O tych konsekwencjach zmienności latencji należy w szczególności pamiętać porównując średnie potencjały uzyskane w różnych warunkach eksperymentalnych. Gdy zauważymy, że średnie potencjały różnią się amplitudą należy rozważyć możliwość, że w istocie warunki eksperymentalne wpływają na różnice w wariancji latencji. &lt;br /&gt;
&lt;br /&gt;
Naturalne jest, że zmienność latencji jest bardziej widoczna w przypadku załamków trwających krótko niż w przypadku załamków trwających długo. Wariancja latencji rożnie wraz z jej wartością, stąd wśród późnych składowych potencjałów wywołanych nie obserwuje się komponentów krótkotrwałych.&lt;br /&gt;
&amp;lt;!--====Uśrednianie metodą Woody'ego ====&lt;br /&gt;
&lt;br /&gt;
Model potencjału ze zmienną latencją i sposób na jego efektywniejsze uśrednianie zaproponował Woody (1967). Model ten zakłada, że w każdej realizacji występuje komponent addytywny &amp;lt;math&amp;gt;s_i(t)\;&amp;lt;/math&amp;gt;, który co do kształtu jest stały, a pomiędzy realizacjami różni się tylko latencją:&lt;br /&gt;
: &amp;lt;math&amp;gt; s_i(t) = s(t +\Delta t_i)\;&amp;lt;/math&amp;gt;&lt;br /&gt;
Woody zaproponował aby &amp;lt;math&amp;gt;\Delta t_i\;&amp;lt;/math&amp;gt; szacować na podstawie maksimum funkcji korelacji wzajemnej pomiędzy ''i''-tą realizacją a wzorcem. W pierwszym kroku wzorcem jest średni potencjał uzyskany przez proste uśrednienie realizacji.  Następnie w sposób iteracyjny dokonuje się:&lt;br /&gt;
* poprawek w wyrównaniu poszczególnych realizacji,&lt;br /&gt;
* obliczenia nowego wzorca poprzez uśrednienie realizacji po korekcie wyrównania,&lt;br /&gt;
* obliczenia nowych poprawek do wyrównania realizacji.--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Habituacja ===&lt;br /&gt;
Zmienność w odpowiedziach na kolejno występujące po sobie bodźce można podzielić na komponent stochastyczny i deterministyczny. Komponent deterministyczny odzwierciedla zmianę czułości  układu nerwowego  na kolejne bodźce. Nowy bodziec często wywołuje reakcje pobudzenia widoczną w wielu parametrach takich jak przewodnictwo skóry, rytm serca i reaktywność kory mózgowej. Powszechnie obserwowanym zjawiskiem jest spadek reaktywności na powtarzające się bodźce zwany habituacją. Niekiedy obserwuje się także zjawisko przeciwne &amp;amp;mdash; wzrost reaktywności na bodziec &amp;amp;mdash; zwane sensytyzacją. &lt;br /&gt;
&lt;br /&gt;
Klasycznym sposobem na badanie tych zjawisk w potencjałach wywołanych jest uśrednianie w podzbiorach lub  uśrednianie blokowe. Wymaga ono  zmiany paradygmatu rejestracji danych. Załóżmy, że interesującym nas bodźcem jest błysk światła. Chcemy zaobserwować ewentualne zmiany amplitudy i latencji w ciągu 100 potencjałów będących reakcją na błysk powtarzający się co 500 ms.&lt;br /&gt;
====Uśrednianie w podzbiorach ====&lt;br /&gt;
W metodzie tej musimy założyć, że proces habituacji jest powolny, tzn. zmiany pomiędzy kolejnymi reakcjami są bardzo małe. W takim przypadku możemy podzielić długą serię bodźców na ciąg pod-serii i uśrednienie przeprowadzić dla każdej pod-serii osobno.&lt;br /&gt;
[[Plik:Usrednianie_podzbiory.svg‎|640px|thumb|center|Ilustracja uśredniania w podzbiorach]]&lt;br /&gt;
&lt;br /&gt;
====Uśrednianie blokowe====&lt;br /&gt;
W tym celu eksperyment wykonujemy w wielu seriach. Jedna seria składa się ze 100 błysków powtarzanych co 500 ms.  Po serii następuje przerwa trwająca np. 5 s (długość przerwy wyraża nasze oszacowanie czasu potrzebnego na zanik habituacji). Po przerwie seria jest powtarzana. Powtórzeń serii wykonujemy ''N''.&lt;br /&gt;
Następnie uśredniamy fragmenty sygnałów odpowiadające sobie w kolejnych seriach. &lt;br /&gt;
&lt;br /&gt;
W tym paradygmacie zakładamy, że każda seria rejestrowana jest w tych samych warunkach. Zaniedbujemy efekty związane ze zmęczeniem i zmianami w np. stopniu koncentracji badanego.&lt;br /&gt;
[[Plik:Usrednianie blokowe.svg|Usrednianie blokowe.svg|640px|thumb|center|Ilustracja uśredniania w blokach]]&lt;br /&gt;
&lt;br /&gt;
===Załamki w krzywej potencjału wywołanego vs ukryte komponenty===&lt;br /&gt;
Komponenta potencjału wywołanego to bardzo ważne ale jednocześnie źle określone pojęcie. Krzywa otrzymana w wyniku uśredniania potencjałów wywołanych przedstawia serię załamków dodatnich i ujemnych, ale trzeba być świadomym, że ten przebieg napięcia rejestrowany przez elektrody przedstawia tak naprawdę sumę potencjałów pochodzących od wielu dość niezależnie działających źródeł w mózgu. Przyczynek pochodzący od jednego funkcjonalnego źródła będziemy określać jako komponentę. &lt;br /&gt;
&lt;br /&gt;
Komentarza wymaga też pojęcie źródła funkcjonalnego. Czynność elektryczną synchronicznie działających neuronów piramidalnych w określonym fragmencie kory mózgowej z pewnej odległości można przybliżyć potencjałem dipola prądowego. Taki aktywny fragment kory stanowi źródło dające przyczynek do mierzonego na powierzchni głowy potencjału. W najprostszej sytuacji taki przyczynek może być obserwowany jako komponenta. Mózg jest jednak obiektem niezwykle złożonym i gęsto połączonym. Wiele obszarów korowych może być funkcjonalnie połączonych i aktywowanych synchronicznie w celu realizacji określonego zadania &amp;amp;mdash; o takim funkcjonalnym zespole też możemy myśleć jako o pojedynczym źródle, choć może ono mieć złożoną strukturę przestrzenną. Często zatem myślimy o komponentach ukrytych potencjału wywołanego jako o aktywności takich funkcjonalnych zespołów. &lt;br /&gt;
&lt;br /&gt;
Po tym wstępie widać już chyba, że do zrozumienia co dzieje się w czasie reakcji na bodziec, którą obserwujemy w potencjale wywołanym, bardziej pożądane byłoby badanie komponent ukrytych niż poszczególnych załamków krzywej potencjału wywołanego, która stanowi ważoną sumę owych komponentów. Zanim przejdziemy do omówienia technik służących &amp;amp;bdquo;wyłuskiwaniu&amp;amp;rdquo; komponent prześledźmy kilka symulacji i wnioski z nich płynące.&lt;br /&gt;
&lt;br /&gt;
==== Załamki i komponenty nie są tym samym.====&lt;br /&gt;
Tę samą krzywą można otrzymać na nieskończenie wiele sposobów  przez sumowanie rożnych kombinacji domniemanych komponentów. Przykładowy rysunek pokazuje, jak tę samą krzywą można złożyć z dwóch rożnych zestawów komponentów (kod wytwarzający przykładową symulację pokazany jest poniżej).&lt;br /&gt;
[[Plik:Sumowanie_komponentow1.png|center|thumb|600px| Panel a) przedstawia hipotetyczną krzywą ERP, panel b) jedna z możliwych dekompozycji sygnału w panelu a), panel c) inna możliwa dekompozycja sygnału z panelu a) ]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
from __future__ import division&lt;br /&gt;
import numpy as np&lt;br /&gt;
from matplotlib.pyplot import plot, show ,subplot, figure, title, xlabel, ylabel, ylim&lt;br /&gt;
&lt;br /&gt;
Fs = 1&lt;br /&gt;
t = np.arange(0,700)&lt;br /&gt;
&lt;br /&gt;
C1 = np.exp(-(t-100)**2/(2*30**2))&lt;br /&gt;
C2 = np.exp(-(t-200)**2/(2*50**2))&lt;br /&gt;
C3 = np.exp(-(t-350)**2/(2*100**2))&lt;br /&gt;
ERP = 0.5*C1-C2+C3&lt;br /&gt;
&lt;br /&gt;
C2p = np.concatenate((C2[0:200], np.ones(30), C2[200:700-30] ))&lt;br /&gt;
C3p = ERP - 0.5*C1 + C2p&lt;br /&gt;
ERP_v2 = 0.5*C1-C2p+C3p&lt;br /&gt;
&lt;br /&gt;
subplot(3,1,1)&lt;br /&gt;
plot(t,ERP, t[::10],ERP_v2[::10],'g.')&lt;br /&gt;
ylabel('a)',rotation='horizontal')&lt;br /&gt;
ylim([-1, 1.5])&lt;br /&gt;
&lt;br /&gt;
subplot(3,1,2)&lt;br /&gt;
plot(t,0.5*C1,t,-C2,t,C3)&lt;br /&gt;
ylabel('b)',rotation='horizontal')&lt;br /&gt;
ylim([-1, 1.5])&lt;br /&gt;
&lt;br /&gt;
subplot(3,1,3)&lt;br /&gt;
plot(t,0.5*C1,t,-C2p,t,C3p)&lt;br /&gt;
ylabel('c)',rotation='horizontal')&lt;br /&gt;
ylim([-1, 1.5])&lt;br /&gt;
&lt;br /&gt;
show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Zmiana jednej komponenty może powodować zmiany w amplitudzie i latencji więcej niż jednego załamka.====&lt;br /&gt;
Poniższy rysunek przedstawia sytuację gdy zmiana amplitudy jednego komponentu może znacząco wpływać na amplitudę i latencję innych załamków.&lt;br /&gt;
&lt;br /&gt;
[[Plik:Sumowanie_komponentow2.png|center|thumb|768px| Panel a) przedstawia dwie hipotetyczne krzywe ERP, panel b) panel b i c komponenty z których powstały owe krzywe. Zmiana amplitudy komponentu oznaczonego kolorem powoduje zmianę amplitudy oznaczonych załamków ale także zmianę latencji wcześniejszego załamka. ]]&lt;br /&gt;
Poniżej kod odtwarzający powyższy przykład:&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
from __future__ import division&lt;br /&gt;
import numpy as np&lt;br /&gt;
from matplotlib.pyplot import plot, show, subplot, figure, title, xlabel, ylabel, ylim&lt;br /&gt;
&lt;br /&gt;
Fs = 1&lt;br /&gt;
t = np.arange(0,700)&lt;br /&gt;
&lt;br /&gt;
C1 = np.exp(-(t-100)**2/(2*30**2))&lt;br /&gt;
C2 = np.exp(-(t-200)**2/(2*50**2))&lt;br /&gt;
C3 = np.exp(-(t-350)**2/(2*100**2))&lt;br /&gt;
ERP1 = 0.5*C1-C2+C3&lt;br /&gt;
ERP2 = 0.5*C1-C2+1.5*C3&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
subplot(3,1,1)&lt;br /&gt;
plot(t,ERP1,'b', t,ERP2,'g')&lt;br /&gt;
plot(t[np.argmin(ERP1)],np.min(ERP1),'r.' )&lt;br /&gt;
plot(t[np.argmax(ERP1)],np.max(ERP1),'m.' )&lt;br /&gt;
plot(t[np.argmin(ERP2)],np.min(ERP2),'r.' )&lt;br /&gt;
plot(t[np.argmax(ERP2)],np.max(ERP2),'m.' )&lt;br /&gt;
&lt;br /&gt;
ylabel('a)',rotation='horizontal')&lt;br /&gt;
ylim([-1, 1.6])&lt;br /&gt;
&lt;br /&gt;
subplot(3,1,2)&lt;br /&gt;
plot(t,0.5*C1,'k',t,-C2,'k',t,C3,'b')&lt;br /&gt;
ylabel('b)',rotation='horizontal')&lt;br /&gt;
ylim([-1, 1.6])&lt;br /&gt;
&lt;br /&gt;
subplot(3,1,3)&lt;br /&gt;
plot(t,0.5*C1,'k',t,-C2,'k',t,1.5*C3,'g')&lt;br /&gt;
ylabel('c)',rotation='horizontal')&lt;br /&gt;
ylim([-1, 1.6])&lt;br /&gt;
&lt;br /&gt;
show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Instrukcje do ćwiczeń =&lt;br /&gt;
&lt;br /&gt;
==Zadanie 1: uśrednianie symulowanych sygnałów==&lt;br /&gt;
w tym ćwiczeniu chcemy pokazać efekty:&lt;br /&gt;
# uśredniania sygnałów związanych fazowo z bodźcem i nieskorelowanych z bodźcem / wpływ liczby realizacji,&lt;br /&gt;
# uśredniania sygnałów z fluktuacją latencji,&lt;br /&gt;
# wpływ filtrów o różnych funkcjach odpowiedzi impulsowej na morfologię uśrednionego potencjału.&lt;br /&gt;
&lt;br /&gt;
===Sygnały testowe===&lt;br /&gt;
Proszę zaimplementować funkcje generujące następujące przebiegi czasowe (oznaczenia: ''F&amp;lt;sub&amp;gt;s&amp;lt;/sub&amp;gt;'' &amp;amp;mdash; częstość próbkowania, ''T'' &amp;amp;mdash; czas trwania w sekundach, [[%C4%86wiczenia_1#Sygna.C5.82y_testowe|analogicznie do tego]]):&lt;br /&gt;
* sinusoida o zadanej częstości ''f'' i fazie &amp;lt;math&amp;gt;\phi&amp;lt;/math&amp;gt;: &amp;lt;tt&amp;gt;y = sin(f, phi, Fs, T)&amp;lt;/tt&amp;gt;,&lt;br /&gt;
* funkcja Gaussa o zadanym położeniu i szerokości &amp;lt;tt&amp;gt;y = g_1(t0, sigma, Fs, T) &amp;lt;/tt&amp;gt;&lt;br /&gt;
: &amp;lt;math&amp;gt;g_1(t) = \exp\left(-\frac{(t-t_0)^2}{2 \sigma^2}\right)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* pochodną funkcji Gaussa o zadanym położeniu i szerokości &amp;lt;tt&amp;gt;y = g_2(t0, sigma, Fs, T)&amp;lt;/tt&amp;gt;,&lt;br /&gt;
* połowę funkcji Gaussa o zadanym położeniu i szerokości &amp;lt;tt&amp;gt;y = g_3(t0, sigma, Fs, T)&amp;lt;/tt&amp;gt;,&lt;br /&gt;
: &amp;lt;math&amp;gt;g_{3}(t) = \left\{ &lt;br /&gt;
\begin{array}{lll}&lt;br /&gt;
0 &amp;amp; \mathrm{dla}&amp;amp; t&amp;lt;t_0 \\&lt;br /&gt;
\exp\left(-\frac{(t-t_0)^2}{2 \sigma^2}\right)&amp;amp; \mathrm{dla}&amp;amp; t \ge t_0  &lt;br /&gt;
\end{array}&lt;br /&gt;
\right. &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
W dalszych zadaniach tej sekcji przyjmiemy:&lt;br /&gt;
* ''T'' = 1 s,&lt;br /&gt;
* ''F&amp;lt;sub&amp;gt;s&amp;lt;/sub&amp;gt;'' = 128 Hz,&lt;br /&gt;
* ''t''&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; = 0,3 s,&lt;br /&gt;
* &amp;amp;sigma; = 0,02 s.&lt;br /&gt;
&lt;br /&gt;
===Uśrednianie w modelu addytywnym: sygnał + szum===&lt;br /&gt;
Dla funkcji &amp;lt;math&amp;gt;g_1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;g_2&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;g_3&amp;lt;/math&amp;gt;  wykonaj ''N'' symulacji sygnału opisanego daną funkcją z dodanym szumem gaussowskim (&amp;lt;tt&amp;gt;numpy.random.randn&amp;lt;/tt&amp;gt;). Zaobserwuj zmianę wariancji uśrednianego sygnału wraz z ''N''.&lt;br /&gt;
&lt;br /&gt;
===Uśrednianie w modelu addytywnym: sygnał + szum + niezależna czynność rytmiczna===&lt;br /&gt;
Powtórz poprzednie symulacje dokładając w każdej realizacji sinusoidę o losowo wybranej fazie. Symulacje wykonaj dla różnych częstości sinusoidy, takich których połówka okresu zbliżona jest do szerokości funkcji Gaussa, oraz znacząco od niej różnych.&lt;br /&gt;
&lt;br /&gt;
===Uśrednianie w modelu z resetem fazy===&lt;br /&gt;
Zbuduj sygnał składający się z dwóch fragmentów sinusoidy o częstości ''f'': &lt;br /&gt;
* pierwszy fragment ma losową fazę,&lt;br /&gt;
* drugi fragment ma fazę równą 0.&lt;br /&gt;
Wykonaj ''N'' realizacji takiego sygnału, przy czym każda realizacja ma częstość losowaną z rozkładu Gaussa o średniej 10 i pewnej wariancji (czyli &amp;lt;math&amp;gt;f \in \mathrm{N}(10,\sigma)&amp;lt;/math&amp;gt;). &lt;br /&gt;
Uśrednij otrzymane realizacje. Zaobserwuj zależność średniej od liczby uśrednianych realizacji i od wariancji częstości.&lt;br /&gt;
&lt;br /&gt;
===Uśrednianie potencjału z fluktuacją latencji===&lt;br /&gt;
Wygeneruj sygnały składające się z funkcji &amp;lt;math&amp;gt;g_1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;g_2&amp;lt;/math&amp;gt; albo &amp;lt;math&amp;gt;g_3&amp;lt;/math&amp;gt; z fluktuującą latencją, tzn. z wartością &amp;lt;math&amp;gt;t_0&amp;lt;/math&amp;gt; pochodzącą z jakiegoś rozkładu prawdopodobieństwa. U nas dla ustalenia uwagi niech będzie to rozkład Gaussa. Wykonaj zestaw symulacji obrazujący zależność od liczby realizacji i od wielkości fluktuacji, mierzonej przez wariancję rozkładu. Czy jest związek pomiędzy wariancją fluktuacji &amp;lt;math&amp;gt;t_0&amp;lt;/math&amp;gt; a szerokością załamków?&lt;br /&gt;
&lt;br /&gt;
===Wpływ filtrów===&lt;br /&gt;
# Zaprojektuj następujące filtry (przyjmij częstość próbkowania 128 Hz):&lt;br /&gt;
#* dolnoprzepustowy: Butterwortha z częstością odcięcia: 30, 40, 50 Hz, i rzędach od 1 do 5 (funkcja butter w module scipy.signal),&lt;br /&gt;
#* górnoprzepustowy: Butterwortha z częstością odcięcia: 0,1, 0,5, 2 i 5 Hz, i rzędach od 1 do 5,&lt;br /&gt;
#* notch: Czybyszewa II rodzaju z pasmem zaporowym ustawionym na 50 Hz, i rzędach od 1 do 3 (funkcja cheby2),&lt;br /&gt;
# Zbadaj funkcję odpowiedzi impulsowej i funkcję przenoszenia tych filtrów (w skali dB). Zaobserwuj jak długa jest odpowiedź impulsowa i jak daleko od częstości odcięcia zaburzone jest pasmo przenoszenia.&lt;br /&gt;
# Zastosuj powyższe filtry do funkcji &amp;lt;math&amp;gt;g_1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;g_2&amp;lt;/math&amp;gt; albo &amp;lt;math&amp;gt;g_3&amp;lt;/math&amp;gt;. Filtrowanie przeprowadź w jedną (lfilter) oraz w dwie strony (filtfilt). Zaobserwuj związek między zniekształceniem wprowadzanym przez filtr a funkcją odpowiedzi impulsowej filtru.&lt;br /&gt;
# W ćwiczeniu tym posłuż się symulowanymi sygnałami uzyskanymi z modelu addytywnego: &amp;amp;bdquo;sygnał+szum&amp;amp;rdquo;. Dla funkcji &amp;lt;math&amp;gt;g_1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;g_2&amp;lt;/math&amp;gt; albo &amp;lt;math&amp;gt;g_3&amp;lt;/math&amp;gt;  wykonaj ''N'' = 60 realizacji sygnału opisanego daną funkcją z dodanym szumem gaussowskim (&amp;lt;tt&amp;gt;numpy.random.randn&amp;lt;/tt&amp;gt;). Każdą z realizacji przefiltruj, a następnie uśrednij uzyskane sygnały.&lt;br /&gt;
&lt;br /&gt;
==Zadanie 2: rejestracje i analiza potencjałów wzrokowych==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;! -- ===Synchronizacja występowania bodźców z sygnałem EEG===&lt;br /&gt;
&lt;br /&gt;
Rejestracja potencjałów wywołanych jest przykładem pomiaru czynności elektrycznej mózgu w odpowiedzi na określony bodziec. W przypadku tego rodzaju pomiarów konieczna jest synchronizacja momentu wystąpienia bodźca z sygnałem EEG. Wzmacniacze do pomiaru czynności elektrycznej mózgu wyposażone są w specjalne wejścia, na które można podawać sygnał odpowiadający pojawianiu się bodźca. Jak pamiętamy z zeszłego semestru, wejście to (jak i podawany na nie sygnał) nazywamy trigerem (ang. ''trigger'' &amp;amp;mdash; spust, cyngiel, wyzwalacz). W najprostszym przypadku, bodziec moglibyśmy wyświetlać na monitorze komputerowym, a sygnał związany z jego wystąpieniem wysyłać przez któryś z portów komputera (LPT, COM) na wzmacniacz EEG. Niestety, obecnie dostępne i popularne systemy operacyjne, takie jak Windows czy Linux nie są systemami czasu rzeczywistego (http://pl.wikipedia.org/wiki/System_operacyjny_czasu_rzeczywistego). Od momentu wyświetlania bodźca na ekranie, do pojawiania się sygnału odpowiednim porcie komputerowym może upłynąć kilkadziesiąt milisekund i co gorsza czas ten zwykle jest losowy. W przypadku gdy wzmacniacz próbkuje sygnał z częstością 1000 Hz, moment wystąpienia bodźca możemy określić z dokładnością 1 ms, jednakże wspomniane opóźnienia w systemie operacyjnym uniemożliwiają to. Ponadto, jak dowiedzieliśmy się w rozdziale wstępnym [http://brain.fuw.edu.pl/edu-wiki/action/edit/EEG:Potencja%C5%82y_wywo%C5%82ane?section=T-1], pierwsze załamki związane z potencjałami wywołanymi pojawiają się już 10 ms po wystąpieniu bodźca. W związku z tym, losowe, rzędu kilkudziesięciu milisekund opóźnienia sygnału określającego moment pojawienia się bodźca względem jego rzeczywistego wystąpienia są niedopuszczalne.&lt;br /&gt;
Istnieją pewne techniki programowania, dzięki którym opisywane opóźnienia można zmniejszyć, jednakże są one bardzo trudne  do realizacji. Ponadto, standardowe porty komputera, takie jak LPT, czy COM zostały zaprojektowane przede wszystkim do sterowania urządzeniami zewnętrznymi, a nie ich zasilania. Przykładowo, jedna linia portu drukarkowego (LPT) może być obciążona prądem nie większym niż 5 mA, podczas gdy do zapalenie zwykłej diody LED potrzeba około 10 mA. Taki pobór prądu możliwy jest do uzyskania z portu USB, jednakże  jest on  wyjątkowo trudny do oprogramowania.  &lt;br /&gt;
W celu ominięcia powyższych niedogodności w Zakładzie Fizyki Biomedycznej UW w przeprowadzanych eksperymentach wykorzystywane są  mikrokontrolery [http://pl.wikipedia.org/wiki/Mikrokontroler], w szczególności ATmega16 i ATmega32.  Mikrokontrolery te wyposażone są w procesory o architekturze RISC [http://pl.wikipedia.org/wiki/RISC] i mocy obliczeniowej porównywalnej z szeroko stosowanym kiedyś w komputerach ZX Spectrum, Commodore, Amiga i Atari procesorem Z80. Oprócz jednostki centralnej mikrokontrolery zawierają   stałą pamięć FLASH przeznaczoną do przechowywania kodu programu, pamięć  RAM i pamięć EEPROM, liczniki 8- i 16-bitowe, komparatory, przetworniki analogowo-cyfrowe, porty wejścia/wyjścia, łącze RS232 (popularnie nazywane portem szeregowym) i układy przerwań.&lt;br /&gt;
&lt;br /&gt;
Mikrokontrolery wchodzące w skład zestawów pomiarowych na Pracowni EEG zawierają program, który umożliwia komunikację z nimi poprzez port szeregowy. Obecnie, komputery są coraz rzadziej wyposażane w porty szeregowe. Standard komunikacji RS-232, opracowany w 1962 roku  nadal jest jednak popularny i często wykorzystywany do komunikacji miedzy urządzeniami.  W celu połączenia komputera posiadającego tylko porty USB z mikrokontrolerem zastosowano przejściówkę USB/RS-232. &lt;br /&gt;
&lt;br /&gt;
Jak każde urządzenie w systemie Linuks, przejściówka USB/RS-232 widoczna jest jako plik, znajdujący się w katalogu &amp;lt;tt&amp;gt;/dev&amp;lt;/tt&amp;gt;. Nazwy plików obsługujących urządzenia szeregowe to &amp;lt;tt&amp;gt;ttyXY&amp;lt;/tt&amp;gt;, gdzie &amp;lt;tt&amp;gt;XY&amp;lt;/tt&amp;gt; to kolejny numer przydzielony do urządzenia szeregowego.&lt;br /&gt;
Do komunikacji komputera z mikroknotrolerem  w Zakładzie Fizyki Biomedycznej UW została napisana prosta biblioteka.  Jej użycie jest następujące:&lt;br /&gt;
* Po podłączeniu przejściówki USB/RS232 do komputera mikrokontrolera sprawdź jaki plik w katalogu &amp;lt;tt&amp;gt;/dev&amp;lt;/tt&amp;gt; został utworzony i przydzielony do urządzenia. &lt;br /&gt;
* Zaimportuj bibliotekę do komunikacji z mikrokontrolerem: &lt;br /&gt;
: &amp;lt;tt&amp;gt;import SerialPort as SP&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Otwórz plik powiązany z urządzeniem zewnętrznym:&lt;br /&gt;
: &amp;lt;tt&amp;gt;sp = SP.SerialPort(nazwa_pliku) &amp;lt;/tt&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
: &amp;lt;tt&amp;gt;sp.open()&amp;lt;/tt&amp;gt;&lt;br /&gt;
W naszym przypadku prawidłowa nazwa pliku to &amp;lt;tt&amp;gt;/dev/ttyUSB0&amp;lt;/tt&amp;gt;.&lt;br /&gt;
* Po włączeniu zasilania mikrokontrolera, diody podłączone do niego i wykorzystywane w eksperymencie z potencjałami wywołanymi będą zapalone. Następujące polecenie zgasi obydwie diody:&lt;br /&gt;
: &amp;lt;tt&amp;gt;sp.blinkP300([0, 0])&amp;lt;/tt&amp;gt;&lt;br /&gt;
* Wydanie poniższego polecenia spowoduje, iż mikrokontroler zapali podłączoną do niego diodę numer 1 na czas 100 ms, zaś diodę numer 2 na 200 ms. Jednocześnie, w momencie włączenia jak i wyłączenia diody, sygnał z mikrokontrolera zostanie wysłany na 5-stykowe wejście AUX mikrokontrolera:&lt;br /&gt;
: &amp;lt;tt&amp;gt;sp.blinkP300([100, 200])&amp;lt;/tt&amp;gt;&lt;br /&gt;
* Jeśli chcemy zapalić tylko diodę numer dwa, np. na czas 500 ms w programie podajemy następującą instrukcję:&lt;br /&gt;
: &amp;lt;tt&amp;gt;sp.blinkP300([0, 500])&amp;lt;/tt&amp;gt;&lt;br /&gt;
* Jeśli chcemy zakończyć komunikację z mikrokontrolerem piszemy:&lt;br /&gt;
: &amp;lt;tt&amp;gt;sp.close()&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Kod biblioteki do komunikacji z mikrokontrolerem:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;!--  Kod w Pythonie 2&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# -*- coding: cp1250 -*-&lt;br /&gt;
import serial&lt;br /&gt;
import logging&lt;br /&gt;
import sys&lt;br /&gt;
import os&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def to_hex_word(a):&lt;br /&gt;
    '''encodes a decimal number hexadecimally on two bytes'''&lt;br /&gt;
    return chr(a%256) + chr(a/256)&lt;br /&gt;
&lt;br /&gt;
class SerialPort(object):&lt;br /&gt;
    def __init__(self, port_name):&lt;br /&gt;
        import serial&lt;br /&gt;
        try:&lt;br /&gt;
            self.port = serial.Serial(&lt;br /&gt;
                port=port_name,&lt;br /&gt;
                baudrate=9600,&lt;br /&gt;
                bytesize=serial.EIGHTBITS,&lt;br /&gt;
                parity=serial.PARITY_NONE,&lt;br /&gt;
                stopbits=serial.STOPBITS_ONE,&lt;br /&gt;
                xonxoff=False&lt;br /&gt;
                )&lt;br /&gt;
        except serial.SerialException as e:&lt;br /&gt;
            print(&amp;quot;Nieprawidłowa nazwa portu lub port zajęty.&amp;quot;)&lt;br /&gt;
            raise e&lt;br /&gt;
        self.close()&lt;br /&gt;
        &lt;br /&gt;
    def open(self):&lt;br /&gt;
        self.port.open()&lt;br /&gt;
&lt;br /&gt;
    def close(self):&lt;br /&gt;
        self.port.close()&lt;br /&gt;
&lt;br /&gt;
    def send(self, value):&lt;br /&gt;
        self.port.write(value)&lt;br /&gt;
                           &lt;br /&gt;
    def blinkSSVEP(self,d, p1, p2):&lt;br /&gt;
        '''&lt;br /&gt;
        d = list of frequencies;&lt;br /&gt;
        p1:p2 = ratio LED_on_time/LED_off_time&lt;br /&gt;
        if you want i-th LED to be OFF all the time send  d[i] = 0&lt;br /&gt;
        if you want i-th LED to be ON all the time send  d[i] = -1&lt;br /&gt;
        in these two cases p1 and p2 do not matter&lt;br /&gt;
        '''&lt;br /&gt;
        clock  = 62500&lt;br /&gt;
        factor = float(p1) / float(p1 + p2)&lt;br /&gt;
    &lt;br /&gt;
        str = chr(3) # 'SSVEP_RUN'&lt;br /&gt;
&lt;br /&gt;
        for i in range(len(d)):&lt;br /&gt;
            # i-th LED OFF&lt;br /&gt;
            if d[i] == 0:                       &lt;br /&gt;
                str += to_hex_word(0) + to_hex_word(255) &lt;br /&gt;
            # i-th LED ON&lt;br /&gt;
            elif d[i] == -1:&lt;br /&gt;
                str += to_hex_word(255) + to_hex_word(0)&lt;br /&gt;
                #str = 'S'&lt;br /&gt;
                # i-th LED blinks d[i] times per second&lt;br /&gt;
                # p1:p2 = on_time:off_time in one blink&lt;br /&gt;
            else:&lt;br /&gt;
                period = clock/d[i]&lt;br /&gt;
                bright = int((clock/d[i]) * factor)&lt;br /&gt;
                dark = period - bright&lt;br /&gt;
                str += to_hex_word(bright) + to_hex_word(dark)&lt;br /&gt;
&lt;br /&gt;
        self.send(str)&lt;br /&gt;
&lt;br /&gt;
    def blinkP300(self,d):&lt;br /&gt;
        clock  = 62500&lt;br /&gt;
        str = chr(4) # 'P300_RUN'&lt;br /&gt;
&lt;br /&gt;
        for i in range(len(d)):&lt;br /&gt;
            period = int(clock*d[i]/1000.0)&lt;br /&gt;
            str += to_hex_word(period)&lt;br /&gt;
            print(period)&lt;br /&gt;
&lt;br /&gt;
        self.send(str)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
--&amp;gt; &amp;lt;!-- Kod w Pythonie 3 --&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# -*- coding: cp1250 -*-&lt;br /&gt;
import serial&lt;br /&gt;
import logging&lt;br /&gt;
import sys&lt;br /&gt;
import os&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
def to_hex_word(a):&lt;br /&gt;
    '''encodes a decimal number hexadecimally on two bytes'''&lt;br /&gt;
    return a.to_bytes(2,byteorder=sys.byteorder)&lt;br /&gt;
 &lt;br /&gt;
class SerialPort(object):&lt;br /&gt;
    def __init__(self, port_name):&lt;br /&gt;
        import serial&lt;br /&gt;
        try:&lt;br /&gt;
            self.port = serial.Serial(&lt;br /&gt;
                port=port_name,&lt;br /&gt;
                baudrate=9600,&lt;br /&gt;
                bytesize=serial.EIGHTBITS,&lt;br /&gt;
                parity=serial.PARITY_NONE,&lt;br /&gt;
                stopbits=serial.STOPBITS_ONE,&lt;br /&gt;
                xonxoff=False&lt;br /&gt;
                )&lt;br /&gt;
        except serial.SerialException as e:&lt;br /&gt;
            print(&amp;quot;Nieprawidłowa nazwa portu lub port zajęty.&amp;quot;)&lt;br /&gt;
            raise e&lt;br /&gt;
        self.close()&lt;br /&gt;
 &lt;br /&gt;
    def open(self):&lt;br /&gt;
        self.port.open()&lt;br /&gt;
 &lt;br /&gt;
    def close(self):&lt;br /&gt;
        self.port.close()&lt;br /&gt;
 &lt;br /&gt;
    def send(self, value):&lt;br /&gt;
        self.port.write(value)&lt;br /&gt;
 &lt;br /&gt;
    def blinkSSVEP(self,d, p1, p2):&lt;br /&gt;
        '''&lt;br /&gt;
        d = list of frequencies;&lt;br /&gt;
        p1:p2 = ratio LED_on_time/LED_off_time&lt;br /&gt;
        if you want i-th LED to be OFF all the time send  d[i] = 0&lt;br /&gt;
        if you want i-th LED to be ON all the time send  d[i] = -1&lt;br /&gt;
        in these two cases p1 and p2 do not matter&lt;br /&gt;
        '''&lt;br /&gt;
        clock  = 62500&lt;br /&gt;
        factor = float(p1) / float(p1 + p2)&lt;br /&gt;
 &lt;br /&gt;
        str = (3).to_bytes(1,byteorder=sys.byteorder) # 'SSVEP_RUN'&lt;br /&gt;
 &lt;br /&gt;
        for i in range(len(d)):&lt;br /&gt;
            # i-th LED OFF&lt;br /&gt;
            if d[i] == 0:                       &lt;br /&gt;
                str += to_hex_word(0) + to_hex_word(255) &lt;br /&gt;
            # i-th LED ON&lt;br /&gt;
            elif d[i] == -1:&lt;br /&gt;
                str += to_hex_word(255) + to_hex_word(0)&lt;br /&gt;
                #str = 'S'&lt;br /&gt;
                # i-th LED blinks d[i] times per second&lt;br /&gt;
                # p1:p2 = on_time:off_time in one blink&lt;br /&gt;
            else:&lt;br /&gt;
                period = clock/d[i]&lt;br /&gt;
                bright = int((clock/d[i]) * factor)&lt;br /&gt;
                dark = int(period - bright)&lt;br /&gt;
                str += to_hex_word(bright) + to_hex_word(dark)&lt;br /&gt;
 &lt;br /&gt;
        self.send(str)&lt;br /&gt;
 &lt;br /&gt;
    def blinkP300(self,d):&lt;br /&gt;
        clock  = 62500&lt;br /&gt;
        str = (4).to_bytes(1,byteorder=sys.byteorder) # 'P300_RUN'&lt;br /&gt;
 &lt;br /&gt;
        for i in range(len(d)):&lt;br /&gt;
            period = int(clock*d[i]/1000.0)&lt;br /&gt;
            str += to_hex_word(period)&lt;br /&gt;
 &lt;br /&gt;
        self.send(str)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
--&amp;gt; &lt;br /&gt;
&lt;br /&gt;
===Zestaw eksperymentalny===&lt;br /&gt;
Zestaw składa się ze:&lt;br /&gt;
* wzmacniacza,&lt;br /&gt;
* stymulatora   &lt;br /&gt;
&amp;lt;!--* izolowanego galwanicznie układu generującego impulsy odpowiadające gaszeniu i zapalaniu diody,  o wartościach dopasowanych do akceptowalnych przez wejścia AUX wzmacniacza,--&amp;gt;&lt;br /&gt;
* komputera: w tym eksperymencie komputer będzie służył do zaprogramowania stymulatora i do rejestracji sygnałów.&lt;br /&gt;
&lt;br /&gt;
===Eksperyment 1. Obserwacja bodźca wzrokowego  ===&lt;br /&gt;
&amp;lt;!--Proszę zapoznać się ze standardami rejestracji wzrokowych potencjałów wywołanych [http://www.gcu.ac.uk/media/gcalwebv2/theuniversity/academicschools/sls/psytimetables/SLS%20-%20VEP_Standard_2010.pdf] --&amp;gt;&lt;br /&gt;
Proszę zapoznać się z typowym wyglądem załamków w przypadku potencjałów wzrokowych, jaki jest przedstawiony na [https://link.springer.com/article/10.1007/s10633-009-9195-4/figures/2 rysunku] (cały artykuł jest dostępny [http://link.springer.com/article/10.1007%2Fs10633-009-9195-4 tu]).&lt;br /&gt;
&amp;lt;!--[[Plik:Fig 4 VEP.jpg|thumb|320px|right|&amp;lt;figure id=&amp;quot;fig:zalamki_VEP&amp;quot;&amp;gt;&amp;lt;/figure&amp;gt;&lt;br /&gt;
&amp;lt;xr id=&amp;quot;fig:zalamki_VEP&amp;quot;&amp;gt;Rys. %i.&amp;lt;/xr&amp;gt; Schemat załamków rozpoznawanych we wzrokowych potencjach wywołanych (z pracy: J. V. Odom i in. &amp;amp;bdquo;ISCEV standard for clinical visual evoked potentials&lt;br /&gt;
(2009 update)&amp;amp;rdquo;, Doc Ophthalmol (2010), 120:111–119).]]&lt;br /&gt;
--&amp;gt; &lt;br /&gt;
&lt;br /&gt;
==== Rejestracja ====&lt;br /&gt;
* Paradygmat: z odległości około 40 cm badany obserwuje wyświetalny na ekranie biały kwadrat. Bodźce trwają 300 ms i  powtarzają się co 0.5 sekundy. Bodziec poprzedza punkt fiksacji pokazywany przez 300 ms. Natężenie bodźca ma przyjąć jedną z 4 wartości (manipulujemy jego przeźroczystością: 1, 0.7, 0.3 i 0.1, gdzie 1 oznacza brak przeźroczystości). Każda z intensywności bodźca ma pojawić się 100 razy podczas badania, bodźce podawane mają być w sposób losowy. Zadanie poprzedza krótka instrukcja, kończy podziękowanie. &lt;br /&gt;
&lt;br /&gt;
* Pomiar&lt;br /&gt;
**Zakładamy czepek i elektrody w systemie 10-20, dbamy o to by opory pomiędzy elektrodami były poniżej 10 k&amp;amp;Omega; i różnice pomiędzy oporami różnych elektrod nie przekraczały 20%. [[Plik:Glowka10-20 ERPy.svg|thumb|600px|right]]&lt;br /&gt;
** Elektrodę GND mocujemy w otworze czepka odpowiadającym pozycji AFz (na linii centralnej 10% w stronę nosa od elektrody Fz) &lt;br /&gt;
** Montujemy także elektrody M1 i M2 i FCz.&lt;br /&gt;
&lt;br /&gt;
==== Analiza ====&lt;br /&gt;
# Filtrujemy sygnał w paśmie 1-20 Hz.&lt;br /&gt;
# Z ciągłego zapisu wycinamy fragmenty od &amp;amp;minus;300 ms do +800 ms (zero oznacza moment wystąpienia bodźca). W czasie wycinania badamy wycinane fragmenty pod względem zakresu amplitudy (wszystkie kanały powinny mieć amplitudę w granicach &amp;amp;plusmn;75 &amp;amp;mu;V) i zawartości artefaktów od mrugania (w tym celu trzeba oglądając sygnał w SVAROG-u ustalić próg na amplitudę sygnału w kanałach Fp1 i Fp2).&lt;br /&gt;
# Uśredniamy wycięte sygnały.&lt;br /&gt;
# Rysujemy średni potencjał we wszystkich kanałach.&lt;br /&gt;
# Pierwszy sposób: Identyfikujemy załamki P1 i N2. Mierzymy amplitudę P1 jako różnicę między ekstremalną wartością załamka N2 a ekstremalną wartością załamka N2. &lt;br /&gt;
# Drugi sposób: Identyfikujemy załamki P1 i N2. Mierzymy amplitudę P1 w stosunku do zera. &lt;br /&gt;
#porównujemy uzyskane amplitudy w 4 warunkach za pomocą odpowiedniego testu statystycznego (porównanie warunków ze skrajnymi wartościami amplitudy - zastosuj test permutacyjny (opisany poniżej) lub test t-Studenta/nieparametryczny odpowiednik). &lt;br /&gt;
&lt;br /&gt;
**Opis testu permutacyjnego &lt;br /&gt;
Pytanie: Czy intensywność bodźca wpływa na amplitudę potencjału P1?&lt;br /&gt;
Jak stwierdzić czy amplitudy załamków P1 istotnie różnią się pomiędzy seriami?&lt;br /&gt;
&lt;br /&gt;
Musimy przeprowadzić test statystyczny. Możemy skonstruować go np. tak:&lt;br /&gt;
Mamy dwa warunki I i II. Jako statystykę przyjmiemy różnicę pomiędzy amplitudą załamka zmierzoną w serii z dwoma diodami (P2&amp;lt;sub&amp;gt;II&amp;lt;/sub&amp;gt;) a amplitudą zmierzoną w serii z jedną diodą (P2&amp;lt;sub&amp;gt;I&amp;lt;/sub&amp;gt;):&lt;br /&gt;
: ''S'' = P2&amp;lt;sub&amp;gt;II&amp;lt;/sub&amp;gt; &amp;amp;minus; P2&amp;lt;sub&amp;gt;I&amp;lt;/sub&amp;gt;&lt;br /&gt;
Postawmy hipotezę zerową, że nie ma różnicy w amplitudzie pomiędzy warunkiem II a I oraz hipotezę alternatywną, że różnica taka występuje.&lt;br /&gt;
: H&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;: ''S'' = 0&lt;br /&gt;
: H&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;: ''S'' &amp;amp;ne; 0&lt;br /&gt;
Zgodnie z H&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; dla wartości ''S'' nie ma różnicy czy realizacja została zarejestrowana w warunkach I czy II, zatem można losowo poprzypisywać numery warunków do realizacji i w ten sposób uzyskać rozkład statystyki ''S'' pod warunkiem prawdziwości H&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;, czyli obliczyć średnie potencjały dla &amp;amp;bdquo;pomieszanych&amp;amp;rdquo; tagów, wyliczyć średnie potencjały dla sztucznie wygenerowaych grup, i wyliczyć różnicę amplitud dla tych średnich, czyli wartość statystyki dla hipotezy H&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Zaimplementuj test permutacyjny zgodny z powyższą koncepcją.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- ===Wersja 2: obserwacja habituacji / uśrednianie w blokach ===&lt;br /&gt;
==== Rejestracja ====&lt;br /&gt;
# Paradygmat: &lt;br /&gt;
#* z odległości około 40 cm badany obserwuje błyski diody. &lt;br /&gt;
#* Błyski powtarzają się co 0,5 sekundy. &lt;br /&gt;
#* Rejestrujemy 60 serii po 15 błysków.  &lt;br /&gt;
#* Pomiędzy seriami badany odpoczywa około 10 sekund.&lt;br /&gt;
# Zakładamy czepek i elektrody w systemie 10-20, dbamy o to by opory pomiędzy elektrodami były poniżej 5 k&amp;amp;Omega; i różnice pomiędzy oporami różnych elektrod nie przekraczały 20%.&lt;br /&gt;
#* Elektrodę GND mocujemy w otworze czepka odpowiadającym pozycji AFz (na linii centralnej 10% w stronę nosa od elektrody Fz) &lt;br /&gt;
#* Montujemy także elektrodę FCz (na linii centralnej pomiędzy Fz a Cz), będziemy jej używać w montażu i w czasie analizy jako referencji.&lt;br /&gt;
#* Częstość próbkowania 512 Hz.&lt;br /&gt;
&lt;br /&gt;
==== Analiza ====&lt;br /&gt;
# Filtrujemy sygnał w paśmie 0,1-20 Hz.&lt;br /&gt;
# Z ciągłego zapisu wycinamy fragmenty od &amp;amp;minus;300 ms do +600 ms (zero oznacza moment wystąpienia bodźca). W czasie wycinania badamy wycinane fragmenty pod względem zakresu amplitudy (wszystkie kanały powinny mieć amplitudę w granicach &amp;amp;plusmn;75 &amp;amp;mu;V) i zawartości artefaktów od mrugania (w tym celu trzeba oglądając sygnał w SVAROG-u ustalić próg na amplitudę sygnału w kanałach Fp1 i Fp2).&lt;br /&gt;
# Uśredniamy wycięte sygnały o tym samym numerze wewnątrz serii.&lt;br /&gt;
# Rysujemy serie 15 uśrednionych potencjałów dla tego kanału, który wykazywał najsilniejszy potencjał w pierwszej wersji eksperymentu. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Eksperyment 2: rejestracja i analiza potencjału P3 ==&lt;br /&gt;
== Rejestracja ====&lt;br /&gt;
# Paradygmat: &lt;br /&gt;
#* z odległości około 40 cm badany obserwuje kwadrat, który występuje w dwóch kolorach. &lt;br /&gt;
#* Bodźce trwają 300 ms, poprzedzane punktem fiksacji wyświetlanym na 300 ms, przerwa między próbami jest losowana i wynosi od 0.8-1.2 s.  &lt;br /&gt;
#* Proporcja wystapień bodźców koloru pierwszego i drugiego wynosi 1:5.   &lt;br /&gt;
#* Zadaniem badanego jest liczenie kwadratów w rzadkim kolorze. &lt;br /&gt;
#* Wykonujemy tyle realizacji aby zarejestrować 100 powtórzeń bodźców rzadkich. &lt;br /&gt;
# Zakładamy czepek i elektrody w systemie 10-20, dbamy o to by opory pomiędzy elektrodami były poniżej 5 k&amp;amp;Omega; i różnice pomiędzy oporami różnych elektrod nie przekraczały 20%.&lt;br /&gt;
#* Elektrodę GND mocujemy w otworze czepka odpowiadającym pozycji AFz (na linii centralnej 10% w stronę nosa od elektrody Fz) &lt;br /&gt;
#* Montujemy także elektrody M1 i M2, będziemy ich używać w montażu i w czasie analizy jako referencji typu połączone uszy.&lt;br /&gt;
#* Częstość próbkowania 512 Hz.&lt;br /&gt;
&lt;br /&gt;
=== Analiza ===&lt;br /&gt;
# Filtrujemy sygnał w paśmie 1-20 Hz.&lt;br /&gt;
# Z ciągłego zapisu wycinamy fragmenty od &amp;amp;minus;300 ms do +900 ms (zero oznacza moment wystąpienia bodźca). W czasie wycinania badamy wycinane fragmenty pod względem zakresu amplitudy (wszystkie kanały powinny mieć amplitudę w granicach &amp;amp;plusmn;75 &amp;amp;mu;V) i zawartości artefaktów od mrugania (w tym celu trzeba oglądając sygnał w SVAROG-u ustalić próg na amplitudę sygnału w kanałach Fp1 i Fp2).&lt;br /&gt;
# Uśredniamy osobno realizacje dla każdego koloru kwadratu. &lt;br /&gt;
# Nakładamy na siebie na rysunkach oba typy średnich.&lt;br /&gt;
# wyznaczamy amplitudę P3 i liczymy test statystyczny pomiędzy warunkami&lt;br /&gt;
&lt;br /&gt;
==Ćwiczenie dodatkowe: P300 BCI==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wykorzystujemy elektrody z systemu 10-10 umieszczone nad korą wzrokową: P07, O1, O2, PO8, PO3, PO4, Pz, Cz.&lt;br /&gt;
&lt;br /&gt;
Uruchamiamy &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
obci_gui --presets eeg_workshop&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
i z guzika &amp;amp;bdquo;select amplifier&amp;amp;rdquo; wybieramy właściwy wzmacniacz.&lt;br /&gt;
&lt;br /&gt;
Do kontroli jakości sygnału możemy uruchomić Svaroga.&lt;br /&gt;
&lt;br /&gt;
Dane z kalibracji zapisują się w pliku test1 w katalogu domowym użytkownika, z labiryntu w pliku test2.&lt;br /&gt;
&lt;br /&gt;
Po zakończeniu kalibracji pojawia się napis &amp;amp;bdquo;Trwają obliczenia&amp;amp;rdquo; lub podobny. Odczekujemy kilka minut, aż skończy się peer &amp;amp;bdquo;Calibration&amp;amp;rdquo; (widoczny w obci_gui) i zamykamy okienko klawiszami Alt-F4 lub zatrzymując scenariusz guzikiem &amp;amp;bdquo;Stop&amp;amp;rdquo;. W katalogu domowym pojawi się plik z wynikami kalibracji, co pozwala na uruchomienie scenariusza &amp;amp;bdquo;labirynt&amp;amp;rdquo;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Po zebraniu danych, przed wczytaniem ich do Svaroga należy w tym samym katalogu uruchomić skrypt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
#!/usr/bin/env python&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
&lt;br /&gt;
from obci.analysis.obci_signal_processing.tags import tags_file_writer&lt;br /&gt;
from obci.analysis.obci_signal_processing.read_manager import ReadManager&lt;br /&gt;
&lt;br /&gt;
def main(): &lt;br /&gt;
	file_name = 'test1'&lt;br /&gt;
	&lt;br /&gt;
	mgr = ReadManager(&lt;br /&gt;
		file_name + '.obci.xml',&lt;br /&gt;
		file_name + '.obci.raw',&lt;br /&gt;
		file_name + '.obci.tag')&lt;br /&gt;
	&lt;br /&gt;
	tags = mgr.get_tags()&lt;br /&gt;
	for i in xrange(0, len(tags)):&lt;br /&gt;
		if tags[i]['desc']['index'] == tags[i]['desc']['target']:&lt;br /&gt;
			tags[i]['name'] = 'blink_target'&lt;br /&gt;
		else:&lt;br /&gt;
			tags[i]['name'] = 'blink'&lt;br /&gt;
			&lt;br /&gt;
	tags_writer = tags_file_writer.TagsFileWriter(file_name + '.obci.tag')&lt;br /&gt;
	for tag in tags:&lt;br /&gt;
		tags_writer.tag_received(tag)		&lt;br /&gt;
	tags_writer.finish_saving(0)	&lt;br /&gt;
 &lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Aduszyk</name></author>
		
	</entry>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=Pracownia_EEG/Potencja%C5%82y_wywo%C5%82ane&amp;diff=8975</id>
		<title>Pracownia EEG/Potencjały wywołane</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=Pracownia_EEG/Potencja%C5%82y_wywo%C5%82ane&amp;diff=8975"/>
		<updated>2022-11-08T10:46:50Z</updated>

		<summary type="html">&lt;p&gt;Aduszyk: /* Analiza */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Pracownia EEG|Pracownia EEG]] / Potencjały wywołane&lt;br /&gt;
&lt;br /&gt;
=Wstęp=&lt;br /&gt;
==Potencjały wywołane==&lt;br /&gt;
=== Wstęp ===&lt;br /&gt;
Potencjały wywołane EEG (ang. ''evoked potentials'', EP) są śladami odpowiedzi mózgu na bodźce. W przypadku MEG poprawnie mówi się o polach wywołanych (ang. ''evoked fields'', EF).&lt;br /&gt;
Zwykle reakcja ta jest mała (wyjątek stanowią [[Elektroencefalografia/Metody_analizy_sygnałów_EEG_-_analiza_w_dziedzinie_czasu |kompleksy K]]) i w zapisie pojedynczej realizacji reakcji na bodziec najczęściej niewidoczna wśród czynności pochodzącej od wielu innych procesów zachodzących w tym samym czasie w mózgu. &lt;br /&gt;
Ich wyodrębnienie z tak zwanego tła EEG/MEG, czyli manifestacji elektrycznej innych, trwających w tym samym czasie w mózgu procesów (aktywny prąd niezależny), wymaga w dniu dzisiejszym zapisu odpowiedzi na szereg powtórzeń tego samego bodźca (&amp;lt;xr id=&amp;quot;fig:EP&amp;quot;&amp;gt;rys. %i&amp;lt;/xr&amp;gt;). Pierwsze potencjały wywołane pokazał pod koniec lat 40-tych Dawson (Dawson 1947) wykonując superpozycję pojedynczych realizacji na kliszy fotograficznej.&lt;br /&gt;
Z czasem skomplikowane urządzenia analogowe zastąpione zostały przez cyfrowe uśrednianie kolejnych fragmentów EEG, zsynchronizowanych według momentu wystąpienia bodźca, łatwo realizowane za pomocą komputera.&lt;br /&gt;
&lt;br /&gt;
[[Grafika:EP.png|thumb|640px|center|&amp;lt;figure id=&amp;quot;fig:EP&amp;quot;&amp;gt;&amp;lt;/figure&amp;gt;&lt;br /&gt;
Uśrednianie potencjałów wywołanych. a) ciągły zapis EEG z wyróżnionymi momentami wystąpienia bodźca (w tym przypadku słuchowego) b) kilkadziesiąt kolejnych odcinków, wyciętych jako sekunda EEG od momentu wystąpienia kolejnych bodźców, ustawione jeden pod drugim c) uśredniony potencjał wywołany &amp;amp;mdash; widać m. in. załamek P300 ok. 300 milisekund po bodźcu]]&lt;br /&gt;
&lt;br /&gt;
Techniki te opierają się na założeniu, że zawarta w EEG odpowiedź mózgu na każdy z kolejnych bodźców jest niezmienna, a EEG odzwierciedlające pozostałe procesy traktowane jest jak nieskorelowany z nią proces stochastyczny. Zależnie od rodzaju potencjałów wywołanych, założenia te są mniej lub bardziej nieuzasadnione; podważa je choćby powszechnie znany efekt habituacji, polegający na osłabieniu późnych potencjałów wywołanych kolejnymi powtórzeniami bodźca.&lt;br /&gt;
&lt;br /&gt;
Istota potencjałów wywołanych jest przedmiotem otwartej dyskusji i dziesiątków prac, dotykających od lat podstawowych w tej dziedzinie pytań: czym jest potencjał wywołany, który widzimy w uśrednionym przebiegu? Czy naprawdę wynika z deterministycznie powtarzanej, jednakowej odpowiedzi pojawiającej się po każdym powtórzeniu bodźca niezależnie od &amp;amp;bdquo;tła&amp;amp;rdquo;, czy może wynika z reorganizacji faz tego właśnie &amp;amp;bdquo;tła&amp;amp;rdquo; EEG, czy może kombinacji tych dwóch efektów? Jest to wspaniałe pole dla zastosowań zaawansowanych metod modelowania i analizy sygnałów. W ostatnich latach powstają dziesiątki prac na ten temat, a od czasu do czasu również krytyczne artykuły wykazujące, że dotychczasowe odkrycia są raczej artefaktami stosowanych metod a nie wynikają z własności analizowanych danych (Yeung et al., 2004). Jak widać jest tu wciąż bardzo wiele do zrobienia, gdyż zrozumienie tego mechanizmu stoi na drodze do &amp;amp;bdquo;świętego Graala&amp;amp;rdquo;, którym w tej dziedzinie jest wyodrębnienie pojedynczych potencjałów wywołanych.&lt;br /&gt;
&lt;br /&gt;
Niezależnie od tego, w neurofizjologii klinicznej nazwą potencjał wywołany określa się krzywą widoczną po uśrednieniu odpowiedzi na kilkanaście do kilku tysięcy bodźców (Szelenberger 2000). Gromadzona od dziesięcioleci wiedza o behawioralnych i klinicznych korelatach potencjałów wywołanych opiera się na rozpoznawaniu w przebiegach uśrednionych tak zwanych załamków, czyli przejściowych wzrostów lub spadków potencjału (na przykład na &amp;lt;xr id=&amp;quot;fig:EP&amp;quot;&amp;gt;rys. %i&amp;lt;/xr&amp;gt; widać załamek P300). Nazwy załamków składają się zwykle z litery &amp;amp;bdquo;P&amp;amp;rdquo; (od ang. ''positive''), jeśli wychylenie jest dodatnie, lub &amp;amp;bdquo;N&amp;amp;rdquo; (od ang. ''negative''), jeśli wychylenie jest ujemne, oraz liczby. Uwaga: &lt;br /&gt;
* Nie ma niestety jednej ustalonej konwencji prezentacji potencjałów koniecznie trzeba więc zwracać uwagę na orientację wykresu, a wykonując wykres samemu - zamieszczać informację o orientacji kierunku dodatniego,gdyż kierunek dodatni może być wykresie skierowany do góry lub do dołu. &lt;br /&gt;
* Liczba następująca po N lub P określa przybliżoną liczbę milisekund od wystąpienia bodźca, czyli tak zwaną latencję. Nie można jednak ścisłego związku między tą liczbą a liczbą milisekund np. potencjał P300 w zależności od szczegółów paradygmatu doświadczalnego może wystąpić znacznie później. np. w eksperymentach językowych zdarza się że P300 występuje później niż N400 :-).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;xr id=&amp;quot;fig:zalamki&amp;quot;&amp;gt;Rys. %i&amp;lt;/xr&amp;gt; przedstawia schematycznie najważniejsze załamki rozpoznawane w potencjałach słuchowych, czyli wywoływanych bodźcem dźwiękowym. Dla potencjałów wzrokowych i somatosensorycznych istnieją podobne klasyfikacje.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Grafika:Zalamki.png|thumb|320px|right|&amp;lt;figure id=&amp;quot;fig:zalamki&amp;quot;&amp;gt;&amp;lt;/figure&amp;gt;&lt;br /&gt;
Orientacyjny schemat załamków rozpoznawanych w słuchowych potencjach wywołanych, na podstawie (Szelenberger 2000). Skala czasu logarytmiczna. Najszybsze (do 12 ms) składowe egzogenne to potencjały pniowe (BAEP), oznaczane jako fale I-VII. Litery &amp;amp;bdquo;P&amp;amp;rdquo; i &amp;amp;bdquo;N&amp;amp;rdquo; oznaczają dodatnie i ujemne wychylenia związane z dalszymi załamkami]]&lt;br /&gt;
&lt;br /&gt;
Najszybsze (czyli o najmniejszej latencji) składowe to potencjały egzogenne, odzwierciedlające wstępne fazy przekazu informacji. W potencjałach słuchowych są to potencjały pnia (ang. ''brainstem auditory evoked potentials'', BAEP), składające się z siedmiu fal występujących pomiędzy 1 a 12 ms od bodźca. Są one generowane np. w nerwie słuchowym czy pniu mózgu, i wykorzystywane w klinicznej diagnostyce integralności dróg słuchowych. Podobnie jak inne wczesne potencjały o latencjach poniżej 100 ms, są praktycznie niezależne od stanu uwagi.&lt;br /&gt;
&lt;br /&gt;
Po potencjałach o średniej latencji (między 12 a 50 ms) zaczynają się późne potencjały słuchowe (od 100 ms od podania bodźca), odzwierciedlające bardziej złożone reakcje na bodziec. Potencjały ok. 100 ms obserwowane w okolicach sensorycznych odzwierciedlają odpowiedź tejże kory na bodziec. Ich amplituda zależy od parametrów fizycznych bodźca oraz od uwagi, np. amplituda załamka N100 wzrasta w stanie skupienia uwagi czy pobudzenia emocjonalnego. Pierwszy i najpopularniejszy całkowicie endogenny załamek to P300, pojawiający się po rozpoznaniu bodźca oczekiwanego, na którym skupiamy uwagę: na przykład, jeśli w serii pojawiających się losowo liter mamy zliczać wystąpienia jednej z nich, to na średniej odpowiedzi na pojawienie się tej litery pojawi się załamek P300. Załamek ten występuje również w odpowiedzi na bodźce wyczekiwane, niespodziewane i ważne dla osoby (np. własne imię). &lt;br /&gt;
&lt;br /&gt;
=== Uśrednianie w dziedzinie czasu ===&lt;br /&gt;
Jak już było wspomniane powyżej podstawową techniką stosowaną do analizy potencjałów wywołanych jest uśrednianie wielu realizacji odpowiedzi na bodziec wyrównanych względem jakiegoś charakterystycznego zdarzenia, np. momentu podania bodźca albo momentu behawioralnej reakcji na bodziec (np. wciśnięcie przycisku). Podejście to bazuje na trzech założeniach:&lt;br /&gt;
* Reakcja jest czasowo związana z bodźcem. Tzn. w kolejnych realizacjach występuje ona zawsze z tym samym opóźnieniem.&lt;br /&gt;
* Reakcja na bodziec skutkuje zawsze pojawieniem się w sygnale składowej o stałym kształcie (mówimy o stałej morfologii).&lt;br /&gt;
* Spontaniczna czynność EEG &amp;amp;mdash; ta która nie dotyczy przetwarzania interesującego nas bodźca &amp;amp;mdash; jest niezależnym, stacjonarnym szumem o średniej zero.&lt;br /&gt;
&lt;br /&gt;
Zgodnie z powyższymi założeniami mierzony w ''i''-tej realizacji sygnał można wyrazić jako:&lt;br /&gt;
: &amp;lt;math&amp;gt;x_i(t) = s(t) + n_i(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
Uśrednianie po ''N'' realizacjach daje:&lt;br /&gt;
: &amp;lt;math&amp;gt;\bar x (t) = \frac{1}{N} \sum_{i=1}^N x_i(t) = \frac{1}{N} \left(N s(t) + \sum_{i=1}^N n_i(t) \right) &amp;lt;/math&amp;gt;&lt;br /&gt;
Wartość oczekiwana średniego sygnału wynosi:&lt;br /&gt;
: &amp;lt;math&amp;gt;\mathrm{E}\left[ \bar x(t) \right] = s(t) &amp;lt;/math&amp;gt;&lt;br /&gt;
gdyż dla szumu o średniej zero mamy:&lt;br /&gt;
: &amp;lt;math&amp;gt;\mathrm{E}\left[\frac{1}{N} \sum_{i=1}^N n_i(t)\right] = 0&amp;lt;/math&amp;gt;.&lt;br /&gt;
Wariancja &amp;lt;math&amp;gt;\bar x(t)&amp;lt;/math&amp;gt; wynosi:&lt;br /&gt;
: &amp;lt;math&amp;gt;\sigma^2_{\bar x(t)} = \mathrm{E} \left[  \left( \frac{1}{N} \sum_{i=1}^N n_i(t)\right)^2 \right] \approx \frac{1}{N} \sigma^2_{n(t)}&amp;lt;/math&amp;gt;&lt;br /&gt;
gdyż &amp;lt;math&amp;gt;s(t)&amp;lt;/math&amp;gt; jest deterministyczne. &lt;br /&gt;
&lt;br /&gt;
Dla potencjałów pojawiających się w pierwszych kilkudziesięciu milisekundach po bodźcu model ten można uznać za poprawny, gdyż wykazują one zależność głównie od parametrów fizycznych bodźca. Dla późniejszych składowych staje się on coraz bardziej wątpliwy ze względu na występujące korelacje ze stanem (np. uwagi) badanego.&lt;br /&gt;
&lt;br /&gt;
Dla późniejszych składowych można by postulować bardziej ogólną wersję modelu potencjału wywołanego:&lt;br /&gt;
: &amp;lt;math&amp;gt;x_i(t) = s_i(t) + n_i(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
Ten model uwidacznia, że do opisu potencjału wywołanego potrzebna jest nie tylko średnia, ale i wyższe momenty rozkładu (np. drugi moment centralny czyli wariancja).&lt;br /&gt;
&lt;br /&gt;
====Wariancja w przypadku szumu skorelowanego ====&lt;br /&gt;
W poprzednim paragrafie pokazaliśmy, że w przypadku niezależnego szumu wariancja uśrednionego sygnału (w danej chwili czasu) maleje jak  &amp;lt;math&amp;gt;\frac{1}{N}&amp;lt;/math&amp;gt;. Jednak w przypadku gdy kolejne próbki szumu są skorelowane (np. występuje silna aktywność rytmiczna alfa) sytuacja się komplikuje. Intuicyjnie łatwo możemy to sobie wyobrazić w granicznym przypadku. Załóżmy, że tło dla  potencjałów o stałej morfologii   stanowi sinusoida. Jeśli będziemy podawać bodźce w odstępach będących wielokrotnością okresu tej sinusoidy to w uśrednianych fragmentach sygnału owa sinusoida jest tak samo powtarzalna jak badany potencjał i uśrednianie nie prowadzi do poprawy stosunku amplitudy sygnału do amplitudy tła. &lt;br /&gt;
&lt;br /&gt;
Stopień zależności pomiędzy próbkami można zmierzyć przy pomocy funkcji autokorelacji. &lt;br /&gt;
Jeśli funkcję autokorelacji przybliżymy przez:&lt;br /&gt;
: &amp;lt;math&amp;gt;R_{xx}(\tau) = \sigma^2 \exp(-\beta |\tau|) \cos(2 \pi f_0 \tau)&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\sigma^2&amp;lt;/math&amp;gt; jest wariancją szumu, &amp;lt;math&amp;gt;f_0&amp;lt;/math&amp;gt; jest średnią częstością aktywności rytmicznej, &amp;lt;math&amp;gt;\beta/ \pi&amp;lt;/math&amp;gt; jest szerokością pasma tej czynności, zaś &amp;lt;math&amp;gt;\tau&amp;lt;/math&amp;gt; opóźnieniem, to wariancję potencjału wywołanego można wyrazić jako&amp;lt;!-- \cite{Spekreijse_1976}--&amp;gt;:&lt;br /&gt;
: &amp;lt;math&amp;gt;\sigma^2_{\bar x(t)} = \frac{\sigma^2}{N} \left[ \frac{1-\exp(-2 \beta T)}{1 - 2 \exp(- \beta T) \cos(2 \pi f_0 T) +\exp(-2 \beta T)} \right]&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; jest odstępem między bodźcami. &lt;br /&gt;
Widać stąd, że obecność czynności rytmicznej w tle wpływa na stosunek sygnału do szumu. Z powyższego równania widać, że stosunek wariancji dąży do &amp;lt;math&amp;gt;\frac{\sigma^2}{N}&amp;lt;/math&amp;gt; gdy &amp;lt;math&amp;gt;\beta T&amp;lt;/math&amp;gt; staje się duże.  &lt;br /&gt;
&lt;br /&gt;
Periodyczna stymulacja może ponadto prowadzić do wzbudzenia czynności rytmicznej o częstości równej częstości pobudzania bądź jej harmonicznej.&lt;br /&gt;
&lt;br /&gt;
===Wariancja latencji===&lt;br /&gt;
&lt;br /&gt;
Jedną z form zmienności potencjału wywołanego w pojedynczych realizacjach jest wariancja latencji. &lt;br /&gt;
[[Grafika:Wariancja_latencji.png|thumb|500px|right|&lt;br /&gt;
Czerwona linia: Uśrednianie 100 potencjałów wywołanych o latncjach z rozkładu normalnego N(300,30 ), Niebieskie linie: przykładowe pojedyncze realizacje wzięte do średniej]]&amp;lt;!--# -*- coding: utf-8 -*-&lt;br /&gt;
from __future__ import division&lt;br /&gt;
import numpy as np&lt;br /&gt;
from matplotlib.pyplot import plot, show ,subplot, figure, title, xlabel, ylabel, ylim&lt;br /&gt;
 &lt;br /&gt;
def fun(t,lat=100):&lt;br /&gt;
    return np.exp(-(t-lat)**2/(2*30**2))&lt;br /&gt;
Fs = 1&lt;br /&gt;
N = 100&lt;br /&gt;
t = np.arange(0,700)&lt;br /&gt;
f = np.zeros((N,700))&lt;br /&gt;
f_sr = np.zeros(t.shape)&lt;br /&gt;
for i in range(N):&lt;br /&gt;
    f[i,:] = fun(t,lat = 300 + 30* np.random.randn())&lt;br /&gt;
for i in range(3):&lt;br /&gt;
    plot(t,f[i,:], 'b')&lt;br /&gt;
plot(t,f.mean(0),'r')&lt;br /&gt;
show()--&amp;gt;&lt;br /&gt;
Zmienność latencji prowadzi do:&lt;br /&gt;
* zmniejszenia amplitudy &amp;lt;math&amp;gt;\bar x&amp;lt;/math&amp;gt;&lt;br /&gt;
* wzrostu rozciągłości czasowej załamka&lt;br /&gt;
&lt;br /&gt;
O tych konsekwencjach zmienności latencji należy w szczególności pamiętać porównując średnie potencjały uzyskane w różnych warunkach eksperymentalnych. Gdy zauważymy, że średnie potencjały różnią się amplitudą należy rozważyć możliwość, że w istocie warunki eksperymentalne wpływają na różnice w wariancji latencji. &lt;br /&gt;
&lt;br /&gt;
Naturalne jest, że zmienność latencji jest bardziej widoczna w przypadku załamków trwających krótko niż w przypadku załamków trwających długo. Wariancja latencji rożnie wraz z jej wartością, stąd wśród późnych składowych potencjałów wywołanych nie obserwuje się komponentów krótkotrwałych.&lt;br /&gt;
&amp;lt;!--====Uśrednianie metodą Woody'ego ====&lt;br /&gt;
&lt;br /&gt;
Model potencjału ze zmienną latencją i sposób na jego efektywniejsze uśrednianie zaproponował Woody (1967). Model ten zakłada, że w każdej realizacji występuje komponent addytywny &amp;lt;math&amp;gt;s_i(t)\;&amp;lt;/math&amp;gt;, który co do kształtu jest stały, a pomiędzy realizacjami różni się tylko latencją:&lt;br /&gt;
: &amp;lt;math&amp;gt; s_i(t) = s(t +\Delta t_i)\;&amp;lt;/math&amp;gt;&lt;br /&gt;
Woody zaproponował aby &amp;lt;math&amp;gt;\Delta t_i\;&amp;lt;/math&amp;gt; szacować na podstawie maksimum funkcji korelacji wzajemnej pomiędzy ''i''-tą realizacją a wzorcem. W pierwszym kroku wzorcem jest średni potencjał uzyskany przez proste uśrednienie realizacji.  Następnie w sposób iteracyjny dokonuje się:&lt;br /&gt;
* poprawek w wyrównaniu poszczególnych realizacji,&lt;br /&gt;
* obliczenia nowego wzorca poprzez uśrednienie realizacji po korekcie wyrównania,&lt;br /&gt;
* obliczenia nowych poprawek do wyrównania realizacji.--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Habituacja ===&lt;br /&gt;
Zmienność w odpowiedziach na kolejno występujące po sobie bodźce można podzielić na komponent stochastyczny i deterministyczny. Komponent deterministyczny odzwierciedla zmianę czułości  układu nerwowego  na kolejne bodźce. Nowy bodziec często wywołuje reakcje pobudzenia widoczną w wielu parametrach takich jak przewodnictwo skóry, rytm serca i reaktywność kory mózgowej. Powszechnie obserwowanym zjawiskiem jest spadek reaktywności na powtarzające się bodźce zwany habituacją. Niekiedy obserwuje się także zjawisko przeciwne &amp;amp;mdash; wzrost reaktywności na bodziec &amp;amp;mdash; zwane sensytyzacją. &lt;br /&gt;
&lt;br /&gt;
Klasycznym sposobem na badanie tych zjawisk w potencjałach wywołanych jest uśrednianie w podzbiorach lub  uśrednianie blokowe. Wymaga ono  zmiany paradygmatu rejestracji danych. Załóżmy, że interesującym nas bodźcem jest błysk światła. Chcemy zaobserwować ewentualne zmiany amplitudy i latencji w ciągu 100 potencjałów będących reakcją na błysk powtarzający się co 500 ms.&lt;br /&gt;
====Uśrednianie w podzbiorach ====&lt;br /&gt;
W metodzie tej musimy założyć, że proces habituacji jest powolny, tzn. zmiany pomiędzy kolejnymi reakcjami są bardzo małe. W takim przypadku możemy podzielić długą serię bodźców na ciąg pod-serii i uśrednienie przeprowadzić dla każdej pod-serii osobno.&lt;br /&gt;
[[Plik:Usrednianie_podzbiory.svg‎|640px|thumb|center|Ilustracja uśredniania w podzbiorach]]&lt;br /&gt;
&lt;br /&gt;
====Uśrednianie blokowe====&lt;br /&gt;
W tym celu eksperyment wykonujemy w wielu seriach. Jedna seria składa się ze 100 błysków powtarzanych co 500 ms.  Po serii następuje przerwa trwająca np. 5 s (długość przerwy wyraża nasze oszacowanie czasu potrzebnego na zanik habituacji). Po przerwie seria jest powtarzana. Powtórzeń serii wykonujemy ''N''.&lt;br /&gt;
Następnie uśredniamy fragmenty sygnałów odpowiadające sobie w kolejnych seriach. &lt;br /&gt;
&lt;br /&gt;
W tym paradygmacie zakładamy, że każda seria rejestrowana jest w tych samych warunkach. Zaniedbujemy efekty związane ze zmęczeniem i zmianami w np. stopniu koncentracji badanego.&lt;br /&gt;
[[Plik:Usrednianie blokowe.svg|Usrednianie blokowe.svg|640px|thumb|center|Ilustracja uśredniania w blokach]]&lt;br /&gt;
&lt;br /&gt;
===Załamki w krzywej potencjału wywołanego vs ukryte komponenty===&lt;br /&gt;
Komponenta potencjału wywołanego to bardzo ważne ale jednocześnie źle określone pojęcie. Krzywa otrzymana w wyniku uśredniania potencjałów wywołanych przedstawia serię załamków dodatnich i ujemnych, ale trzeba być świadomym, że ten przebieg napięcia rejestrowany przez elektrody przedstawia tak naprawdę sumę potencjałów pochodzących od wielu dość niezależnie działających źródeł w mózgu. Przyczynek pochodzący od jednego funkcjonalnego źródła będziemy określać jako komponentę. &lt;br /&gt;
&lt;br /&gt;
Komentarza wymaga też pojęcie źródła funkcjonalnego. Czynność elektryczną synchronicznie działających neuronów piramidalnych w określonym fragmencie kory mózgowej z pewnej odległości można przybliżyć potencjałem dipola prądowego. Taki aktywny fragment kory stanowi źródło dające przyczynek do mierzonego na powierzchni głowy potencjału. W najprostszej sytuacji taki przyczynek może być obserwowany jako komponenta. Mózg jest jednak obiektem niezwykle złożonym i gęsto połączonym. Wiele obszarów korowych może być funkcjonalnie połączonych i aktywowanych synchronicznie w celu realizacji określonego zadania &amp;amp;mdash; o takim funkcjonalnym zespole też możemy myśleć jako o pojedynczym źródle, choć może ono mieć złożoną strukturę przestrzenną. Często zatem myślimy o komponentach ukrytych potencjału wywołanego jako o aktywności takich funkcjonalnych zespołów. &lt;br /&gt;
&lt;br /&gt;
Po tym wstępie widać już chyba, że do zrozumienia co dzieje się w czasie reakcji na bodziec, którą obserwujemy w potencjale wywołanym, bardziej pożądane byłoby badanie komponent ukrytych niż poszczególnych załamków krzywej potencjału wywołanego, która stanowi ważoną sumę owych komponentów. Zanim przejdziemy do omówienia technik służących &amp;amp;bdquo;wyłuskiwaniu&amp;amp;rdquo; komponent prześledźmy kilka symulacji i wnioski z nich płynące.&lt;br /&gt;
&lt;br /&gt;
==== Załamki i komponenty nie są tym samym.====&lt;br /&gt;
Tę samą krzywą można otrzymać na nieskończenie wiele sposobów  przez sumowanie rożnych kombinacji domniemanych komponentów. Przykładowy rysunek pokazuje, jak tę samą krzywą można złożyć z dwóch rożnych zestawów komponentów (kod wytwarzający przykładową symulację pokazany jest poniżej).&lt;br /&gt;
[[Plik:Sumowanie_komponentow1.png|center|thumb|600px| Panel a) przedstawia hipotetyczną krzywą ERP, panel b) jedna z możliwych dekompozycji sygnału w panelu a), panel c) inna możliwa dekompozycja sygnału z panelu a) ]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
from __future__ import division&lt;br /&gt;
import numpy as np&lt;br /&gt;
from matplotlib.pyplot import plot, show ,subplot, figure, title, xlabel, ylabel, ylim&lt;br /&gt;
&lt;br /&gt;
Fs = 1&lt;br /&gt;
t = np.arange(0,700)&lt;br /&gt;
&lt;br /&gt;
C1 = np.exp(-(t-100)**2/(2*30**2))&lt;br /&gt;
C2 = np.exp(-(t-200)**2/(2*50**2))&lt;br /&gt;
C3 = np.exp(-(t-350)**2/(2*100**2))&lt;br /&gt;
ERP = 0.5*C1-C2+C3&lt;br /&gt;
&lt;br /&gt;
C2p = np.concatenate((C2[0:200], np.ones(30), C2[200:700-30] ))&lt;br /&gt;
C3p = ERP - 0.5*C1 + C2p&lt;br /&gt;
ERP_v2 = 0.5*C1-C2p+C3p&lt;br /&gt;
&lt;br /&gt;
subplot(3,1,1)&lt;br /&gt;
plot(t,ERP, t[::10],ERP_v2[::10],'g.')&lt;br /&gt;
ylabel('a)',rotation='horizontal')&lt;br /&gt;
ylim([-1, 1.5])&lt;br /&gt;
&lt;br /&gt;
subplot(3,1,2)&lt;br /&gt;
plot(t,0.5*C1,t,-C2,t,C3)&lt;br /&gt;
ylabel('b)',rotation='horizontal')&lt;br /&gt;
ylim([-1, 1.5])&lt;br /&gt;
&lt;br /&gt;
subplot(3,1,3)&lt;br /&gt;
plot(t,0.5*C1,t,-C2p,t,C3p)&lt;br /&gt;
ylabel('c)',rotation='horizontal')&lt;br /&gt;
ylim([-1, 1.5])&lt;br /&gt;
&lt;br /&gt;
show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Zmiana jednej komponenty może powodować zmiany w amplitudzie i latencji więcej niż jednego załamka.====&lt;br /&gt;
Poniższy rysunek przedstawia sytuację gdy zmiana amplitudy jednego komponentu może znacząco wpływać na amplitudę i latencję innych załamków.&lt;br /&gt;
&lt;br /&gt;
[[Plik:Sumowanie_komponentow2.png|center|thumb|768px| Panel a) przedstawia dwie hipotetyczne krzywe ERP, panel b) panel b i c komponenty z których powstały owe krzywe. Zmiana amplitudy komponentu oznaczonego kolorem powoduje zmianę amplitudy oznaczonych załamków ale także zmianę latencji wcześniejszego załamka. ]]&lt;br /&gt;
Poniżej kod odtwarzający powyższy przykład:&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
from __future__ import division&lt;br /&gt;
import numpy as np&lt;br /&gt;
from matplotlib.pyplot import plot, show, subplot, figure, title, xlabel, ylabel, ylim&lt;br /&gt;
&lt;br /&gt;
Fs = 1&lt;br /&gt;
t = np.arange(0,700)&lt;br /&gt;
&lt;br /&gt;
C1 = np.exp(-(t-100)**2/(2*30**2))&lt;br /&gt;
C2 = np.exp(-(t-200)**2/(2*50**2))&lt;br /&gt;
C3 = np.exp(-(t-350)**2/(2*100**2))&lt;br /&gt;
ERP1 = 0.5*C1-C2+C3&lt;br /&gt;
ERP2 = 0.5*C1-C2+1.5*C3&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
subplot(3,1,1)&lt;br /&gt;
plot(t,ERP1,'b', t,ERP2,'g')&lt;br /&gt;
plot(t[np.argmin(ERP1)],np.min(ERP1),'r.' )&lt;br /&gt;
plot(t[np.argmax(ERP1)],np.max(ERP1),'m.' )&lt;br /&gt;
plot(t[np.argmin(ERP2)],np.min(ERP2),'r.' )&lt;br /&gt;
plot(t[np.argmax(ERP2)],np.max(ERP2),'m.' )&lt;br /&gt;
&lt;br /&gt;
ylabel('a)',rotation='horizontal')&lt;br /&gt;
ylim([-1, 1.6])&lt;br /&gt;
&lt;br /&gt;
subplot(3,1,2)&lt;br /&gt;
plot(t,0.5*C1,'k',t,-C2,'k',t,C3,'b')&lt;br /&gt;
ylabel('b)',rotation='horizontal')&lt;br /&gt;
ylim([-1, 1.6])&lt;br /&gt;
&lt;br /&gt;
subplot(3,1,3)&lt;br /&gt;
plot(t,0.5*C1,'k',t,-C2,'k',t,1.5*C3,'g')&lt;br /&gt;
ylabel('c)',rotation='horizontal')&lt;br /&gt;
ylim([-1, 1.6])&lt;br /&gt;
&lt;br /&gt;
show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Instrukcje do ćwiczeń =&lt;br /&gt;
&lt;br /&gt;
==Zadanie 1: uśrednianie symulowanych sygnałów==&lt;br /&gt;
w tym ćwiczeniu chcemy pokazać efekty:&lt;br /&gt;
# uśredniania sygnałów związanych fazowo z bodźcem i nieskorelowanych z bodźcem / wpływ liczby realizacji,&lt;br /&gt;
# uśredniania sygnałów z fluktuacją latencji,&lt;br /&gt;
# wpływ filtrów o różnych funkcjach odpowiedzi impulsowej na morfologię uśrednionego potencjału.&lt;br /&gt;
&lt;br /&gt;
===Sygnały testowe===&lt;br /&gt;
Proszę zaimplementować funkcje generujące następujące przebiegi czasowe (oznaczenia: ''F&amp;lt;sub&amp;gt;s&amp;lt;/sub&amp;gt;'' &amp;amp;mdash; częstość próbkowania, ''T'' &amp;amp;mdash; czas trwania w sekundach, [[%C4%86wiczenia_1#Sygna.C5.82y_testowe|analogicznie do tego]]):&lt;br /&gt;
* sinusoida o zadanej częstości ''f'' i fazie &amp;lt;math&amp;gt;\phi&amp;lt;/math&amp;gt;: &amp;lt;tt&amp;gt;y = sin(f, phi, Fs, T)&amp;lt;/tt&amp;gt;,&lt;br /&gt;
* funkcja Gaussa o zadanym położeniu i szerokości &amp;lt;tt&amp;gt;y = g_1(t0, sigma, Fs, T) &amp;lt;/tt&amp;gt;&lt;br /&gt;
: &amp;lt;math&amp;gt;g_1(t) = \exp\left(-\frac{(t-t_0)^2}{2 \sigma^2}\right)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* pochodną funkcji Gaussa o zadanym położeniu i szerokości &amp;lt;tt&amp;gt;y = g_2(t0, sigma, Fs, T)&amp;lt;/tt&amp;gt;,&lt;br /&gt;
* połowę funkcji Gaussa o zadanym położeniu i szerokości &amp;lt;tt&amp;gt;y = g_3(t0, sigma, Fs, T)&amp;lt;/tt&amp;gt;,&lt;br /&gt;
: &amp;lt;math&amp;gt;g_{3}(t) = \left\{ &lt;br /&gt;
\begin{array}{lll}&lt;br /&gt;
0 &amp;amp; \mathrm{dla}&amp;amp; t&amp;lt;t_0 \\&lt;br /&gt;
\exp\left(-\frac{(t-t_0)^2}{2 \sigma^2}\right)&amp;amp; \mathrm{dla}&amp;amp; t \ge t_0  &lt;br /&gt;
\end{array}&lt;br /&gt;
\right. &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
W dalszych zadaniach tej sekcji przyjmiemy:&lt;br /&gt;
* ''T'' = 1 s,&lt;br /&gt;
* ''F&amp;lt;sub&amp;gt;s&amp;lt;/sub&amp;gt;'' = 128 Hz,&lt;br /&gt;
* ''t''&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; = 0,3 s,&lt;br /&gt;
* &amp;amp;sigma; = 0,02 s.&lt;br /&gt;
&lt;br /&gt;
===Uśrednianie w modelu addytywnym: sygnał + szum===&lt;br /&gt;
Dla funkcji &amp;lt;math&amp;gt;g_1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;g_2&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;g_3&amp;lt;/math&amp;gt;  wykonaj ''N'' symulacji sygnału opisanego daną funkcją z dodanym szumem gaussowskim (&amp;lt;tt&amp;gt;numpy.random.randn&amp;lt;/tt&amp;gt;). Zaobserwuj zmianę wariancji uśrednianego sygnału wraz z ''N''.&lt;br /&gt;
&lt;br /&gt;
===Uśrednianie w modelu addytywnym: sygnał + szum + niezależna czynność rytmiczna===&lt;br /&gt;
Powtórz poprzednie symulacje dokładając w każdej realizacji sinusoidę o losowo wybranej fazie. Symulacje wykonaj dla różnych częstości sinusoidy, takich których połówka okresu zbliżona jest do szerokości funkcji Gaussa, oraz znacząco od niej różnych.&lt;br /&gt;
&lt;br /&gt;
===Uśrednianie w modelu z resetem fazy===&lt;br /&gt;
Zbuduj sygnał składający się z dwóch fragmentów sinusoidy o częstości ''f'': &lt;br /&gt;
* pierwszy fragment ma losową fazę,&lt;br /&gt;
* drugi fragment ma fazę równą 0.&lt;br /&gt;
Wykonaj ''N'' realizacji takiego sygnału, przy czym każda realizacja ma częstość losowaną z rozkładu Gaussa o średniej 10 i pewnej wariancji (czyli &amp;lt;math&amp;gt;f \in \mathrm{N}(10,\sigma)&amp;lt;/math&amp;gt;). &lt;br /&gt;
Uśrednij otrzymane realizacje. Zaobserwuj zależność średniej od liczby uśrednianych realizacji i od wariancji częstości.&lt;br /&gt;
&lt;br /&gt;
===Uśrednianie potencjału z fluktuacją latencji===&lt;br /&gt;
Wygeneruj sygnały składające się z funkcji &amp;lt;math&amp;gt;g_1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;g_2&amp;lt;/math&amp;gt; albo &amp;lt;math&amp;gt;g_3&amp;lt;/math&amp;gt; z fluktuującą latencją, tzn. z wartością &amp;lt;math&amp;gt;t_0&amp;lt;/math&amp;gt; pochodzącą z jakiegoś rozkładu prawdopodobieństwa. U nas dla ustalenia uwagi niech będzie to rozkład Gaussa. Wykonaj zestaw symulacji obrazujący zależność od liczby realizacji i od wielkości fluktuacji, mierzonej przez wariancję rozkładu. Czy jest związek pomiędzy wariancją fluktuacji &amp;lt;math&amp;gt;t_0&amp;lt;/math&amp;gt; a szerokością załamków?&lt;br /&gt;
&lt;br /&gt;
===Wpływ filtrów===&lt;br /&gt;
# Zaprojektuj następujące filtry (przyjmij częstość próbkowania 128 Hz):&lt;br /&gt;
#* dolnoprzepustowy: Butterwortha z częstością odcięcia: 30, 40, 50 Hz, i rzędach od 1 do 5 (funkcja butter w module scipy.signal),&lt;br /&gt;
#* górnoprzepustowy: Butterwortha z częstością odcięcia: 0,1, 0,5, 2 i 5 Hz, i rzędach od 1 do 5,&lt;br /&gt;
#* notch: Czybyszewa II rodzaju z pasmem zaporowym ustawionym na 50 Hz, i rzędach od 1 do 3 (funkcja cheby2),&lt;br /&gt;
# Zbadaj funkcję odpowiedzi impulsowej i funkcję przenoszenia tych filtrów (w skali dB). Zaobserwuj jak długa jest odpowiedź impulsowa i jak daleko od częstości odcięcia zaburzone jest pasmo przenoszenia.&lt;br /&gt;
# Zastosuj powyższe filtry do funkcji &amp;lt;math&amp;gt;g_1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;g_2&amp;lt;/math&amp;gt; albo &amp;lt;math&amp;gt;g_3&amp;lt;/math&amp;gt;. Filtrowanie przeprowadź w jedną (lfilter) oraz w dwie strony (filtfilt). Zaobserwuj związek między zniekształceniem wprowadzanym przez filtr a funkcją odpowiedzi impulsowej filtru.&lt;br /&gt;
# W ćwiczeniu tym posłuż się symulowanymi sygnałami uzyskanymi z modelu addytywnego: &amp;amp;bdquo;sygnał+szum&amp;amp;rdquo;. Dla funkcji &amp;lt;math&amp;gt;g_1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;g_2&amp;lt;/math&amp;gt; albo &amp;lt;math&amp;gt;g_3&amp;lt;/math&amp;gt;  wykonaj ''N'' = 60 realizacji sygnału opisanego daną funkcją z dodanym szumem gaussowskim (&amp;lt;tt&amp;gt;numpy.random.randn&amp;lt;/tt&amp;gt;). Każdą z realizacji przefiltruj, a następnie uśrednij uzyskane sygnały.&lt;br /&gt;
&lt;br /&gt;
==Zadanie 2: rejestracje i analiza potencjałów wzrokowych==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;! -- ===Synchronizacja występowania bodźców z sygnałem EEG===&lt;br /&gt;
&lt;br /&gt;
Rejestracja potencjałów wywołanych jest przykładem pomiaru czynności elektrycznej mózgu w odpowiedzi na określony bodziec. W przypadku tego rodzaju pomiarów konieczna jest synchronizacja momentu wystąpienia bodźca z sygnałem EEG. Wzmacniacze do pomiaru czynności elektrycznej mózgu wyposażone są w specjalne wejścia, na które można podawać sygnał odpowiadający pojawianiu się bodźca. Jak pamiętamy z zeszłego semestru, wejście to (jak i podawany na nie sygnał) nazywamy trigerem (ang. ''trigger'' &amp;amp;mdash; spust, cyngiel, wyzwalacz). W najprostszym przypadku, bodziec moglibyśmy wyświetlać na monitorze komputerowym, a sygnał związany z jego wystąpieniem wysyłać przez któryś z portów komputera (LPT, COM) na wzmacniacz EEG. Niestety, obecnie dostępne i popularne systemy operacyjne, takie jak Windows czy Linux nie są systemami czasu rzeczywistego (http://pl.wikipedia.org/wiki/System_operacyjny_czasu_rzeczywistego). Od momentu wyświetlania bodźca na ekranie, do pojawiania się sygnału odpowiednim porcie komputerowym może upłynąć kilkadziesiąt milisekund i co gorsza czas ten zwykle jest losowy. W przypadku gdy wzmacniacz próbkuje sygnał z częstością 1000 Hz, moment wystąpienia bodźca możemy określić z dokładnością 1 ms, jednakże wspomniane opóźnienia w systemie operacyjnym uniemożliwiają to. Ponadto, jak dowiedzieliśmy się w rozdziale wstępnym [http://brain.fuw.edu.pl/edu-wiki/action/edit/EEG:Potencja%C5%82y_wywo%C5%82ane?section=T-1], pierwsze załamki związane z potencjałami wywołanymi pojawiają się już 10 ms po wystąpieniu bodźca. W związku z tym, losowe, rzędu kilkudziesięciu milisekund opóźnienia sygnału określającego moment pojawienia się bodźca względem jego rzeczywistego wystąpienia są niedopuszczalne.&lt;br /&gt;
Istnieją pewne techniki programowania, dzięki którym opisywane opóźnienia można zmniejszyć, jednakże są one bardzo trudne  do realizacji. Ponadto, standardowe porty komputera, takie jak LPT, czy COM zostały zaprojektowane przede wszystkim do sterowania urządzeniami zewnętrznymi, a nie ich zasilania. Przykładowo, jedna linia portu drukarkowego (LPT) może być obciążona prądem nie większym niż 5 mA, podczas gdy do zapalenie zwykłej diody LED potrzeba około 10 mA. Taki pobór prądu możliwy jest do uzyskania z portu USB, jednakże  jest on  wyjątkowo trudny do oprogramowania.  &lt;br /&gt;
W celu ominięcia powyższych niedogodności w Zakładzie Fizyki Biomedycznej UW w przeprowadzanych eksperymentach wykorzystywane są  mikrokontrolery [http://pl.wikipedia.org/wiki/Mikrokontroler], w szczególności ATmega16 i ATmega32.  Mikrokontrolery te wyposażone są w procesory o architekturze RISC [http://pl.wikipedia.org/wiki/RISC] i mocy obliczeniowej porównywalnej z szeroko stosowanym kiedyś w komputerach ZX Spectrum, Commodore, Amiga i Atari procesorem Z80. Oprócz jednostki centralnej mikrokontrolery zawierają   stałą pamięć FLASH przeznaczoną do przechowywania kodu programu, pamięć  RAM i pamięć EEPROM, liczniki 8- i 16-bitowe, komparatory, przetworniki analogowo-cyfrowe, porty wejścia/wyjścia, łącze RS232 (popularnie nazywane portem szeregowym) i układy przerwań.&lt;br /&gt;
&lt;br /&gt;
Mikrokontrolery wchodzące w skład zestawów pomiarowych na Pracowni EEG zawierają program, który umożliwia komunikację z nimi poprzez port szeregowy. Obecnie, komputery są coraz rzadziej wyposażane w porty szeregowe. Standard komunikacji RS-232, opracowany w 1962 roku  nadal jest jednak popularny i często wykorzystywany do komunikacji miedzy urządzeniami.  W celu połączenia komputera posiadającego tylko porty USB z mikrokontrolerem zastosowano przejściówkę USB/RS-232. &lt;br /&gt;
&lt;br /&gt;
Jak każde urządzenie w systemie Linuks, przejściówka USB/RS-232 widoczna jest jako plik, znajdujący się w katalogu &amp;lt;tt&amp;gt;/dev&amp;lt;/tt&amp;gt;. Nazwy plików obsługujących urządzenia szeregowe to &amp;lt;tt&amp;gt;ttyXY&amp;lt;/tt&amp;gt;, gdzie &amp;lt;tt&amp;gt;XY&amp;lt;/tt&amp;gt; to kolejny numer przydzielony do urządzenia szeregowego.&lt;br /&gt;
Do komunikacji komputera z mikroknotrolerem  w Zakładzie Fizyki Biomedycznej UW została napisana prosta biblioteka.  Jej użycie jest następujące:&lt;br /&gt;
* Po podłączeniu przejściówki USB/RS232 do komputera mikrokontrolera sprawdź jaki plik w katalogu &amp;lt;tt&amp;gt;/dev&amp;lt;/tt&amp;gt; został utworzony i przydzielony do urządzenia. &lt;br /&gt;
* Zaimportuj bibliotekę do komunikacji z mikrokontrolerem: &lt;br /&gt;
: &amp;lt;tt&amp;gt;import SerialPort as SP&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Otwórz plik powiązany z urządzeniem zewnętrznym:&lt;br /&gt;
: &amp;lt;tt&amp;gt;sp = SP.SerialPort(nazwa_pliku) &amp;lt;/tt&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
: &amp;lt;tt&amp;gt;sp.open()&amp;lt;/tt&amp;gt;&lt;br /&gt;
W naszym przypadku prawidłowa nazwa pliku to &amp;lt;tt&amp;gt;/dev/ttyUSB0&amp;lt;/tt&amp;gt;.&lt;br /&gt;
* Po włączeniu zasilania mikrokontrolera, diody podłączone do niego i wykorzystywane w eksperymencie z potencjałami wywołanymi będą zapalone. Następujące polecenie zgasi obydwie diody:&lt;br /&gt;
: &amp;lt;tt&amp;gt;sp.blinkP300([0, 0])&amp;lt;/tt&amp;gt;&lt;br /&gt;
* Wydanie poniższego polecenia spowoduje, iż mikrokontroler zapali podłączoną do niego diodę numer 1 na czas 100 ms, zaś diodę numer 2 na 200 ms. Jednocześnie, w momencie włączenia jak i wyłączenia diody, sygnał z mikrokontrolera zostanie wysłany na 5-stykowe wejście AUX mikrokontrolera:&lt;br /&gt;
: &amp;lt;tt&amp;gt;sp.blinkP300([100, 200])&amp;lt;/tt&amp;gt;&lt;br /&gt;
* Jeśli chcemy zapalić tylko diodę numer dwa, np. na czas 500 ms w programie podajemy następującą instrukcję:&lt;br /&gt;
: &amp;lt;tt&amp;gt;sp.blinkP300([0, 500])&amp;lt;/tt&amp;gt;&lt;br /&gt;
* Jeśli chcemy zakończyć komunikację z mikrokontrolerem piszemy:&lt;br /&gt;
: &amp;lt;tt&amp;gt;sp.close()&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Kod biblioteki do komunikacji z mikrokontrolerem:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;!--  Kod w Pythonie 2&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# -*- coding: cp1250 -*-&lt;br /&gt;
import serial&lt;br /&gt;
import logging&lt;br /&gt;
import sys&lt;br /&gt;
import os&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def to_hex_word(a):&lt;br /&gt;
    '''encodes a decimal number hexadecimally on two bytes'''&lt;br /&gt;
    return chr(a%256) + chr(a/256)&lt;br /&gt;
&lt;br /&gt;
class SerialPort(object):&lt;br /&gt;
    def __init__(self, port_name):&lt;br /&gt;
        import serial&lt;br /&gt;
        try:&lt;br /&gt;
            self.port = serial.Serial(&lt;br /&gt;
                port=port_name,&lt;br /&gt;
                baudrate=9600,&lt;br /&gt;
                bytesize=serial.EIGHTBITS,&lt;br /&gt;
                parity=serial.PARITY_NONE,&lt;br /&gt;
                stopbits=serial.STOPBITS_ONE,&lt;br /&gt;
                xonxoff=False&lt;br /&gt;
                )&lt;br /&gt;
        except serial.SerialException as e:&lt;br /&gt;
            print(&amp;quot;Nieprawidłowa nazwa portu lub port zajęty.&amp;quot;)&lt;br /&gt;
            raise e&lt;br /&gt;
        self.close()&lt;br /&gt;
        &lt;br /&gt;
    def open(self):&lt;br /&gt;
        self.port.open()&lt;br /&gt;
&lt;br /&gt;
    def close(self):&lt;br /&gt;
        self.port.close()&lt;br /&gt;
&lt;br /&gt;
    def send(self, value):&lt;br /&gt;
        self.port.write(value)&lt;br /&gt;
                           &lt;br /&gt;
    def blinkSSVEP(self,d, p1, p2):&lt;br /&gt;
        '''&lt;br /&gt;
        d = list of frequencies;&lt;br /&gt;
        p1:p2 = ratio LED_on_time/LED_off_time&lt;br /&gt;
        if you want i-th LED to be OFF all the time send  d[i] = 0&lt;br /&gt;
        if you want i-th LED to be ON all the time send  d[i] = -1&lt;br /&gt;
        in these two cases p1 and p2 do not matter&lt;br /&gt;
        '''&lt;br /&gt;
        clock  = 62500&lt;br /&gt;
        factor = float(p1) / float(p1 + p2)&lt;br /&gt;
    &lt;br /&gt;
        str = chr(3) # 'SSVEP_RUN'&lt;br /&gt;
&lt;br /&gt;
        for i in range(len(d)):&lt;br /&gt;
            # i-th LED OFF&lt;br /&gt;
            if d[i] == 0:                       &lt;br /&gt;
                str += to_hex_word(0) + to_hex_word(255) &lt;br /&gt;
            # i-th LED ON&lt;br /&gt;
            elif d[i] == -1:&lt;br /&gt;
                str += to_hex_word(255) + to_hex_word(0)&lt;br /&gt;
                #str = 'S'&lt;br /&gt;
                # i-th LED blinks d[i] times per second&lt;br /&gt;
                # p1:p2 = on_time:off_time in one blink&lt;br /&gt;
            else:&lt;br /&gt;
                period = clock/d[i]&lt;br /&gt;
                bright = int((clock/d[i]) * factor)&lt;br /&gt;
                dark = period - bright&lt;br /&gt;
                str += to_hex_word(bright) + to_hex_word(dark)&lt;br /&gt;
&lt;br /&gt;
        self.send(str)&lt;br /&gt;
&lt;br /&gt;
    def blinkP300(self,d):&lt;br /&gt;
        clock  = 62500&lt;br /&gt;
        str = chr(4) # 'P300_RUN'&lt;br /&gt;
&lt;br /&gt;
        for i in range(len(d)):&lt;br /&gt;
            period = int(clock*d[i]/1000.0)&lt;br /&gt;
            str += to_hex_word(period)&lt;br /&gt;
            print(period)&lt;br /&gt;
&lt;br /&gt;
        self.send(str)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
--&amp;gt; &amp;lt;!-- Kod w Pythonie 3 --&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# -*- coding: cp1250 -*-&lt;br /&gt;
import serial&lt;br /&gt;
import logging&lt;br /&gt;
import sys&lt;br /&gt;
import os&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
def to_hex_word(a):&lt;br /&gt;
    '''encodes a decimal number hexadecimally on two bytes'''&lt;br /&gt;
    return a.to_bytes(2,byteorder=sys.byteorder)&lt;br /&gt;
 &lt;br /&gt;
class SerialPort(object):&lt;br /&gt;
    def __init__(self, port_name):&lt;br /&gt;
        import serial&lt;br /&gt;
        try:&lt;br /&gt;
            self.port = serial.Serial(&lt;br /&gt;
                port=port_name,&lt;br /&gt;
                baudrate=9600,&lt;br /&gt;
                bytesize=serial.EIGHTBITS,&lt;br /&gt;
                parity=serial.PARITY_NONE,&lt;br /&gt;
                stopbits=serial.STOPBITS_ONE,&lt;br /&gt;
                xonxoff=False&lt;br /&gt;
                )&lt;br /&gt;
        except serial.SerialException as e:&lt;br /&gt;
            print(&amp;quot;Nieprawidłowa nazwa portu lub port zajęty.&amp;quot;)&lt;br /&gt;
            raise e&lt;br /&gt;
        self.close()&lt;br /&gt;
 &lt;br /&gt;
    def open(self):&lt;br /&gt;
        self.port.open()&lt;br /&gt;
 &lt;br /&gt;
    def close(self):&lt;br /&gt;
        self.port.close()&lt;br /&gt;
 &lt;br /&gt;
    def send(self, value):&lt;br /&gt;
        self.port.write(value)&lt;br /&gt;
 &lt;br /&gt;
    def blinkSSVEP(self,d, p1, p2):&lt;br /&gt;
        '''&lt;br /&gt;
        d = list of frequencies;&lt;br /&gt;
        p1:p2 = ratio LED_on_time/LED_off_time&lt;br /&gt;
        if you want i-th LED to be OFF all the time send  d[i] = 0&lt;br /&gt;
        if you want i-th LED to be ON all the time send  d[i] = -1&lt;br /&gt;
        in these two cases p1 and p2 do not matter&lt;br /&gt;
        '''&lt;br /&gt;
        clock  = 62500&lt;br /&gt;
        factor = float(p1) / float(p1 + p2)&lt;br /&gt;
 &lt;br /&gt;
        str = (3).to_bytes(1,byteorder=sys.byteorder) # 'SSVEP_RUN'&lt;br /&gt;
 &lt;br /&gt;
        for i in range(len(d)):&lt;br /&gt;
            # i-th LED OFF&lt;br /&gt;
            if d[i] == 0:                       &lt;br /&gt;
                str += to_hex_word(0) + to_hex_word(255) &lt;br /&gt;
            # i-th LED ON&lt;br /&gt;
            elif d[i] == -1:&lt;br /&gt;
                str += to_hex_word(255) + to_hex_word(0)&lt;br /&gt;
                #str = 'S'&lt;br /&gt;
                # i-th LED blinks d[i] times per second&lt;br /&gt;
                # p1:p2 = on_time:off_time in one blink&lt;br /&gt;
            else:&lt;br /&gt;
                period = clock/d[i]&lt;br /&gt;
                bright = int((clock/d[i]) * factor)&lt;br /&gt;
                dark = int(period - bright)&lt;br /&gt;
                str += to_hex_word(bright) + to_hex_word(dark)&lt;br /&gt;
 &lt;br /&gt;
        self.send(str)&lt;br /&gt;
 &lt;br /&gt;
    def blinkP300(self,d):&lt;br /&gt;
        clock  = 62500&lt;br /&gt;
        str = (4).to_bytes(1,byteorder=sys.byteorder) # 'P300_RUN'&lt;br /&gt;
 &lt;br /&gt;
        for i in range(len(d)):&lt;br /&gt;
            period = int(clock*d[i]/1000.0)&lt;br /&gt;
            str += to_hex_word(period)&lt;br /&gt;
 &lt;br /&gt;
        self.send(str)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
--&amp;gt; &lt;br /&gt;
&lt;br /&gt;
===Zestaw eksperymentalny===&lt;br /&gt;
Zestaw składa się ze:&lt;br /&gt;
* wzmacniacza,&lt;br /&gt;
* stymulatora   &lt;br /&gt;
&amp;lt;!--* izolowanego galwanicznie układu generującego impulsy odpowiadające gaszeniu i zapalaniu diody,  o wartościach dopasowanych do akceptowalnych przez wejścia AUX wzmacniacza,--&amp;gt;&lt;br /&gt;
* komputera: w tym eksperymencie komputer będzie służył do zaprogramowania stymulatora i do rejestracji sygnałów.&lt;br /&gt;
&lt;br /&gt;
===Eksperyment 1. Obserwacja bodźca wzrokowego  ===&lt;br /&gt;
&amp;lt;!--Proszę zapoznać się ze standardami rejestracji wzrokowych potencjałów wywołanych [http://www.gcu.ac.uk/media/gcalwebv2/theuniversity/academicschools/sls/psytimetables/SLS%20-%20VEP_Standard_2010.pdf] --&amp;gt;&lt;br /&gt;
Proszę zapoznać się z typowym wyglądem załamków w przypadku potencjałów wzrokowych, jaki jest przedstawiony na [https://link.springer.com/article/10.1007/s10633-009-9195-4/figures/2 rysunku] (cały artykuł jest dostępny [http://link.springer.com/article/10.1007%2Fs10633-009-9195-4 tu]).&lt;br /&gt;
&amp;lt;!--[[Plik:Fig 4 VEP.jpg|thumb|320px|right|&amp;lt;figure id=&amp;quot;fig:zalamki_VEP&amp;quot;&amp;gt;&amp;lt;/figure&amp;gt;&lt;br /&gt;
&amp;lt;xr id=&amp;quot;fig:zalamki_VEP&amp;quot;&amp;gt;Rys. %i.&amp;lt;/xr&amp;gt; Schemat załamków rozpoznawanych we wzrokowych potencjach wywołanych (z pracy: J. V. Odom i in. &amp;amp;bdquo;ISCEV standard for clinical visual evoked potentials&lt;br /&gt;
(2009 update)&amp;amp;rdquo;, Doc Ophthalmol (2010), 120:111–119).]]&lt;br /&gt;
--&amp;gt; &lt;br /&gt;
&lt;br /&gt;
==== Rejestracja ====&lt;br /&gt;
* Paradygmat: z odległości około 40 cm badany obserwuje wyświetalny na ekranie biały kwadrat. Bodźce trwają 300 ms i  powtarzają się co 0.5 sekundy. Bodziec poprzedza punkt fiksacji pokazywany przez 300 ms. Natężenie bodźca ma przyjąć jedną z 4 wartości (manipulujemy jego przeźroczystością: 1, 0.7, 0.3 i 0.1, gdzie 1 oznacza brak przeźroczystości). Każda z intensywności bodźca ma pojawić się 100 razy podczas badania, bodźce podawane mają być w sposób losowy. Zadanie poprzedza krótka instrukcja, kończy podziękowanie. &lt;br /&gt;
&lt;br /&gt;
* Pomiar&lt;br /&gt;
**Zakładamy czepek i elektrody w systemie 10-20, dbamy o to by opory pomiędzy elektrodami były poniżej 10 k&amp;amp;Omega; i różnice pomiędzy oporami różnych elektrod nie przekraczały 20%. [[Plik:Glowka10-20 ERPy.svg|thumb|600px|right]]&lt;br /&gt;
** Elektrodę GND mocujemy w otworze czepka odpowiadającym pozycji AFz (na linii centralnej 10% w stronę nosa od elektrody Fz) &lt;br /&gt;
** Montujemy także elektrody M1 i M2 i FCz.&lt;br /&gt;
&lt;br /&gt;
==== Analiza ====&lt;br /&gt;
# Filtrujemy sygnał w paśmie 1-20 Hz.&lt;br /&gt;
# Z ciągłego zapisu wycinamy fragmenty od &amp;amp;minus;300 ms do +800 ms (zero oznacza moment wystąpienia bodźca). W czasie wycinania badamy wycinane fragmenty pod względem zakresu amplitudy (wszystkie kanały powinny mieć amplitudę w granicach &amp;amp;plusmn;75 &amp;amp;mu;V) i zawartości artefaktów od mrugania (w tym celu trzeba oglądając sygnał w SVAROG-u ustalić próg na amplitudę sygnału w kanałach Fp1 i Fp2).&lt;br /&gt;
# Uśredniamy wycięte sygnały.&lt;br /&gt;
# Rysujemy średni potencjał we wszystkich kanałach.&lt;br /&gt;
# Pierwszy sposób: Identyfikujemy załamki P1 i N2. Mierzymy amplitudę P1 jako różnicę między ekstremalną wartością załamka N2 a ekstremalną wartością załamka N2. &lt;br /&gt;
# Drugi sposób: Identyfikujemy załamki P1 i N2. Mierzymy amplitudę P1 w stosunku do zera. &lt;br /&gt;
#porównujemy uzyskane amplitudy w 4 warunkach za pomocą odpowiedniego testu statystycznego (porównanie warunków ze skrajnymi wartościami amplitudy - zastosuj test permutacyjny (opisany poniżej) lub test t-Studenta/nieparametryczny odpowiednik). &lt;br /&gt;
&lt;br /&gt;
**Opis testu permutacyjnego &lt;br /&gt;
Pytanie: Czy intensywność bodźca wpływa na amplitudę potencjału P1?&lt;br /&gt;
Jak stwierdzić czy amplitudy załamków P1 istotnie różnią się pomiędzy seriami?&lt;br /&gt;
&lt;br /&gt;
Musimy przeprowadzić test statystyczny. Możemy skonstruować go np. tak:&lt;br /&gt;
Mamy dwa warunki I i II. Jako statystykę przyjmiemy różnicę pomiędzy amplitudą załamka zmierzoną w serii z dwoma diodami (P2&amp;lt;sub&amp;gt;II&amp;lt;/sub&amp;gt;) a amplitudą zmierzoną w serii z jedną diodą (P2&amp;lt;sub&amp;gt;I&amp;lt;/sub&amp;gt;):&lt;br /&gt;
: ''S'' = P2&amp;lt;sub&amp;gt;II&amp;lt;/sub&amp;gt; &amp;amp;minus; P2&amp;lt;sub&amp;gt;I&amp;lt;/sub&amp;gt;&lt;br /&gt;
Postawmy hipotezę zerową, że nie ma różnicy w amplitudzie pomiędzy warunkiem II a I oraz hipotezę alternatywną, że różnica taka występuje.&lt;br /&gt;
: H&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;: ''S'' = 0&lt;br /&gt;
: H&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;: ''S'' &amp;amp;ne; 0&lt;br /&gt;
Zgodnie z H&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; dla wartości ''S'' nie ma różnicy czy realizacja została zarejestrowana w warunkach I czy II, zatem można losowo poprzypisywać numery warunków do realizacji i w ten sposób uzyskać rozkład statystyki ''S'' pod warunkiem prawdziwości H&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;, czyli obliczyć średnie potencjały dla &amp;amp;bdquo;pomieszanych&amp;amp;rdquo; tagów, wyliczyć średnie potencjały dla sztucznie wygenerowaych grup, i wyliczyć różnicę amplitud dla tych średnich, czyli wartość statystyki dla hipotezy H&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Zaimplementuj test permutacyjny zgodny z powyższą koncepcją.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- ===Wersja 2: obserwacja habituacji / uśrednianie w blokach ===&lt;br /&gt;
==== Rejestracja ====&lt;br /&gt;
# Paradygmat: &lt;br /&gt;
#* z odległości około 40 cm badany obserwuje błyski diody. &lt;br /&gt;
#* Błyski powtarzają się co 0,5 sekundy. &lt;br /&gt;
#* Rejestrujemy 60 serii po 15 błysków.  &lt;br /&gt;
#* Pomiędzy seriami badany odpoczywa około 10 sekund.&lt;br /&gt;
# Zakładamy czepek i elektrody w systemie 10-20, dbamy o to by opory pomiędzy elektrodami były poniżej 5 k&amp;amp;Omega; i różnice pomiędzy oporami różnych elektrod nie przekraczały 20%.&lt;br /&gt;
#* Elektrodę GND mocujemy w otworze czepka odpowiadającym pozycji AFz (na linii centralnej 10% w stronę nosa od elektrody Fz) &lt;br /&gt;
#* Montujemy także elektrodę FCz (na linii centralnej pomiędzy Fz a Cz), będziemy jej używać w montażu i w czasie analizy jako referencji.&lt;br /&gt;
#* Częstość próbkowania 512 Hz.&lt;br /&gt;
&lt;br /&gt;
==== Analiza ====&lt;br /&gt;
# Filtrujemy sygnał w paśmie 0,1-20 Hz.&lt;br /&gt;
# Z ciągłego zapisu wycinamy fragmenty od &amp;amp;minus;300 ms do +600 ms (zero oznacza moment wystąpienia bodźca). W czasie wycinania badamy wycinane fragmenty pod względem zakresu amplitudy (wszystkie kanały powinny mieć amplitudę w granicach &amp;amp;plusmn;75 &amp;amp;mu;V) i zawartości artefaktów od mrugania (w tym celu trzeba oglądając sygnał w SVAROG-u ustalić próg na amplitudę sygnału w kanałach Fp1 i Fp2).&lt;br /&gt;
# Uśredniamy wycięte sygnały o tym samym numerze wewnątrz serii.&lt;br /&gt;
# Rysujemy serie 15 uśrednionych potencjałów dla tego kanału, który wykazywał najsilniejszy potencjał w pierwszej wersji eksperymentu. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Eksperyment 2: rejestracja i analiza potencjału P3 ==&lt;br /&gt;
==== Rejestracja ====&lt;br /&gt;
# Paradygmat: &lt;br /&gt;
#* z odległości około 40 cm badany obserwuje kwadrat, który występuje w dwóch kolorach. &lt;br /&gt;
#* Bodźce trwają 300 ms, poprzedzane punktem fiksacji wyświetlanym na 300 ms, przerwa między próbami jest losowana i wynosi od 0.8-1.2 s.  &lt;br /&gt;
#* Proporcja wystapień bodźców koloru pierwszego i drugiego wynosi 1:5.   &lt;br /&gt;
#* Zadaniem badanego jest liczenie kwadratów w rzadkim kolorze. &lt;br /&gt;
#* Wykonujemy tyle realizacji aby zarejestrować 100 powtórzeń bodźców rzadkich. &lt;br /&gt;
# Zakładamy czepek i elektrody w systemie 10-20, dbamy o to by opory pomiędzy elektrodami były poniżej 5 k&amp;amp;Omega; i różnice pomiędzy oporami różnych elektrod nie przekraczały 20%.&lt;br /&gt;
#* Elektrodę GND mocujemy w otworze czepka odpowiadającym pozycji AFz (na linii centralnej 10% w stronę nosa od elektrody Fz) &lt;br /&gt;
#* Montujemy także elektrody M1 i M2, będziemy ich używać w montażu i w czasie analizy jako referencji typu połączone uszy.&lt;br /&gt;
#* Częstość próbkowania 512 Hz.&lt;br /&gt;
&lt;br /&gt;
==== Analiza ====&lt;br /&gt;
# Filtrujemy sygnał w paśmie 1-20 Hz.&lt;br /&gt;
# Z ciągłego zapisu wycinamy fragmenty od &amp;amp;minus;300 ms do +900 ms (zero oznacza moment wystąpienia bodźca). W czasie wycinania badamy wycinane fragmenty pod względem zakresu amplitudy (wszystkie kanały powinny mieć amplitudę w granicach &amp;amp;plusmn;75 &amp;amp;mu;V) i zawartości artefaktów od mrugania (w tym celu trzeba oglądając sygnał w SVAROG-u ustalić próg na amplitudę sygnału w kanałach Fp1 i Fp2).&lt;br /&gt;
# Uśredniamy osobno realizacje dla każdego koloru kwadratu. &lt;br /&gt;
# Nakładamy na siebie na rysunkach oba typy średnich.&lt;br /&gt;
# wyznaczamy amplitudę P3 i liczymy test statystyczny pomiędzy warunkami&lt;br /&gt;
&lt;br /&gt;
==Ćwiczenie dodatkowe: P300 BCI==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wykorzystujemy elektrody z systemu 10-10 umieszczone nad korą wzrokową: P07, O1, O2, PO8, PO3, PO4, Pz, Cz.&lt;br /&gt;
&lt;br /&gt;
Uruchamiamy &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
obci_gui --presets eeg_workshop&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
i z guzika &amp;amp;bdquo;select amplifier&amp;amp;rdquo; wybieramy właściwy wzmacniacz.&lt;br /&gt;
&lt;br /&gt;
Do kontroli jakości sygnału możemy uruchomić Svaroga.&lt;br /&gt;
&lt;br /&gt;
Dane z kalibracji zapisują się w pliku test1 w katalogu domowym użytkownika, z labiryntu w pliku test2.&lt;br /&gt;
&lt;br /&gt;
Po zakończeniu kalibracji pojawia się napis &amp;amp;bdquo;Trwają obliczenia&amp;amp;rdquo; lub podobny. Odczekujemy kilka minut, aż skończy się peer &amp;amp;bdquo;Calibration&amp;amp;rdquo; (widoczny w obci_gui) i zamykamy okienko klawiszami Alt-F4 lub zatrzymując scenariusz guzikiem &amp;amp;bdquo;Stop&amp;amp;rdquo;. W katalogu domowym pojawi się plik z wynikami kalibracji, co pozwala na uruchomienie scenariusza &amp;amp;bdquo;labirynt&amp;amp;rdquo;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Po zebraniu danych, przed wczytaniem ich do Svaroga należy w tym samym katalogu uruchomić skrypt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
#!/usr/bin/env python&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
&lt;br /&gt;
from obci.analysis.obci_signal_processing.tags import tags_file_writer&lt;br /&gt;
from obci.analysis.obci_signal_processing.read_manager import ReadManager&lt;br /&gt;
&lt;br /&gt;
def main(): &lt;br /&gt;
	file_name = 'test1'&lt;br /&gt;
	&lt;br /&gt;
	mgr = ReadManager(&lt;br /&gt;
		file_name + '.obci.xml',&lt;br /&gt;
		file_name + '.obci.raw',&lt;br /&gt;
		file_name + '.obci.tag')&lt;br /&gt;
	&lt;br /&gt;
	tags = mgr.get_tags()&lt;br /&gt;
	for i in xrange(0, len(tags)):&lt;br /&gt;
		if tags[i]['desc']['index'] == tags[i]['desc']['target']:&lt;br /&gt;
			tags[i]['name'] = 'blink_target'&lt;br /&gt;
		else:&lt;br /&gt;
			tags[i]['name'] = 'blink'&lt;br /&gt;
			&lt;br /&gt;
	tags_writer = tags_file_writer.TagsFileWriter(file_name + '.obci.tag')&lt;br /&gt;
	for tag in tags:&lt;br /&gt;
		tags_writer.tag_received(tag)		&lt;br /&gt;
	tags_writer.finish_saving(0)	&lt;br /&gt;
 &lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Aduszyk</name></author>
		
	</entry>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=Pracownia_EEG/Potencja%C5%82y_wywo%C5%82ane&amp;diff=8974</id>
		<title>Pracownia EEG/Potencjały wywołane</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=Pracownia_EEG/Potencja%C5%82y_wywo%C5%82ane&amp;diff=8974"/>
		<updated>2022-11-08T10:46:01Z</updated>

		<summary type="html">&lt;p&gt;Aduszyk: /* Analiza */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Pracownia EEG|Pracownia EEG]] / Potencjały wywołane&lt;br /&gt;
&lt;br /&gt;
=Wstęp=&lt;br /&gt;
==Potencjały wywołane==&lt;br /&gt;
=== Wstęp ===&lt;br /&gt;
Potencjały wywołane EEG (ang. ''evoked potentials'', EP) są śladami odpowiedzi mózgu na bodźce. W przypadku MEG poprawnie mówi się o polach wywołanych (ang. ''evoked fields'', EF).&lt;br /&gt;
Zwykle reakcja ta jest mała (wyjątek stanowią [[Elektroencefalografia/Metody_analizy_sygnałów_EEG_-_analiza_w_dziedzinie_czasu |kompleksy K]]) i w zapisie pojedynczej realizacji reakcji na bodziec najczęściej niewidoczna wśród czynności pochodzącej od wielu innych procesów zachodzących w tym samym czasie w mózgu. &lt;br /&gt;
Ich wyodrębnienie z tak zwanego tła EEG/MEG, czyli manifestacji elektrycznej innych, trwających w tym samym czasie w mózgu procesów (aktywny prąd niezależny), wymaga w dniu dzisiejszym zapisu odpowiedzi na szereg powtórzeń tego samego bodźca (&amp;lt;xr id=&amp;quot;fig:EP&amp;quot;&amp;gt;rys. %i&amp;lt;/xr&amp;gt;). Pierwsze potencjały wywołane pokazał pod koniec lat 40-tych Dawson (Dawson 1947) wykonując superpozycję pojedynczych realizacji na kliszy fotograficznej.&lt;br /&gt;
Z czasem skomplikowane urządzenia analogowe zastąpione zostały przez cyfrowe uśrednianie kolejnych fragmentów EEG, zsynchronizowanych według momentu wystąpienia bodźca, łatwo realizowane za pomocą komputera.&lt;br /&gt;
&lt;br /&gt;
[[Grafika:EP.png|thumb|640px|center|&amp;lt;figure id=&amp;quot;fig:EP&amp;quot;&amp;gt;&amp;lt;/figure&amp;gt;&lt;br /&gt;
Uśrednianie potencjałów wywołanych. a) ciągły zapis EEG z wyróżnionymi momentami wystąpienia bodźca (w tym przypadku słuchowego) b) kilkadziesiąt kolejnych odcinków, wyciętych jako sekunda EEG od momentu wystąpienia kolejnych bodźców, ustawione jeden pod drugim c) uśredniony potencjał wywołany &amp;amp;mdash; widać m. in. załamek P300 ok. 300 milisekund po bodźcu]]&lt;br /&gt;
&lt;br /&gt;
Techniki te opierają się na założeniu, że zawarta w EEG odpowiedź mózgu na każdy z kolejnych bodźców jest niezmienna, a EEG odzwierciedlające pozostałe procesy traktowane jest jak nieskorelowany z nią proces stochastyczny. Zależnie od rodzaju potencjałów wywołanych, założenia te są mniej lub bardziej nieuzasadnione; podważa je choćby powszechnie znany efekt habituacji, polegający na osłabieniu późnych potencjałów wywołanych kolejnymi powtórzeniami bodźca.&lt;br /&gt;
&lt;br /&gt;
Istota potencjałów wywołanych jest przedmiotem otwartej dyskusji i dziesiątków prac, dotykających od lat podstawowych w tej dziedzinie pytań: czym jest potencjał wywołany, który widzimy w uśrednionym przebiegu? Czy naprawdę wynika z deterministycznie powtarzanej, jednakowej odpowiedzi pojawiającej się po każdym powtórzeniu bodźca niezależnie od &amp;amp;bdquo;tła&amp;amp;rdquo;, czy może wynika z reorganizacji faz tego właśnie &amp;amp;bdquo;tła&amp;amp;rdquo; EEG, czy może kombinacji tych dwóch efektów? Jest to wspaniałe pole dla zastosowań zaawansowanych metod modelowania i analizy sygnałów. W ostatnich latach powstają dziesiątki prac na ten temat, a od czasu do czasu również krytyczne artykuły wykazujące, że dotychczasowe odkrycia są raczej artefaktami stosowanych metod a nie wynikają z własności analizowanych danych (Yeung et al., 2004). Jak widać jest tu wciąż bardzo wiele do zrobienia, gdyż zrozumienie tego mechanizmu stoi na drodze do &amp;amp;bdquo;świętego Graala&amp;amp;rdquo;, którym w tej dziedzinie jest wyodrębnienie pojedynczych potencjałów wywołanych.&lt;br /&gt;
&lt;br /&gt;
Niezależnie od tego, w neurofizjologii klinicznej nazwą potencjał wywołany określa się krzywą widoczną po uśrednieniu odpowiedzi na kilkanaście do kilku tysięcy bodźców (Szelenberger 2000). Gromadzona od dziesięcioleci wiedza o behawioralnych i klinicznych korelatach potencjałów wywołanych opiera się na rozpoznawaniu w przebiegach uśrednionych tak zwanych załamków, czyli przejściowych wzrostów lub spadków potencjału (na przykład na &amp;lt;xr id=&amp;quot;fig:EP&amp;quot;&amp;gt;rys. %i&amp;lt;/xr&amp;gt; widać załamek P300). Nazwy załamków składają się zwykle z litery &amp;amp;bdquo;P&amp;amp;rdquo; (od ang. ''positive''), jeśli wychylenie jest dodatnie, lub &amp;amp;bdquo;N&amp;amp;rdquo; (od ang. ''negative''), jeśli wychylenie jest ujemne, oraz liczby. Uwaga: &lt;br /&gt;
* Nie ma niestety jednej ustalonej konwencji prezentacji potencjałów koniecznie trzeba więc zwracać uwagę na orientację wykresu, a wykonując wykres samemu - zamieszczać informację o orientacji kierunku dodatniego,gdyż kierunek dodatni może być wykresie skierowany do góry lub do dołu. &lt;br /&gt;
* Liczba następująca po N lub P określa przybliżoną liczbę milisekund od wystąpienia bodźca, czyli tak zwaną latencję. Nie można jednak ścisłego związku między tą liczbą a liczbą milisekund np. potencjał P300 w zależności od szczegółów paradygmatu doświadczalnego może wystąpić znacznie później. np. w eksperymentach językowych zdarza się że P300 występuje później niż N400 :-).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;xr id=&amp;quot;fig:zalamki&amp;quot;&amp;gt;Rys. %i&amp;lt;/xr&amp;gt; przedstawia schematycznie najważniejsze załamki rozpoznawane w potencjałach słuchowych, czyli wywoływanych bodźcem dźwiękowym. Dla potencjałów wzrokowych i somatosensorycznych istnieją podobne klasyfikacje.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Grafika:Zalamki.png|thumb|320px|right|&amp;lt;figure id=&amp;quot;fig:zalamki&amp;quot;&amp;gt;&amp;lt;/figure&amp;gt;&lt;br /&gt;
Orientacyjny schemat załamków rozpoznawanych w słuchowych potencjach wywołanych, na podstawie (Szelenberger 2000). Skala czasu logarytmiczna. Najszybsze (do 12 ms) składowe egzogenne to potencjały pniowe (BAEP), oznaczane jako fale I-VII. Litery &amp;amp;bdquo;P&amp;amp;rdquo; i &amp;amp;bdquo;N&amp;amp;rdquo; oznaczają dodatnie i ujemne wychylenia związane z dalszymi załamkami]]&lt;br /&gt;
&lt;br /&gt;
Najszybsze (czyli o najmniejszej latencji) składowe to potencjały egzogenne, odzwierciedlające wstępne fazy przekazu informacji. W potencjałach słuchowych są to potencjały pnia (ang. ''brainstem auditory evoked potentials'', BAEP), składające się z siedmiu fal występujących pomiędzy 1 a 12 ms od bodźca. Są one generowane np. w nerwie słuchowym czy pniu mózgu, i wykorzystywane w klinicznej diagnostyce integralności dróg słuchowych. Podobnie jak inne wczesne potencjały o latencjach poniżej 100 ms, są praktycznie niezależne od stanu uwagi.&lt;br /&gt;
&lt;br /&gt;
Po potencjałach o średniej latencji (między 12 a 50 ms) zaczynają się późne potencjały słuchowe (od 100 ms od podania bodźca), odzwierciedlające bardziej złożone reakcje na bodziec. Potencjały ok. 100 ms obserwowane w okolicach sensorycznych odzwierciedlają odpowiedź tejże kory na bodziec. Ich amplituda zależy od parametrów fizycznych bodźca oraz od uwagi, np. amplituda załamka N100 wzrasta w stanie skupienia uwagi czy pobudzenia emocjonalnego. Pierwszy i najpopularniejszy całkowicie endogenny załamek to P300, pojawiający się po rozpoznaniu bodźca oczekiwanego, na którym skupiamy uwagę: na przykład, jeśli w serii pojawiających się losowo liter mamy zliczać wystąpienia jednej z nich, to na średniej odpowiedzi na pojawienie się tej litery pojawi się załamek P300. Załamek ten występuje również w odpowiedzi na bodźce wyczekiwane, niespodziewane i ważne dla osoby (np. własne imię). &lt;br /&gt;
&lt;br /&gt;
=== Uśrednianie w dziedzinie czasu ===&lt;br /&gt;
Jak już było wspomniane powyżej podstawową techniką stosowaną do analizy potencjałów wywołanych jest uśrednianie wielu realizacji odpowiedzi na bodziec wyrównanych względem jakiegoś charakterystycznego zdarzenia, np. momentu podania bodźca albo momentu behawioralnej reakcji na bodziec (np. wciśnięcie przycisku). Podejście to bazuje na trzech założeniach:&lt;br /&gt;
* Reakcja jest czasowo związana z bodźcem. Tzn. w kolejnych realizacjach występuje ona zawsze z tym samym opóźnieniem.&lt;br /&gt;
* Reakcja na bodziec skutkuje zawsze pojawieniem się w sygnale składowej o stałym kształcie (mówimy o stałej morfologii).&lt;br /&gt;
* Spontaniczna czynność EEG &amp;amp;mdash; ta która nie dotyczy przetwarzania interesującego nas bodźca &amp;amp;mdash; jest niezależnym, stacjonarnym szumem o średniej zero.&lt;br /&gt;
&lt;br /&gt;
Zgodnie z powyższymi założeniami mierzony w ''i''-tej realizacji sygnał można wyrazić jako:&lt;br /&gt;
: &amp;lt;math&amp;gt;x_i(t) = s(t) + n_i(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
Uśrednianie po ''N'' realizacjach daje:&lt;br /&gt;
: &amp;lt;math&amp;gt;\bar x (t) = \frac{1}{N} \sum_{i=1}^N x_i(t) = \frac{1}{N} \left(N s(t) + \sum_{i=1}^N n_i(t) \right) &amp;lt;/math&amp;gt;&lt;br /&gt;
Wartość oczekiwana średniego sygnału wynosi:&lt;br /&gt;
: &amp;lt;math&amp;gt;\mathrm{E}\left[ \bar x(t) \right] = s(t) &amp;lt;/math&amp;gt;&lt;br /&gt;
gdyż dla szumu o średniej zero mamy:&lt;br /&gt;
: &amp;lt;math&amp;gt;\mathrm{E}\left[\frac{1}{N} \sum_{i=1}^N n_i(t)\right] = 0&amp;lt;/math&amp;gt;.&lt;br /&gt;
Wariancja &amp;lt;math&amp;gt;\bar x(t)&amp;lt;/math&amp;gt; wynosi:&lt;br /&gt;
: &amp;lt;math&amp;gt;\sigma^2_{\bar x(t)} = \mathrm{E} \left[  \left( \frac{1}{N} \sum_{i=1}^N n_i(t)\right)^2 \right] \approx \frac{1}{N} \sigma^2_{n(t)}&amp;lt;/math&amp;gt;&lt;br /&gt;
gdyż &amp;lt;math&amp;gt;s(t)&amp;lt;/math&amp;gt; jest deterministyczne. &lt;br /&gt;
&lt;br /&gt;
Dla potencjałów pojawiających się w pierwszych kilkudziesięciu milisekundach po bodźcu model ten można uznać za poprawny, gdyż wykazują one zależność głównie od parametrów fizycznych bodźca. Dla późniejszych składowych staje się on coraz bardziej wątpliwy ze względu na występujące korelacje ze stanem (np. uwagi) badanego.&lt;br /&gt;
&lt;br /&gt;
Dla późniejszych składowych można by postulować bardziej ogólną wersję modelu potencjału wywołanego:&lt;br /&gt;
: &amp;lt;math&amp;gt;x_i(t) = s_i(t) + n_i(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
Ten model uwidacznia, że do opisu potencjału wywołanego potrzebna jest nie tylko średnia, ale i wyższe momenty rozkładu (np. drugi moment centralny czyli wariancja).&lt;br /&gt;
&lt;br /&gt;
====Wariancja w przypadku szumu skorelowanego ====&lt;br /&gt;
W poprzednim paragrafie pokazaliśmy, że w przypadku niezależnego szumu wariancja uśrednionego sygnału (w danej chwili czasu) maleje jak  &amp;lt;math&amp;gt;\frac{1}{N}&amp;lt;/math&amp;gt;. Jednak w przypadku gdy kolejne próbki szumu są skorelowane (np. występuje silna aktywność rytmiczna alfa) sytuacja się komplikuje. Intuicyjnie łatwo możemy to sobie wyobrazić w granicznym przypadku. Załóżmy, że tło dla  potencjałów o stałej morfologii   stanowi sinusoida. Jeśli będziemy podawać bodźce w odstępach będących wielokrotnością okresu tej sinusoidy to w uśrednianych fragmentach sygnału owa sinusoida jest tak samo powtarzalna jak badany potencjał i uśrednianie nie prowadzi do poprawy stosunku amplitudy sygnału do amplitudy tła. &lt;br /&gt;
&lt;br /&gt;
Stopień zależności pomiędzy próbkami można zmierzyć przy pomocy funkcji autokorelacji. &lt;br /&gt;
Jeśli funkcję autokorelacji przybliżymy przez:&lt;br /&gt;
: &amp;lt;math&amp;gt;R_{xx}(\tau) = \sigma^2 \exp(-\beta |\tau|) \cos(2 \pi f_0 \tau)&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\sigma^2&amp;lt;/math&amp;gt; jest wariancją szumu, &amp;lt;math&amp;gt;f_0&amp;lt;/math&amp;gt; jest średnią częstością aktywności rytmicznej, &amp;lt;math&amp;gt;\beta/ \pi&amp;lt;/math&amp;gt; jest szerokością pasma tej czynności, zaś &amp;lt;math&amp;gt;\tau&amp;lt;/math&amp;gt; opóźnieniem, to wariancję potencjału wywołanego można wyrazić jako&amp;lt;!-- \cite{Spekreijse_1976}--&amp;gt;:&lt;br /&gt;
: &amp;lt;math&amp;gt;\sigma^2_{\bar x(t)} = \frac{\sigma^2}{N} \left[ \frac{1-\exp(-2 \beta T)}{1 - 2 \exp(- \beta T) \cos(2 \pi f_0 T) +\exp(-2 \beta T)} \right]&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; jest odstępem między bodźcami. &lt;br /&gt;
Widać stąd, że obecność czynności rytmicznej w tle wpływa na stosunek sygnału do szumu. Z powyższego równania widać, że stosunek wariancji dąży do &amp;lt;math&amp;gt;\frac{\sigma^2}{N}&amp;lt;/math&amp;gt; gdy &amp;lt;math&amp;gt;\beta T&amp;lt;/math&amp;gt; staje się duże.  &lt;br /&gt;
&lt;br /&gt;
Periodyczna stymulacja może ponadto prowadzić do wzbudzenia czynności rytmicznej o częstości równej częstości pobudzania bądź jej harmonicznej.&lt;br /&gt;
&lt;br /&gt;
===Wariancja latencji===&lt;br /&gt;
&lt;br /&gt;
Jedną z form zmienności potencjału wywołanego w pojedynczych realizacjach jest wariancja latencji. &lt;br /&gt;
[[Grafika:Wariancja_latencji.png|thumb|500px|right|&lt;br /&gt;
Czerwona linia: Uśrednianie 100 potencjałów wywołanych o latncjach z rozkładu normalnego N(300,30 ), Niebieskie linie: przykładowe pojedyncze realizacje wzięte do średniej]]&amp;lt;!--# -*- coding: utf-8 -*-&lt;br /&gt;
from __future__ import division&lt;br /&gt;
import numpy as np&lt;br /&gt;
from matplotlib.pyplot import plot, show ,subplot, figure, title, xlabel, ylabel, ylim&lt;br /&gt;
 &lt;br /&gt;
def fun(t,lat=100):&lt;br /&gt;
    return np.exp(-(t-lat)**2/(2*30**2))&lt;br /&gt;
Fs = 1&lt;br /&gt;
N = 100&lt;br /&gt;
t = np.arange(0,700)&lt;br /&gt;
f = np.zeros((N,700))&lt;br /&gt;
f_sr = np.zeros(t.shape)&lt;br /&gt;
for i in range(N):&lt;br /&gt;
    f[i,:] = fun(t,lat = 300 + 30* np.random.randn())&lt;br /&gt;
for i in range(3):&lt;br /&gt;
    plot(t,f[i,:], 'b')&lt;br /&gt;
plot(t,f.mean(0),'r')&lt;br /&gt;
show()--&amp;gt;&lt;br /&gt;
Zmienność latencji prowadzi do:&lt;br /&gt;
* zmniejszenia amplitudy &amp;lt;math&amp;gt;\bar x&amp;lt;/math&amp;gt;&lt;br /&gt;
* wzrostu rozciągłości czasowej załamka&lt;br /&gt;
&lt;br /&gt;
O tych konsekwencjach zmienności latencji należy w szczególności pamiętać porównując średnie potencjały uzyskane w różnych warunkach eksperymentalnych. Gdy zauważymy, że średnie potencjały różnią się amplitudą należy rozważyć możliwość, że w istocie warunki eksperymentalne wpływają na różnice w wariancji latencji. &lt;br /&gt;
&lt;br /&gt;
Naturalne jest, że zmienność latencji jest bardziej widoczna w przypadku załamków trwających krótko niż w przypadku załamków trwających długo. Wariancja latencji rożnie wraz z jej wartością, stąd wśród późnych składowych potencjałów wywołanych nie obserwuje się komponentów krótkotrwałych.&lt;br /&gt;
&amp;lt;!--====Uśrednianie metodą Woody'ego ====&lt;br /&gt;
&lt;br /&gt;
Model potencjału ze zmienną latencją i sposób na jego efektywniejsze uśrednianie zaproponował Woody (1967). Model ten zakłada, że w każdej realizacji występuje komponent addytywny &amp;lt;math&amp;gt;s_i(t)\;&amp;lt;/math&amp;gt;, który co do kształtu jest stały, a pomiędzy realizacjami różni się tylko latencją:&lt;br /&gt;
: &amp;lt;math&amp;gt; s_i(t) = s(t +\Delta t_i)\;&amp;lt;/math&amp;gt;&lt;br /&gt;
Woody zaproponował aby &amp;lt;math&amp;gt;\Delta t_i\;&amp;lt;/math&amp;gt; szacować na podstawie maksimum funkcji korelacji wzajemnej pomiędzy ''i''-tą realizacją a wzorcem. W pierwszym kroku wzorcem jest średni potencjał uzyskany przez proste uśrednienie realizacji.  Następnie w sposób iteracyjny dokonuje się:&lt;br /&gt;
* poprawek w wyrównaniu poszczególnych realizacji,&lt;br /&gt;
* obliczenia nowego wzorca poprzez uśrednienie realizacji po korekcie wyrównania,&lt;br /&gt;
* obliczenia nowych poprawek do wyrównania realizacji.--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Habituacja ===&lt;br /&gt;
Zmienność w odpowiedziach na kolejno występujące po sobie bodźce można podzielić na komponent stochastyczny i deterministyczny. Komponent deterministyczny odzwierciedla zmianę czułości  układu nerwowego  na kolejne bodźce. Nowy bodziec często wywołuje reakcje pobudzenia widoczną w wielu parametrach takich jak przewodnictwo skóry, rytm serca i reaktywność kory mózgowej. Powszechnie obserwowanym zjawiskiem jest spadek reaktywności na powtarzające się bodźce zwany habituacją. Niekiedy obserwuje się także zjawisko przeciwne &amp;amp;mdash; wzrost reaktywności na bodziec &amp;amp;mdash; zwane sensytyzacją. &lt;br /&gt;
&lt;br /&gt;
Klasycznym sposobem na badanie tych zjawisk w potencjałach wywołanych jest uśrednianie w podzbiorach lub  uśrednianie blokowe. Wymaga ono  zmiany paradygmatu rejestracji danych. Załóżmy, że interesującym nas bodźcem jest błysk światła. Chcemy zaobserwować ewentualne zmiany amplitudy i latencji w ciągu 100 potencjałów będących reakcją na błysk powtarzający się co 500 ms.&lt;br /&gt;
====Uśrednianie w podzbiorach ====&lt;br /&gt;
W metodzie tej musimy założyć, że proces habituacji jest powolny, tzn. zmiany pomiędzy kolejnymi reakcjami są bardzo małe. W takim przypadku możemy podzielić długą serię bodźców na ciąg pod-serii i uśrednienie przeprowadzić dla każdej pod-serii osobno.&lt;br /&gt;
[[Plik:Usrednianie_podzbiory.svg‎|640px|thumb|center|Ilustracja uśredniania w podzbiorach]]&lt;br /&gt;
&lt;br /&gt;
====Uśrednianie blokowe====&lt;br /&gt;
W tym celu eksperyment wykonujemy w wielu seriach. Jedna seria składa się ze 100 błysków powtarzanych co 500 ms.  Po serii następuje przerwa trwająca np. 5 s (długość przerwy wyraża nasze oszacowanie czasu potrzebnego na zanik habituacji). Po przerwie seria jest powtarzana. Powtórzeń serii wykonujemy ''N''.&lt;br /&gt;
Następnie uśredniamy fragmenty sygnałów odpowiadające sobie w kolejnych seriach. &lt;br /&gt;
&lt;br /&gt;
W tym paradygmacie zakładamy, że każda seria rejestrowana jest w tych samych warunkach. Zaniedbujemy efekty związane ze zmęczeniem i zmianami w np. stopniu koncentracji badanego.&lt;br /&gt;
[[Plik:Usrednianie blokowe.svg|Usrednianie blokowe.svg|640px|thumb|center|Ilustracja uśredniania w blokach]]&lt;br /&gt;
&lt;br /&gt;
===Załamki w krzywej potencjału wywołanego vs ukryte komponenty===&lt;br /&gt;
Komponenta potencjału wywołanego to bardzo ważne ale jednocześnie źle określone pojęcie. Krzywa otrzymana w wyniku uśredniania potencjałów wywołanych przedstawia serię załamków dodatnich i ujemnych, ale trzeba być świadomym, że ten przebieg napięcia rejestrowany przez elektrody przedstawia tak naprawdę sumę potencjałów pochodzących od wielu dość niezależnie działających źródeł w mózgu. Przyczynek pochodzący od jednego funkcjonalnego źródła będziemy określać jako komponentę. &lt;br /&gt;
&lt;br /&gt;
Komentarza wymaga też pojęcie źródła funkcjonalnego. Czynność elektryczną synchronicznie działających neuronów piramidalnych w określonym fragmencie kory mózgowej z pewnej odległości można przybliżyć potencjałem dipola prądowego. Taki aktywny fragment kory stanowi źródło dające przyczynek do mierzonego na powierzchni głowy potencjału. W najprostszej sytuacji taki przyczynek może być obserwowany jako komponenta. Mózg jest jednak obiektem niezwykle złożonym i gęsto połączonym. Wiele obszarów korowych może być funkcjonalnie połączonych i aktywowanych synchronicznie w celu realizacji określonego zadania &amp;amp;mdash; o takim funkcjonalnym zespole też możemy myśleć jako o pojedynczym źródle, choć może ono mieć złożoną strukturę przestrzenną. Często zatem myślimy o komponentach ukrytych potencjału wywołanego jako o aktywności takich funkcjonalnych zespołów. &lt;br /&gt;
&lt;br /&gt;
Po tym wstępie widać już chyba, że do zrozumienia co dzieje się w czasie reakcji na bodziec, którą obserwujemy w potencjale wywołanym, bardziej pożądane byłoby badanie komponent ukrytych niż poszczególnych załamków krzywej potencjału wywołanego, która stanowi ważoną sumę owych komponentów. Zanim przejdziemy do omówienia technik służących &amp;amp;bdquo;wyłuskiwaniu&amp;amp;rdquo; komponent prześledźmy kilka symulacji i wnioski z nich płynące.&lt;br /&gt;
&lt;br /&gt;
==== Załamki i komponenty nie są tym samym.====&lt;br /&gt;
Tę samą krzywą można otrzymać na nieskończenie wiele sposobów  przez sumowanie rożnych kombinacji domniemanych komponentów. Przykładowy rysunek pokazuje, jak tę samą krzywą można złożyć z dwóch rożnych zestawów komponentów (kod wytwarzający przykładową symulację pokazany jest poniżej).&lt;br /&gt;
[[Plik:Sumowanie_komponentow1.png|center|thumb|600px| Panel a) przedstawia hipotetyczną krzywą ERP, panel b) jedna z możliwych dekompozycji sygnału w panelu a), panel c) inna możliwa dekompozycja sygnału z panelu a) ]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
from __future__ import division&lt;br /&gt;
import numpy as np&lt;br /&gt;
from matplotlib.pyplot import plot, show ,subplot, figure, title, xlabel, ylabel, ylim&lt;br /&gt;
&lt;br /&gt;
Fs = 1&lt;br /&gt;
t = np.arange(0,700)&lt;br /&gt;
&lt;br /&gt;
C1 = np.exp(-(t-100)**2/(2*30**2))&lt;br /&gt;
C2 = np.exp(-(t-200)**2/(2*50**2))&lt;br /&gt;
C3 = np.exp(-(t-350)**2/(2*100**2))&lt;br /&gt;
ERP = 0.5*C1-C2+C3&lt;br /&gt;
&lt;br /&gt;
C2p = np.concatenate((C2[0:200], np.ones(30), C2[200:700-30] ))&lt;br /&gt;
C3p = ERP - 0.5*C1 + C2p&lt;br /&gt;
ERP_v2 = 0.5*C1-C2p+C3p&lt;br /&gt;
&lt;br /&gt;
subplot(3,1,1)&lt;br /&gt;
plot(t,ERP, t[::10],ERP_v2[::10],'g.')&lt;br /&gt;
ylabel('a)',rotation='horizontal')&lt;br /&gt;
ylim([-1, 1.5])&lt;br /&gt;
&lt;br /&gt;
subplot(3,1,2)&lt;br /&gt;
plot(t,0.5*C1,t,-C2,t,C3)&lt;br /&gt;
ylabel('b)',rotation='horizontal')&lt;br /&gt;
ylim([-1, 1.5])&lt;br /&gt;
&lt;br /&gt;
subplot(3,1,3)&lt;br /&gt;
plot(t,0.5*C1,t,-C2p,t,C3p)&lt;br /&gt;
ylabel('c)',rotation='horizontal')&lt;br /&gt;
ylim([-1, 1.5])&lt;br /&gt;
&lt;br /&gt;
show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Zmiana jednej komponenty może powodować zmiany w amplitudzie i latencji więcej niż jednego załamka.====&lt;br /&gt;
Poniższy rysunek przedstawia sytuację gdy zmiana amplitudy jednego komponentu może znacząco wpływać na amplitudę i latencję innych załamków.&lt;br /&gt;
&lt;br /&gt;
[[Plik:Sumowanie_komponentow2.png|center|thumb|768px| Panel a) przedstawia dwie hipotetyczne krzywe ERP, panel b) panel b i c komponenty z których powstały owe krzywe. Zmiana amplitudy komponentu oznaczonego kolorem powoduje zmianę amplitudy oznaczonych załamków ale także zmianę latencji wcześniejszego załamka. ]]&lt;br /&gt;
Poniżej kod odtwarzający powyższy przykład:&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
from __future__ import division&lt;br /&gt;
import numpy as np&lt;br /&gt;
from matplotlib.pyplot import plot, show, subplot, figure, title, xlabel, ylabel, ylim&lt;br /&gt;
&lt;br /&gt;
Fs = 1&lt;br /&gt;
t = np.arange(0,700)&lt;br /&gt;
&lt;br /&gt;
C1 = np.exp(-(t-100)**2/(2*30**2))&lt;br /&gt;
C2 = np.exp(-(t-200)**2/(2*50**2))&lt;br /&gt;
C3 = np.exp(-(t-350)**2/(2*100**2))&lt;br /&gt;
ERP1 = 0.5*C1-C2+C3&lt;br /&gt;
ERP2 = 0.5*C1-C2+1.5*C3&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
subplot(3,1,1)&lt;br /&gt;
plot(t,ERP1,'b', t,ERP2,'g')&lt;br /&gt;
plot(t[np.argmin(ERP1)],np.min(ERP1),'r.' )&lt;br /&gt;
plot(t[np.argmax(ERP1)],np.max(ERP1),'m.' )&lt;br /&gt;
plot(t[np.argmin(ERP2)],np.min(ERP2),'r.' )&lt;br /&gt;
plot(t[np.argmax(ERP2)],np.max(ERP2),'m.' )&lt;br /&gt;
&lt;br /&gt;
ylabel('a)',rotation='horizontal')&lt;br /&gt;
ylim([-1, 1.6])&lt;br /&gt;
&lt;br /&gt;
subplot(3,1,2)&lt;br /&gt;
plot(t,0.5*C1,'k',t,-C2,'k',t,C3,'b')&lt;br /&gt;
ylabel('b)',rotation='horizontal')&lt;br /&gt;
ylim([-1, 1.6])&lt;br /&gt;
&lt;br /&gt;
subplot(3,1,3)&lt;br /&gt;
plot(t,0.5*C1,'k',t,-C2,'k',t,1.5*C3,'g')&lt;br /&gt;
ylabel('c)',rotation='horizontal')&lt;br /&gt;
ylim([-1, 1.6])&lt;br /&gt;
&lt;br /&gt;
show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Instrukcje do ćwiczeń =&lt;br /&gt;
&lt;br /&gt;
==Zadanie 1: uśrednianie symulowanych sygnałów==&lt;br /&gt;
w tym ćwiczeniu chcemy pokazać efekty:&lt;br /&gt;
# uśredniania sygnałów związanych fazowo z bodźcem i nieskorelowanych z bodźcem / wpływ liczby realizacji,&lt;br /&gt;
# uśredniania sygnałów z fluktuacją latencji,&lt;br /&gt;
# wpływ filtrów o różnych funkcjach odpowiedzi impulsowej na morfologię uśrednionego potencjału.&lt;br /&gt;
&lt;br /&gt;
===Sygnały testowe===&lt;br /&gt;
Proszę zaimplementować funkcje generujące następujące przebiegi czasowe (oznaczenia: ''F&amp;lt;sub&amp;gt;s&amp;lt;/sub&amp;gt;'' &amp;amp;mdash; częstość próbkowania, ''T'' &amp;amp;mdash; czas trwania w sekundach, [[%C4%86wiczenia_1#Sygna.C5.82y_testowe|analogicznie do tego]]):&lt;br /&gt;
* sinusoida o zadanej częstości ''f'' i fazie &amp;lt;math&amp;gt;\phi&amp;lt;/math&amp;gt;: &amp;lt;tt&amp;gt;y = sin(f, phi, Fs, T)&amp;lt;/tt&amp;gt;,&lt;br /&gt;
* funkcja Gaussa o zadanym położeniu i szerokości &amp;lt;tt&amp;gt;y = g_1(t0, sigma, Fs, T) &amp;lt;/tt&amp;gt;&lt;br /&gt;
: &amp;lt;math&amp;gt;g_1(t) = \exp\left(-\frac{(t-t_0)^2}{2 \sigma^2}\right)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* pochodną funkcji Gaussa o zadanym położeniu i szerokości &amp;lt;tt&amp;gt;y = g_2(t0, sigma, Fs, T)&amp;lt;/tt&amp;gt;,&lt;br /&gt;
* połowę funkcji Gaussa o zadanym położeniu i szerokości &amp;lt;tt&amp;gt;y = g_3(t0, sigma, Fs, T)&amp;lt;/tt&amp;gt;,&lt;br /&gt;
: &amp;lt;math&amp;gt;g_{3}(t) = \left\{ &lt;br /&gt;
\begin{array}{lll}&lt;br /&gt;
0 &amp;amp; \mathrm{dla}&amp;amp; t&amp;lt;t_0 \\&lt;br /&gt;
\exp\left(-\frac{(t-t_0)^2}{2 \sigma^2}\right)&amp;amp; \mathrm{dla}&amp;amp; t \ge t_0  &lt;br /&gt;
\end{array}&lt;br /&gt;
\right. &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
W dalszych zadaniach tej sekcji przyjmiemy:&lt;br /&gt;
* ''T'' = 1 s,&lt;br /&gt;
* ''F&amp;lt;sub&amp;gt;s&amp;lt;/sub&amp;gt;'' = 128 Hz,&lt;br /&gt;
* ''t''&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; = 0,3 s,&lt;br /&gt;
* &amp;amp;sigma; = 0,02 s.&lt;br /&gt;
&lt;br /&gt;
===Uśrednianie w modelu addytywnym: sygnał + szum===&lt;br /&gt;
Dla funkcji &amp;lt;math&amp;gt;g_1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;g_2&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;g_3&amp;lt;/math&amp;gt;  wykonaj ''N'' symulacji sygnału opisanego daną funkcją z dodanym szumem gaussowskim (&amp;lt;tt&amp;gt;numpy.random.randn&amp;lt;/tt&amp;gt;). Zaobserwuj zmianę wariancji uśrednianego sygnału wraz z ''N''.&lt;br /&gt;
&lt;br /&gt;
===Uśrednianie w modelu addytywnym: sygnał + szum + niezależna czynność rytmiczna===&lt;br /&gt;
Powtórz poprzednie symulacje dokładając w każdej realizacji sinusoidę o losowo wybranej fazie. Symulacje wykonaj dla różnych częstości sinusoidy, takich których połówka okresu zbliżona jest do szerokości funkcji Gaussa, oraz znacząco od niej różnych.&lt;br /&gt;
&lt;br /&gt;
===Uśrednianie w modelu z resetem fazy===&lt;br /&gt;
Zbuduj sygnał składający się z dwóch fragmentów sinusoidy o częstości ''f'': &lt;br /&gt;
* pierwszy fragment ma losową fazę,&lt;br /&gt;
* drugi fragment ma fazę równą 0.&lt;br /&gt;
Wykonaj ''N'' realizacji takiego sygnału, przy czym każda realizacja ma częstość losowaną z rozkładu Gaussa o średniej 10 i pewnej wariancji (czyli &amp;lt;math&amp;gt;f \in \mathrm{N}(10,\sigma)&amp;lt;/math&amp;gt;). &lt;br /&gt;
Uśrednij otrzymane realizacje. Zaobserwuj zależność średniej od liczby uśrednianych realizacji i od wariancji częstości.&lt;br /&gt;
&lt;br /&gt;
===Uśrednianie potencjału z fluktuacją latencji===&lt;br /&gt;
Wygeneruj sygnały składające się z funkcji &amp;lt;math&amp;gt;g_1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;g_2&amp;lt;/math&amp;gt; albo &amp;lt;math&amp;gt;g_3&amp;lt;/math&amp;gt; z fluktuującą latencją, tzn. z wartością &amp;lt;math&amp;gt;t_0&amp;lt;/math&amp;gt; pochodzącą z jakiegoś rozkładu prawdopodobieństwa. U nas dla ustalenia uwagi niech będzie to rozkład Gaussa. Wykonaj zestaw symulacji obrazujący zależność od liczby realizacji i od wielkości fluktuacji, mierzonej przez wariancję rozkładu. Czy jest związek pomiędzy wariancją fluktuacji &amp;lt;math&amp;gt;t_0&amp;lt;/math&amp;gt; a szerokością załamków?&lt;br /&gt;
&lt;br /&gt;
===Wpływ filtrów===&lt;br /&gt;
# Zaprojektuj następujące filtry (przyjmij częstość próbkowania 128 Hz):&lt;br /&gt;
#* dolnoprzepustowy: Butterwortha z częstością odcięcia: 30, 40, 50 Hz, i rzędach od 1 do 5 (funkcja butter w module scipy.signal),&lt;br /&gt;
#* górnoprzepustowy: Butterwortha z częstością odcięcia: 0,1, 0,5, 2 i 5 Hz, i rzędach od 1 do 5,&lt;br /&gt;
#* notch: Czybyszewa II rodzaju z pasmem zaporowym ustawionym na 50 Hz, i rzędach od 1 do 3 (funkcja cheby2),&lt;br /&gt;
# Zbadaj funkcję odpowiedzi impulsowej i funkcję przenoszenia tych filtrów (w skali dB). Zaobserwuj jak długa jest odpowiedź impulsowa i jak daleko od częstości odcięcia zaburzone jest pasmo przenoszenia.&lt;br /&gt;
# Zastosuj powyższe filtry do funkcji &amp;lt;math&amp;gt;g_1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;g_2&amp;lt;/math&amp;gt; albo &amp;lt;math&amp;gt;g_3&amp;lt;/math&amp;gt;. Filtrowanie przeprowadź w jedną (lfilter) oraz w dwie strony (filtfilt). Zaobserwuj związek między zniekształceniem wprowadzanym przez filtr a funkcją odpowiedzi impulsowej filtru.&lt;br /&gt;
# W ćwiczeniu tym posłuż się symulowanymi sygnałami uzyskanymi z modelu addytywnego: &amp;amp;bdquo;sygnał+szum&amp;amp;rdquo;. Dla funkcji &amp;lt;math&amp;gt;g_1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;g_2&amp;lt;/math&amp;gt; albo &amp;lt;math&amp;gt;g_3&amp;lt;/math&amp;gt;  wykonaj ''N'' = 60 realizacji sygnału opisanego daną funkcją z dodanym szumem gaussowskim (&amp;lt;tt&amp;gt;numpy.random.randn&amp;lt;/tt&amp;gt;). Każdą z realizacji przefiltruj, a następnie uśrednij uzyskane sygnały.&lt;br /&gt;
&lt;br /&gt;
==Zadanie 2: rejestracje i analiza potencjałów wzrokowych==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;! -- ===Synchronizacja występowania bodźców z sygnałem EEG===&lt;br /&gt;
&lt;br /&gt;
Rejestracja potencjałów wywołanych jest przykładem pomiaru czynności elektrycznej mózgu w odpowiedzi na określony bodziec. W przypadku tego rodzaju pomiarów konieczna jest synchronizacja momentu wystąpienia bodźca z sygnałem EEG. Wzmacniacze do pomiaru czynności elektrycznej mózgu wyposażone są w specjalne wejścia, na które można podawać sygnał odpowiadający pojawianiu się bodźca. Jak pamiętamy z zeszłego semestru, wejście to (jak i podawany na nie sygnał) nazywamy trigerem (ang. ''trigger'' &amp;amp;mdash; spust, cyngiel, wyzwalacz). W najprostszym przypadku, bodziec moglibyśmy wyświetlać na monitorze komputerowym, a sygnał związany z jego wystąpieniem wysyłać przez któryś z portów komputera (LPT, COM) na wzmacniacz EEG. Niestety, obecnie dostępne i popularne systemy operacyjne, takie jak Windows czy Linux nie są systemami czasu rzeczywistego (http://pl.wikipedia.org/wiki/System_operacyjny_czasu_rzeczywistego). Od momentu wyświetlania bodźca na ekranie, do pojawiania się sygnału odpowiednim porcie komputerowym może upłynąć kilkadziesiąt milisekund i co gorsza czas ten zwykle jest losowy. W przypadku gdy wzmacniacz próbkuje sygnał z częstością 1000 Hz, moment wystąpienia bodźca możemy określić z dokładnością 1 ms, jednakże wspomniane opóźnienia w systemie operacyjnym uniemożliwiają to. Ponadto, jak dowiedzieliśmy się w rozdziale wstępnym [http://brain.fuw.edu.pl/edu-wiki/action/edit/EEG:Potencja%C5%82y_wywo%C5%82ane?section=T-1], pierwsze załamki związane z potencjałami wywołanymi pojawiają się już 10 ms po wystąpieniu bodźca. W związku z tym, losowe, rzędu kilkudziesięciu milisekund opóźnienia sygnału określającego moment pojawienia się bodźca względem jego rzeczywistego wystąpienia są niedopuszczalne.&lt;br /&gt;
Istnieją pewne techniki programowania, dzięki którym opisywane opóźnienia można zmniejszyć, jednakże są one bardzo trudne  do realizacji. Ponadto, standardowe porty komputera, takie jak LPT, czy COM zostały zaprojektowane przede wszystkim do sterowania urządzeniami zewnętrznymi, a nie ich zasilania. Przykładowo, jedna linia portu drukarkowego (LPT) może być obciążona prądem nie większym niż 5 mA, podczas gdy do zapalenie zwykłej diody LED potrzeba około 10 mA. Taki pobór prądu możliwy jest do uzyskania z portu USB, jednakże  jest on  wyjątkowo trudny do oprogramowania.  &lt;br /&gt;
W celu ominięcia powyższych niedogodności w Zakładzie Fizyki Biomedycznej UW w przeprowadzanych eksperymentach wykorzystywane są  mikrokontrolery [http://pl.wikipedia.org/wiki/Mikrokontroler], w szczególności ATmega16 i ATmega32.  Mikrokontrolery te wyposażone są w procesory o architekturze RISC [http://pl.wikipedia.org/wiki/RISC] i mocy obliczeniowej porównywalnej z szeroko stosowanym kiedyś w komputerach ZX Spectrum, Commodore, Amiga i Atari procesorem Z80. Oprócz jednostki centralnej mikrokontrolery zawierają   stałą pamięć FLASH przeznaczoną do przechowywania kodu programu, pamięć  RAM i pamięć EEPROM, liczniki 8- i 16-bitowe, komparatory, przetworniki analogowo-cyfrowe, porty wejścia/wyjścia, łącze RS232 (popularnie nazywane portem szeregowym) i układy przerwań.&lt;br /&gt;
&lt;br /&gt;
Mikrokontrolery wchodzące w skład zestawów pomiarowych na Pracowni EEG zawierają program, który umożliwia komunikację z nimi poprzez port szeregowy. Obecnie, komputery są coraz rzadziej wyposażane w porty szeregowe. Standard komunikacji RS-232, opracowany w 1962 roku  nadal jest jednak popularny i często wykorzystywany do komunikacji miedzy urządzeniami.  W celu połączenia komputera posiadającego tylko porty USB z mikrokontrolerem zastosowano przejściówkę USB/RS-232. &lt;br /&gt;
&lt;br /&gt;
Jak każde urządzenie w systemie Linuks, przejściówka USB/RS-232 widoczna jest jako plik, znajdujący się w katalogu &amp;lt;tt&amp;gt;/dev&amp;lt;/tt&amp;gt;. Nazwy plików obsługujących urządzenia szeregowe to &amp;lt;tt&amp;gt;ttyXY&amp;lt;/tt&amp;gt;, gdzie &amp;lt;tt&amp;gt;XY&amp;lt;/tt&amp;gt; to kolejny numer przydzielony do urządzenia szeregowego.&lt;br /&gt;
Do komunikacji komputera z mikroknotrolerem  w Zakładzie Fizyki Biomedycznej UW została napisana prosta biblioteka.  Jej użycie jest następujące:&lt;br /&gt;
* Po podłączeniu przejściówki USB/RS232 do komputera mikrokontrolera sprawdź jaki plik w katalogu &amp;lt;tt&amp;gt;/dev&amp;lt;/tt&amp;gt; został utworzony i przydzielony do urządzenia. &lt;br /&gt;
* Zaimportuj bibliotekę do komunikacji z mikrokontrolerem: &lt;br /&gt;
: &amp;lt;tt&amp;gt;import SerialPort as SP&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Otwórz plik powiązany z urządzeniem zewnętrznym:&lt;br /&gt;
: &amp;lt;tt&amp;gt;sp = SP.SerialPort(nazwa_pliku) &amp;lt;/tt&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
: &amp;lt;tt&amp;gt;sp.open()&amp;lt;/tt&amp;gt;&lt;br /&gt;
W naszym przypadku prawidłowa nazwa pliku to &amp;lt;tt&amp;gt;/dev/ttyUSB0&amp;lt;/tt&amp;gt;.&lt;br /&gt;
* Po włączeniu zasilania mikrokontrolera, diody podłączone do niego i wykorzystywane w eksperymencie z potencjałami wywołanymi będą zapalone. Następujące polecenie zgasi obydwie diody:&lt;br /&gt;
: &amp;lt;tt&amp;gt;sp.blinkP300([0, 0])&amp;lt;/tt&amp;gt;&lt;br /&gt;
* Wydanie poniższego polecenia spowoduje, iż mikrokontroler zapali podłączoną do niego diodę numer 1 na czas 100 ms, zaś diodę numer 2 na 200 ms. Jednocześnie, w momencie włączenia jak i wyłączenia diody, sygnał z mikrokontrolera zostanie wysłany na 5-stykowe wejście AUX mikrokontrolera:&lt;br /&gt;
: &amp;lt;tt&amp;gt;sp.blinkP300([100, 200])&amp;lt;/tt&amp;gt;&lt;br /&gt;
* Jeśli chcemy zapalić tylko diodę numer dwa, np. na czas 500 ms w programie podajemy następującą instrukcję:&lt;br /&gt;
: &amp;lt;tt&amp;gt;sp.blinkP300([0, 500])&amp;lt;/tt&amp;gt;&lt;br /&gt;
* Jeśli chcemy zakończyć komunikację z mikrokontrolerem piszemy:&lt;br /&gt;
: &amp;lt;tt&amp;gt;sp.close()&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Kod biblioteki do komunikacji z mikrokontrolerem:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;!--  Kod w Pythonie 2&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# -*- coding: cp1250 -*-&lt;br /&gt;
import serial&lt;br /&gt;
import logging&lt;br /&gt;
import sys&lt;br /&gt;
import os&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def to_hex_word(a):&lt;br /&gt;
    '''encodes a decimal number hexadecimally on two bytes'''&lt;br /&gt;
    return chr(a%256) + chr(a/256)&lt;br /&gt;
&lt;br /&gt;
class SerialPort(object):&lt;br /&gt;
    def __init__(self, port_name):&lt;br /&gt;
        import serial&lt;br /&gt;
        try:&lt;br /&gt;
            self.port = serial.Serial(&lt;br /&gt;
                port=port_name,&lt;br /&gt;
                baudrate=9600,&lt;br /&gt;
                bytesize=serial.EIGHTBITS,&lt;br /&gt;
                parity=serial.PARITY_NONE,&lt;br /&gt;
                stopbits=serial.STOPBITS_ONE,&lt;br /&gt;
                xonxoff=False&lt;br /&gt;
                )&lt;br /&gt;
        except serial.SerialException as e:&lt;br /&gt;
            print(&amp;quot;Nieprawidłowa nazwa portu lub port zajęty.&amp;quot;)&lt;br /&gt;
            raise e&lt;br /&gt;
        self.close()&lt;br /&gt;
        &lt;br /&gt;
    def open(self):&lt;br /&gt;
        self.port.open()&lt;br /&gt;
&lt;br /&gt;
    def close(self):&lt;br /&gt;
        self.port.close()&lt;br /&gt;
&lt;br /&gt;
    def send(self, value):&lt;br /&gt;
        self.port.write(value)&lt;br /&gt;
                           &lt;br /&gt;
    def blinkSSVEP(self,d, p1, p2):&lt;br /&gt;
        '''&lt;br /&gt;
        d = list of frequencies;&lt;br /&gt;
        p1:p2 = ratio LED_on_time/LED_off_time&lt;br /&gt;
        if you want i-th LED to be OFF all the time send  d[i] = 0&lt;br /&gt;
        if you want i-th LED to be ON all the time send  d[i] = -1&lt;br /&gt;
        in these two cases p1 and p2 do not matter&lt;br /&gt;
        '''&lt;br /&gt;
        clock  = 62500&lt;br /&gt;
        factor = float(p1) / float(p1 + p2)&lt;br /&gt;
    &lt;br /&gt;
        str = chr(3) # 'SSVEP_RUN'&lt;br /&gt;
&lt;br /&gt;
        for i in range(len(d)):&lt;br /&gt;
            # i-th LED OFF&lt;br /&gt;
            if d[i] == 0:                       &lt;br /&gt;
                str += to_hex_word(0) + to_hex_word(255) &lt;br /&gt;
            # i-th LED ON&lt;br /&gt;
            elif d[i] == -1:&lt;br /&gt;
                str += to_hex_word(255) + to_hex_word(0)&lt;br /&gt;
                #str = 'S'&lt;br /&gt;
                # i-th LED blinks d[i] times per second&lt;br /&gt;
                # p1:p2 = on_time:off_time in one blink&lt;br /&gt;
            else:&lt;br /&gt;
                period = clock/d[i]&lt;br /&gt;
                bright = int((clock/d[i]) * factor)&lt;br /&gt;
                dark = period - bright&lt;br /&gt;
                str += to_hex_word(bright) + to_hex_word(dark)&lt;br /&gt;
&lt;br /&gt;
        self.send(str)&lt;br /&gt;
&lt;br /&gt;
    def blinkP300(self,d):&lt;br /&gt;
        clock  = 62500&lt;br /&gt;
        str = chr(4) # 'P300_RUN'&lt;br /&gt;
&lt;br /&gt;
        for i in range(len(d)):&lt;br /&gt;
            period = int(clock*d[i]/1000.0)&lt;br /&gt;
            str += to_hex_word(period)&lt;br /&gt;
            print(period)&lt;br /&gt;
&lt;br /&gt;
        self.send(str)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
--&amp;gt; &amp;lt;!-- Kod w Pythonie 3 --&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# -*- coding: cp1250 -*-&lt;br /&gt;
import serial&lt;br /&gt;
import logging&lt;br /&gt;
import sys&lt;br /&gt;
import os&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
def to_hex_word(a):&lt;br /&gt;
    '''encodes a decimal number hexadecimally on two bytes'''&lt;br /&gt;
    return a.to_bytes(2,byteorder=sys.byteorder)&lt;br /&gt;
 &lt;br /&gt;
class SerialPort(object):&lt;br /&gt;
    def __init__(self, port_name):&lt;br /&gt;
        import serial&lt;br /&gt;
        try:&lt;br /&gt;
            self.port = serial.Serial(&lt;br /&gt;
                port=port_name,&lt;br /&gt;
                baudrate=9600,&lt;br /&gt;
                bytesize=serial.EIGHTBITS,&lt;br /&gt;
                parity=serial.PARITY_NONE,&lt;br /&gt;
                stopbits=serial.STOPBITS_ONE,&lt;br /&gt;
                xonxoff=False&lt;br /&gt;
                )&lt;br /&gt;
        except serial.SerialException as e:&lt;br /&gt;
            print(&amp;quot;Nieprawidłowa nazwa portu lub port zajęty.&amp;quot;)&lt;br /&gt;
            raise e&lt;br /&gt;
        self.close()&lt;br /&gt;
 &lt;br /&gt;
    def open(self):&lt;br /&gt;
        self.port.open()&lt;br /&gt;
 &lt;br /&gt;
    def close(self):&lt;br /&gt;
        self.port.close()&lt;br /&gt;
 &lt;br /&gt;
    def send(self, value):&lt;br /&gt;
        self.port.write(value)&lt;br /&gt;
 &lt;br /&gt;
    def blinkSSVEP(self,d, p1, p2):&lt;br /&gt;
        '''&lt;br /&gt;
        d = list of frequencies;&lt;br /&gt;
        p1:p2 = ratio LED_on_time/LED_off_time&lt;br /&gt;
        if you want i-th LED to be OFF all the time send  d[i] = 0&lt;br /&gt;
        if you want i-th LED to be ON all the time send  d[i] = -1&lt;br /&gt;
        in these two cases p1 and p2 do not matter&lt;br /&gt;
        '''&lt;br /&gt;
        clock  = 62500&lt;br /&gt;
        factor = float(p1) / float(p1 + p2)&lt;br /&gt;
 &lt;br /&gt;
        str = (3).to_bytes(1,byteorder=sys.byteorder) # 'SSVEP_RUN'&lt;br /&gt;
 &lt;br /&gt;
        for i in range(len(d)):&lt;br /&gt;
            # i-th LED OFF&lt;br /&gt;
            if d[i] == 0:                       &lt;br /&gt;
                str += to_hex_word(0) + to_hex_word(255) &lt;br /&gt;
            # i-th LED ON&lt;br /&gt;
            elif d[i] == -1:&lt;br /&gt;
                str += to_hex_word(255) + to_hex_word(0)&lt;br /&gt;
                #str = 'S'&lt;br /&gt;
                # i-th LED blinks d[i] times per second&lt;br /&gt;
                # p1:p2 = on_time:off_time in one blink&lt;br /&gt;
            else:&lt;br /&gt;
                period = clock/d[i]&lt;br /&gt;
                bright = int((clock/d[i]) * factor)&lt;br /&gt;
                dark = int(period - bright)&lt;br /&gt;
                str += to_hex_word(bright) + to_hex_word(dark)&lt;br /&gt;
 &lt;br /&gt;
        self.send(str)&lt;br /&gt;
 &lt;br /&gt;
    def blinkP300(self,d):&lt;br /&gt;
        clock  = 62500&lt;br /&gt;
        str = (4).to_bytes(1,byteorder=sys.byteorder) # 'P300_RUN'&lt;br /&gt;
 &lt;br /&gt;
        for i in range(len(d)):&lt;br /&gt;
            period = int(clock*d[i]/1000.0)&lt;br /&gt;
            str += to_hex_word(period)&lt;br /&gt;
 &lt;br /&gt;
        self.send(str)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
--&amp;gt; &lt;br /&gt;
&lt;br /&gt;
===Zestaw eksperymentalny===&lt;br /&gt;
Zestaw składa się ze:&lt;br /&gt;
* wzmacniacza,&lt;br /&gt;
* stymulatora   &lt;br /&gt;
&amp;lt;!--* izolowanego galwanicznie układu generującego impulsy odpowiadające gaszeniu i zapalaniu diody,  o wartościach dopasowanych do akceptowalnych przez wejścia AUX wzmacniacza,--&amp;gt;&lt;br /&gt;
* komputera: w tym eksperymencie komputer będzie służył do zaprogramowania stymulatora i do rejestracji sygnałów.&lt;br /&gt;
&lt;br /&gt;
===Eksperyment 1. Obserwacja bodźca wzrokowego  ===&lt;br /&gt;
&amp;lt;!--Proszę zapoznać się ze standardami rejestracji wzrokowych potencjałów wywołanych [http://www.gcu.ac.uk/media/gcalwebv2/theuniversity/academicschools/sls/psytimetables/SLS%20-%20VEP_Standard_2010.pdf] --&amp;gt;&lt;br /&gt;
Proszę zapoznać się z typowym wyglądem załamków w przypadku potencjałów wzrokowych, jaki jest przedstawiony na [https://link.springer.com/article/10.1007/s10633-009-9195-4/figures/2 rysunku] (cały artykuł jest dostępny [http://link.springer.com/article/10.1007%2Fs10633-009-9195-4 tu]).&lt;br /&gt;
&amp;lt;!--[[Plik:Fig 4 VEP.jpg|thumb|320px|right|&amp;lt;figure id=&amp;quot;fig:zalamki_VEP&amp;quot;&amp;gt;&amp;lt;/figure&amp;gt;&lt;br /&gt;
&amp;lt;xr id=&amp;quot;fig:zalamki_VEP&amp;quot;&amp;gt;Rys. %i.&amp;lt;/xr&amp;gt; Schemat załamków rozpoznawanych we wzrokowych potencjach wywołanych (z pracy: J. V. Odom i in. &amp;amp;bdquo;ISCEV standard for clinical visual evoked potentials&lt;br /&gt;
(2009 update)&amp;amp;rdquo;, Doc Ophthalmol (2010), 120:111–119).]]&lt;br /&gt;
--&amp;gt; &lt;br /&gt;
&lt;br /&gt;
==== Rejestracja ====&lt;br /&gt;
* Paradygmat: z odległości około 40 cm badany obserwuje wyświetalny na ekranie biały kwadrat. Bodźce trwają 300 ms i  powtarzają się co 0.5 sekundy. Bodziec poprzedza punkt fiksacji pokazywany przez 300 ms. Natężenie bodźca ma przyjąć jedną z 4 wartości (manipulujemy jego przeźroczystością: 1, 0.7, 0.3 i 0.1, gdzie 1 oznacza brak przeźroczystości). Każda z intensywności bodźca ma pojawić się 100 razy podczas badania, bodźce podawane mają być w sposób losowy. Zadanie poprzedza krótka instrukcja, kończy podziękowanie. &lt;br /&gt;
&lt;br /&gt;
* Pomiar&lt;br /&gt;
**Zakładamy czepek i elektrody w systemie 10-20, dbamy o to by opory pomiędzy elektrodami były poniżej 10 k&amp;amp;Omega; i różnice pomiędzy oporami różnych elektrod nie przekraczały 20%. [[Plik:Glowka10-20 ERPy.svg|thumb|600px|right]]&lt;br /&gt;
** Elektrodę GND mocujemy w otworze czepka odpowiadającym pozycji AFz (na linii centralnej 10% w stronę nosa od elektrody Fz) &lt;br /&gt;
** Montujemy także elektrody M1 i M2 i FCz.&lt;br /&gt;
&lt;br /&gt;
==== Analiza ====&lt;br /&gt;
# Filtrujemy sygnał w paśmie 1-20 Hz.&lt;br /&gt;
# Z ciągłego zapisu wycinamy fragmenty od &amp;amp;minus;300 ms do +800 ms (zero oznacza moment wystąpienia bodźca). W czasie wycinania badamy wycinane fragmenty pod względem zakresu amplitudy (wszystkie kanały powinny mieć amplitudę w granicach &amp;amp;plusmn;75 &amp;amp;mu;V) i zawartości artefaktów od mrugania (w tym celu trzeba oglądając sygnał w SVAROG-u ustalić próg na amplitudę sygnału w kanałach Fp1 i Fp2).&lt;br /&gt;
# Uśredniamy wycięte sygnały.&lt;br /&gt;
# Rysujemy średni potencjał we wszystkich kanałach.&lt;br /&gt;
# Pierwszy sposób: Identyfikujemy załamki P1 i N2. Mierzymy amplitudę P1 jako różnicę między ekstremalną wartością załamka N2 a ekstremalną wartością załamka N2. &lt;br /&gt;
# Drugi sposób: Identyfikujemy załamki P1 i N2. Mierzymy amplitudę P1 w stosunku do zera. &lt;br /&gt;
#porównujemy uzyskane amplitudy w 4 warunkach za pomocą odpowiedniego testu statystycznego (porównanie warunków ze skrajnymi wartościami amplitudy - zastosuj test permutacyjny (opisany poniżej) lub test t-Studenta/nieparametryczny odpowiednik). &lt;br /&gt;
&lt;br /&gt;
**Opis testu permutacyjnego &lt;br /&gt;
Pytanie: Czy intensywność bodźca wpływa na amplitudę potencjału P1?&lt;br /&gt;
Jak stwierdzić czy amplitudy załamków P1 istotnie różnią się pomiędzy seriami?&lt;br /&gt;
&lt;br /&gt;
Musimy przeprowadzić test statystyczny. Możemy skonstruować go np. tak:&lt;br /&gt;
Mamy dwa warunki I i II. Jako statystykę przyjmiemy różnicę pomiędzy amplitudą załamka zmierzoną w serii z dwoma diodami (P2&amp;lt;sub&amp;gt;II&amp;lt;/sub&amp;gt;) a amplitudą zmierzoną w serii z jedną diodą (P2&amp;lt;sub&amp;gt;I&amp;lt;/sub&amp;gt;):&lt;br /&gt;
: ''S'' = P2&amp;lt;sub&amp;gt;II&amp;lt;/sub&amp;gt; &amp;amp;minus; P2&amp;lt;sub&amp;gt;I&amp;lt;/sub&amp;gt;&lt;br /&gt;
Postawmy hipotezę zerową, że nie ma różnicy w amplitudzie pomiędzy warunkiem II a I oraz hipotezę alternatywną, że różnica taka występuje.&lt;br /&gt;
: H&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;: ''S'' = 0&lt;br /&gt;
: H&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;: ''S'' &amp;amp;ne; 0&lt;br /&gt;
Zgodnie z H&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; dla wartości ''S'' nie ma różnicy czy realizacja została zarejestrowana w warunkach I czy II, zatem można losowo poprzypisywać numery warunków do realizacji i w ten sposób uzyskać rozkład statystyki ''S'' pod warunkiem prawdziwości H&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;, czyli obliczyć średnie potencjały dla &amp;amp;bdquo;pomieszanych&amp;amp;rdquo; tagów, wyliczyć średnie potencjały dla sztucznie wygenerowaych grup, i wyliczyć różnicę amplitud dla tych średnich, czyli wartość statystyki dla hipotezy H&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Zaimplementuj test permutacyjny zgodny z powyższą koncepcją.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- ===Wersja 2: obserwacja habituacji / uśrednianie w blokach ===&lt;br /&gt;
==== Rejestracja ====&lt;br /&gt;
# Paradygmat: &lt;br /&gt;
#* z odległości około 40 cm badany obserwuje błyski diody. &lt;br /&gt;
#* Błyski powtarzają się co 0,5 sekundy. &lt;br /&gt;
#* Rejestrujemy 60 serii po 15 błysków.  &lt;br /&gt;
#* Pomiędzy seriami badany odpoczywa około 10 sekund.&lt;br /&gt;
# Zakładamy czepek i elektrody w systemie 10-20, dbamy o to by opory pomiędzy elektrodami były poniżej 5 k&amp;amp;Omega; i różnice pomiędzy oporami różnych elektrod nie przekraczały 20%.&lt;br /&gt;
#* Elektrodę GND mocujemy w otworze czepka odpowiadającym pozycji AFz (na linii centralnej 10% w stronę nosa od elektrody Fz) &lt;br /&gt;
#* Montujemy także elektrodę FCz (na linii centralnej pomiędzy Fz a Cz), będziemy jej używać w montażu i w czasie analizy jako referencji.&lt;br /&gt;
#* Częstość próbkowania 512 Hz.&lt;br /&gt;
&lt;br /&gt;
==== Analiza ====&lt;br /&gt;
# Filtrujemy sygnał w paśmie 0,1-20 Hz.&lt;br /&gt;
# Z ciągłego zapisu wycinamy fragmenty od &amp;amp;minus;300 ms do +600 ms (zero oznacza moment wystąpienia bodźca). W czasie wycinania badamy wycinane fragmenty pod względem zakresu amplitudy (wszystkie kanały powinny mieć amplitudę w granicach &amp;amp;plusmn;75 &amp;amp;mu;V) i zawartości artefaktów od mrugania (w tym celu trzeba oglądając sygnał w SVAROG-u ustalić próg na amplitudę sygnału w kanałach Fp1 i Fp2).&lt;br /&gt;
# Uśredniamy wycięte sygnały o tym samym numerze wewnątrz serii.&lt;br /&gt;
# Rysujemy serie 15 uśrednionych potencjałów dla tego kanału, który wykazywał najsilniejszy potencjał w pierwszej wersji eksperymentu. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Eksperyment 2: rejestracja i analiza potencjału P3 ==&lt;br /&gt;
==== Rejestracja ====&lt;br /&gt;
# Paradygmat: &lt;br /&gt;
#* z odległości około 40 cm badany obserwuje kwadrat, który występuje w dwóch kolorach. &lt;br /&gt;
#* Bodźce trwają 300 ms, poprzedzane punktem fiksacji wyświetlanym na 300 ms, przerwa między próbami jest losowana i wynosi od 0.8-1.2 s.  &lt;br /&gt;
#* Proporcja wystapień bodźców koloru pierwszego i drugiego wynosi 1:5.   &lt;br /&gt;
#* Zadaniem badanego jest liczenie kwadratów w rzadkim kolorze. &lt;br /&gt;
#* Wykonujemy tyle realizacji aby zarejestrować 100 powtórzeń bodźców rzadkich. &lt;br /&gt;
# Zakładamy czepek i elektrody w systemie 10-20, dbamy o to by opory pomiędzy elektrodami były poniżej 5 k&amp;amp;Omega; i różnice pomiędzy oporami różnych elektrod nie przekraczały 20%.&lt;br /&gt;
#* Elektrodę GND mocujemy w otworze czepka odpowiadającym pozycji AFz (na linii centralnej 10% w stronę nosa od elektrody Fz) &lt;br /&gt;
#* Montujemy także elektrody M1 i M2, będziemy ich używać w montażu i w czasie analizy jako referencji typu połączone uszy.&lt;br /&gt;
#* Częstość próbkowania 512 Hz.&lt;br /&gt;
&lt;br /&gt;
==== Analiza ====&lt;br /&gt;
# Filtrujemy sygnał w paśmie 1-20 Hz.&lt;br /&gt;
# Z ciągłego zapisu wycinamy fragmenty od &amp;amp;minus;300 ms do +900 ms (zero oznacza moment wystąpienia bodźca). W czasie wycinania badamy wycinane fragmenty pod względem zakresu amplitudy (wszystkie kanały powinny mieć amplitudę w granicach &amp;amp;plusmn;75 &amp;amp;mu;V) i zawartości artefaktów od mrugania (w tym celu trzeba oglądając sygnał w SVAROG-u ustalić próg na amplitudę sygnału w kanałach Fp1 i Fp2).&lt;br /&gt;
# Uśredniamy osobno realizacje dla kadego koloru kwadratu. &lt;br /&gt;
# Nakładamy na siebie na rysunkach oba typy średnich.&lt;br /&gt;
# wyznaczamy amplitudę P300 i liczymy test statystyczny pomiędzy warunkami&lt;br /&gt;
&lt;br /&gt;
==Ćwiczenie dodatkowe: P300 BCI==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wykorzystujemy elektrody z systemu 10-10 umieszczone nad korą wzrokową: P07, O1, O2, PO8, PO3, PO4, Pz, Cz.&lt;br /&gt;
&lt;br /&gt;
Uruchamiamy &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
obci_gui --presets eeg_workshop&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
i z guzika &amp;amp;bdquo;select amplifier&amp;amp;rdquo; wybieramy właściwy wzmacniacz.&lt;br /&gt;
&lt;br /&gt;
Do kontroli jakości sygnału możemy uruchomić Svaroga.&lt;br /&gt;
&lt;br /&gt;
Dane z kalibracji zapisują się w pliku test1 w katalogu domowym użytkownika, z labiryntu w pliku test2.&lt;br /&gt;
&lt;br /&gt;
Po zakończeniu kalibracji pojawia się napis &amp;amp;bdquo;Trwają obliczenia&amp;amp;rdquo; lub podobny. Odczekujemy kilka minut, aż skończy się peer &amp;amp;bdquo;Calibration&amp;amp;rdquo; (widoczny w obci_gui) i zamykamy okienko klawiszami Alt-F4 lub zatrzymując scenariusz guzikiem &amp;amp;bdquo;Stop&amp;amp;rdquo;. W katalogu domowym pojawi się plik z wynikami kalibracji, co pozwala na uruchomienie scenariusza &amp;amp;bdquo;labirynt&amp;amp;rdquo;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Po zebraniu danych, przed wczytaniem ich do Svaroga należy w tym samym katalogu uruchomić skrypt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
#!/usr/bin/env python&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
&lt;br /&gt;
from obci.analysis.obci_signal_processing.tags import tags_file_writer&lt;br /&gt;
from obci.analysis.obci_signal_processing.read_manager import ReadManager&lt;br /&gt;
&lt;br /&gt;
def main(): &lt;br /&gt;
	file_name = 'test1'&lt;br /&gt;
	&lt;br /&gt;
	mgr = ReadManager(&lt;br /&gt;
		file_name + '.obci.xml',&lt;br /&gt;
		file_name + '.obci.raw',&lt;br /&gt;
		file_name + '.obci.tag')&lt;br /&gt;
	&lt;br /&gt;
	tags = mgr.get_tags()&lt;br /&gt;
	for i in xrange(0, len(tags)):&lt;br /&gt;
		if tags[i]['desc']['index'] == tags[i]['desc']['target']:&lt;br /&gt;
			tags[i]['name'] = 'blink_target'&lt;br /&gt;
		else:&lt;br /&gt;
			tags[i]['name'] = 'blink'&lt;br /&gt;
			&lt;br /&gt;
	tags_writer = tags_file_writer.TagsFileWriter(file_name + '.obci.tag')&lt;br /&gt;
	for tag in tags:&lt;br /&gt;
		tags_writer.tag_received(tag)		&lt;br /&gt;
	tags_writer.finish_saving(0)	&lt;br /&gt;
 &lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Aduszyk</name></author>
		
	</entry>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=Pracownia_EEG/Potencja%C5%82y_wywo%C5%82ane&amp;diff=8973</id>
		<title>Pracownia EEG/Potencjały wywołane</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=Pracownia_EEG/Potencja%C5%82y_wywo%C5%82ane&amp;diff=8973"/>
		<updated>2022-11-08T10:44:05Z</updated>

		<summary type="html">&lt;p&gt;Aduszyk: /* Zadanie 3: rejestracja i analiza potencjału P3 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Pracownia EEG|Pracownia EEG]] / Potencjały wywołane&lt;br /&gt;
&lt;br /&gt;
=Wstęp=&lt;br /&gt;
==Potencjały wywołane==&lt;br /&gt;
=== Wstęp ===&lt;br /&gt;
Potencjały wywołane EEG (ang. ''evoked potentials'', EP) są śladami odpowiedzi mózgu na bodźce. W przypadku MEG poprawnie mówi się o polach wywołanych (ang. ''evoked fields'', EF).&lt;br /&gt;
Zwykle reakcja ta jest mała (wyjątek stanowią [[Elektroencefalografia/Metody_analizy_sygnałów_EEG_-_analiza_w_dziedzinie_czasu |kompleksy K]]) i w zapisie pojedynczej realizacji reakcji na bodziec najczęściej niewidoczna wśród czynności pochodzącej od wielu innych procesów zachodzących w tym samym czasie w mózgu. &lt;br /&gt;
Ich wyodrębnienie z tak zwanego tła EEG/MEG, czyli manifestacji elektrycznej innych, trwających w tym samym czasie w mózgu procesów (aktywny prąd niezależny), wymaga w dniu dzisiejszym zapisu odpowiedzi na szereg powtórzeń tego samego bodźca (&amp;lt;xr id=&amp;quot;fig:EP&amp;quot;&amp;gt;rys. %i&amp;lt;/xr&amp;gt;). Pierwsze potencjały wywołane pokazał pod koniec lat 40-tych Dawson (Dawson 1947) wykonując superpozycję pojedynczych realizacji na kliszy fotograficznej.&lt;br /&gt;
Z czasem skomplikowane urządzenia analogowe zastąpione zostały przez cyfrowe uśrednianie kolejnych fragmentów EEG, zsynchronizowanych według momentu wystąpienia bodźca, łatwo realizowane za pomocą komputera.&lt;br /&gt;
&lt;br /&gt;
[[Grafika:EP.png|thumb|640px|center|&amp;lt;figure id=&amp;quot;fig:EP&amp;quot;&amp;gt;&amp;lt;/figure&amp;gt;&lt;br /&gt;
Uśrednianie potencjałów wywołanych. a) ciągły zapis EEG z wyróżnionymi momentami wystąpienia bodźca (w tym przypadku słuchowego) b) kilkadziesiąt kolejnych odcinków, wyciętych jako sekunda EEG od momentu wystąpienia kolejnych bodźców, ustawione jeden pod drugim c) uśredniony potencjał wywołany &amp;amp;mdash; widać m. in. załamek P300 ok. 300 milisekund po bodźcu]]&lt;br /&gt;
&lt;br /&gt;
Techniki te opierają się na założeniu, że zawarta w EEG odpowiedź mózgu na każdy z kolejnych bodźców jest niezmienna, a EEG odzwierciedlające pozostałe procesy traktowane jest jak nieskorelowany z nią proces stochastyczny. Zależnie od rodzaju potencjałów wywołanych, założenia te są mniej lub bardziej nieuzasadnione; podważa je choćby powszechnie znany efekt habituacji, polegający na osłabieniu późnych potencjałów wywołanych kolejnymi powtórzeniami bodźca.&lt;br /&gt;
&lt;br /&gt;
Istota potencjałów wywołanych jest przedmiotem otwartej dyskusji i dziesiątków prac, dotykających od lat podstawowych w tej dziedzinie pytań: czym jest potencjał wywołany, który widzimy w uśrednionym przebiegu? Czy naprawdę wynika z deterministycznie powtarzanej, jednakowej odpowiedzi pojawiającej się po każdym powtórzeniu bodźca niezależnie od &amp;amp;bdquo;tła&amp;amp;rdquo;, czy może wynika z reorganizacji faz tego właśnie &amp;amp;bdquo;tła&amp;amp;rdquo; EEG, czy może kombinacji tych dwóch efektów? Jest to wspaniałe pole dla zastosowań zaawansowanych metod modelowania i analizy sygnałów. W ostatnich latach powstają dziesiątki prac na ten temat, a od czasu do czasu również krytyczne artykuły wykazujące, że dotychczasowe odkrycia są raczej artefaktami stosowanych metod a nie wynikają z własności analizowanych danych (Yeung et al., 2004). Jak widać jest tu wciąż bardzo wiele do zrobienia, gdyż zrozumienie tego mechanizmu stoi na drodze do &amp;amp;bdquo;świętego Graala&amp;amp;rdquo;, którym w tej dziedzinie jest wyodrębnienie pojedynczych potencjałów wywołanych.&lt;br /&gt;
&lt;br /&gt;
Niezależnie od tego, w neurofizjologii klinicznej nazwą potencjał wywołany określa się krzywą widoczną po uśrednieniu odpowiedzi na kilkanaście do kilku tysięcy bodźców (Szelenberger 2000). Gromadzona od dziesięcioleci wiedza o behawioralnych i klinicznych korelatach potencjałów wywołanych opiera się na rozpoznawaniu w przebiegach uśrednionych tak zwanych załamków, czyli przejściowych wzrostów lub spadków potencjału (na przykład na &amp;lt;xr id=&amp;quot;fig:EP&amp;quot;&amp;gt;rys. %i&amp;lt;/xr&amp;gt; widać załamek P300). Nazwy załamków składają się zwykle z litery &amp;amp;bdquo;P&amp;amp;rdquo; (od ang. ''positive''), jeśli wychylenie jest dodatnie, lub &amp;amp;bdquo;N&amp;amp;rdquo; (od ang. ''negative''), jeśli wychylenie jest ujemne, oraz liczby. Uwaga: &lt;br /&gt;
* Nie ma niestety jednej ustalonej konwencji prezentacji potencjałów koniecznie trzeba więc zwracać uwagę na orientację wykresu, a wykonując wykres samemu - zamieszczać informację o orientacji kierunku dodatniego,gdyż kierunek dodatni może być wykresie skierowany do góry lub do dołu. &lt;br /&gt;
* Liczba następująca po N lub P określa przybliżoną liczbę milisekund od wystąpienia bodźca, czyli tak zwaną latencję. Nie można jednak ścisłego związku między tą liczbą a liczbą milisekund np. potencjał P300 w zależności od szczegółów paradygmatu doświadczalnego może wystąpić znacznie później. np. w eksperymentach językowych zdarza się że P300 występuje później niż N400 :-).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;xr id=&amp;quot;fig:zalamki&amp;quot;&amp;gt;Rys. %i&amp;lt;/xr&amp;gt; przedstawia schematycznie najważniejsze załamki rozpoznawane w potencjałach słuchowych, czyli wywoływanych bodźcem dźwiękowym. Dla potencjałów wzrokowych i somatosensorycznych istnieją podobne klasyfikacje.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Grafika:Zalamki.png|thumb|320px|right|&amp;lt;figure id=&amp;quot;fig:zalamki&amp;quot;&amp;gt;&amp;lt;/figure&amp;gt;&lt;br /&gt;
Orientacyjny schemat załamków rozpoznawanych w słuchowych potencjach wywołanych, na podstawie (Szelenberger 2000). Skala czasu logarytmiczna. Najszybsze (do 12 ms) składowe egzogenne to potencjały pniowe (BAEP), oznaczane jako fale I-VII. Litery &amp;amp;bdquo;P&amp;amp;rdquo; i &amp;amp;bdquo;N&amp;amp;rdquo; oznaczają dodatnie i ujemne wychylenia związane z dalszymi załamkami]]&lt;br /&gt;
&lt;br /&gt;
Najszybsze (czyli o najmniejszej latencji) składowe to potencjały egzogenne, odzwierciedlające wstępne fazy przekazu informacji. W potencjałach słuchowych są to potencjały pnia (ang. ''brainstem auditory evoked potentials'', BAEP), składające się z siedmiu fal występujących pomiędzy 1 a 12 ms od bodźca. Są one generowane np. w nerwie słuchowym czy pniu mózgu, i wykorzystywane w klinicznej diagnostyce integralności dróg słuchowych. Podobnie jak inne wczesne potencjały o latencjach poniżej 100 ms, są praktycznie niezależne od stanu uwagi.&lt;br /&gt;
&lt;br /&gt;
Po potencjałach o średniej latencji (między 12 a 50 ms) zaczynają się późne potencjały słuchowe (od 100 ms od podania bodźca), odzwierciedlające bardziej złożone reakcje na bodziec. Potencjały ok. 100 ms obserwowane w okolicach sensorycznych odzwierciedlają odpowiedź tejże kory na bodziec. Ich amplituda zależy od parametrów fizycznych bodźca oraz od uwagi, np. amplituda załamka N100 wzrasta w stanie skupienia uwagi czy pobudzenia emocjonalnego. Pierwszy i najpopularniejszy całkowicie endogenny załamek to P300, pojawiający się po rozpoznaniu bodźca oczekiwanego, na którym skupiamy uwagę: na przykład, jeśli w serii pojawiających się losowo liter mamy zliczać wystąpienia jednej z nich, to na średniej odpowiedzi na pojawienie się tej litery pojawi się załamek P300. Załamek ten występuje również w odpowiedzi na bodźce wyczekiwane, niespodziewane i ważne dla osoby (np. własne imię). &lt;br /&gt;
&lt;br /&gt;
=== Uśrednianie w dziedzinie czasu ===&lt;br /&gt;
Jak już było wspomniane powyżej podstawową techniką stosowaną do analizy potencjałów wywołanych jest uśrednianie wielu realizacji odpowiedzi na bodziec wyrównanych względem jakiegoś charakterystycznego zdarzenia, np. momentu podania bodźca albo momentu behawioralnej reakcji na bodziec (np. wciśnięcie przycisku). Podejście to bazuje na trzech założeniach:&lt;br /&gt;
* Reakcja jest czasowo związana z bodźcem. Tzn. w kolejnych realizacjach występuje ona zawsze z tym samym opóźnieniem.&lt;br /&gt;
* Reakcja na bodziec skutkuje zawsze pojawieniem się w sygnale składowej o stałym kształcie (mówimy o stałej morfologii).&lt;br /&gt;
* Spontaniczna czynność EEG &amp;amp;mdash; ta która nie dotyczy przetwarzania interesującego nas bodźca &amp;amp;mdash; jest niezależnym, stacjonarnym szumem o średniej zero.&lt;br /&gt;
&lt;br /&gt;
Zgodnie z powyższymi założeniami mierzony w ''i''-tej realizacji sygnał można wyrazić jako:&lt;br /&gt;
: &amp;lt;math&amp;gt;x_i(t) = s(t) + n_i(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
Uśrednianie po ''N'' realizacjach daje:&lt;br /&gt;
: &amp;lt;math&amp;gt;\bar x (t) = \frac{1}{N} \sum_{i=1}^N x_i(t) = \frac{1}{N} \left(N s(t) + \sum_{i=1}^N n_i(t) \right) &amp;lt;/math&amp;gt;&lt;br /&gt;
Wartość oczekiwana średniego sygnału wynosi:&lt;br /&gt;
: &amp;lt;math&amp;gt;\mathrm{E}\left[ \bar x(t) \right] = s(t) &amp;lt;/math&amp;gt;&lt;br /&gt;
gdyż dla szumu o średniej zero mamy:&lt;br /&gt;
: &amp;lt;math&amp;gt;\mathrm{E}\left[\frac{1}{N} \sum_{i=1}^N n_i(t)\right] = 0&amp;lt;/math&amp;gt;.&lt;br /&gt;
Wariancja &amp;lt;math&amp;gt;\bar x(t)&amp;lt;/math&amp;gt; wynosi:&lt;br /&gt;
: &amp;lt;math&amp;gt;\sigma^2_{\bar x(t)} = \mathrm{E} \left[  \left( \frac{1}{N} \sum_{i=1}^N n_i(t)\right)^2 \right] \approx \frac{1}{N} \sigma^2_{n(t)}&amp;lt;/math&amp;gt;&lt;br /&gt;
gdyż &amp;lt;math&amp;gt;s(t)&amp;lt;/math&amp;gt; jest deterministyczne. &lt;br /&gt;
&lt;br /&gt;
Dla potencjałów pojawiających się w pierwszych kilkudziesięciu milisekundach po bodźcu model ten można uznać za poprawny, gdyż wykazują one zależność głównie od parametrów fizycznych bodźca. Dla późniejszych składowych staje się on coraz bardziej wątpliwy ze względu na występujące korelacje ze stanem (np. uwagi) badanego.&lt;br /&gt;
&lt;br /&gt;
Dla późniejszych składowych można by postulować bardziej ogólną wersję modelu potencjału wywołanego:&lt;br /&gt;
: &amp;lt;math&amp;gt;x_i(t) = s_i(t) + n_i(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
Ten model uwidacznia, że do opisu potencjału wywołanego potrzebna jest nie tylko średnia, ale i wyższe momenty rozkładu (np. drugi moment centralny czyli wariancja).&lt;br /&gt;
&lt;br /&gt;
====Wariancja w przypadku szumu skorelowanego ====&lt;br /&gt;
W poprzednim paragrafie pokazaliśmy, że w przypadku niezależnego szumu wariancja uśrednionego sygnału (w danej chwili czasu) maleje jak  &amp;lt;math&amp;gt;\frac{1}{N}&amp;lt;/math&amp;gt;. Jednak w przypadku gdy kolejne próbki szumu są skorelowane (np. występuje silna aktywność rytmiczna alfa) sytuacja się komplikuje. Intuicyjnie łatwo możemy to sobie wyobrazić w granicznym przypadku. Załóżmy, że tło dla  potencjałów o stałej morfologii   stanowi sinusoida. Jeśli będziemy podawać bodźce w odstępach będących wielokrotnością okresu tej sinusoidy to w uśrednianych fragmentach sygnału owa sinusoida jest tak samo powtarzalna jak badany potencjał i uśrednianie nie prowadzi do poprawy stosunku amplitudy sygnału do amplitudy tła. &lt;br /&gt;
&lt;br /&gt;
Stopień zależności pomiędzy próbkami można zmierzyć przy pomocy funkcji autokorelacji. &lt;br /&gt;
Jeśli funkcję autokorelacji przybliżymy przez:&lt;br /&gt;
: &amp;lt;math&amp;gt;R_{xx}(\tau) = \sigma^2 \exp(-\beta |\tau|) \cos(2 \pi f_0 \tau)&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\sigma^2&amp;lt;/math&amp;gt; jest wariancją szumu, &amp;lt;math&amp;gt;f_0&amp;lt;/math&amp;gt; jest średnią częstością aktywności rytmicznej, &amp;lt;math&amp;gt;\beta/ \pi&amp;lt;/math&amp;gt; jest szerokością pasma tej czynności, zaś &amp;lt;math&amp;gt;\tau&amp;lt;/math&amp;gt; opóźnieniem, to wariancję potencjału wywołanego można wyrazić jako&amp;lt;!-- \cite{Spekreijse_1976}--&amp;gt;:&lt;br /&gt;
: &amp;lt;math&amp;gt;\sigma^2_{\bar x(t)} = \frac{\sigma^2}{N} \left[ \frac{1-\exp(-2 \beta T)}{1 - 2 \exp(- \beta T) \cos(2 \pi f_0 T) +\exp(-2 \beta T)} \right]&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; jest odstępem między bodźcami. &lt;br /&gt;
Widać stąd, że obecność czynności rytmicznej w tle wpływa na stosunek sygnału do szumu. Z powyższego równania widać, że stosunek wariancji dąży do &amp;lt;math&amp;gt;\frac{\sigma^2}{N}&amp;lt;/math&amp;gt; gdy &amp;lt;math&amp;gt;\beta T&amp;lt;/math&amp;gt; staje się duże.  &lt;br /&gt;
&lt;br /&gt;
Periodyczna stymulacja może ponadto prowadzić do wzbudzenia czynności rytmicznej o częstości równej częstości pobudzania bądź jej harmonicznej.&lt;br /&gt;
&lt;br /&gt;
===Wariancja latencji===&lt;br /&gt;
&lt;br /&gt;
Jedną z form zmienności potencjału wywołanego w pojedynczych realizacjach jest wariancja latencji. &lt;br /&gt;
[[Grafika:Wariancja_latencji.png|thumb|500px|right|&lt;br /&gt;
Czerwona linia: Uśrednianie 100 potencjałów wywołanych o latncjach z rozkładu normalnego N(300,30 ), Niebieskie linie: przykładowe pojedyncze realizacje wzięte do średniej]]&amp;lt;!--# -*- coding: utf-8 -*-&lt;br /&gt;
from __future__ import division&lt;br /&gt;
import numpy as np&lt;br /&gt;
from matplotlib.pyplot import plot, show ,subplot, figure, title, xlabel, ylabel, ylim&lt;br /&gt;
 &lt;br /&gt;
def fun(t,lat=100):&lt;br /&gt;
    return np.exp(-(t-lat)**2/(2*30**2))&lt;br /&gt;
Fs = 1&lt;br /&gt;
N = 100&lt;br /&gt;
t = np.arange(0,700)&lt;br /&gt;
f = np.zeros((N,700))&lt;br /&gt;
f_sr = np.zeros(t.shape)&lt;br /&gt;
for i in range(N):&lt;br /&gt;
    f[i,:] = fun(t,lat = 300 + 30* np.random.randn())&lt;br /&gt;
for i in range(3):&lt;br /&gt;
    plot(t,f[i,:], 'b')&lt;br /&gt;
plot(t,f.mean(0),'r')&lt;br /&gt;
show()--&amp;gt;&lt;br /&gt;
Zmienność latencji prowadzi do:&lt;br /&gt;
* zmniejszenia amplitudy &amp;lt;math&amp;gt;\bar x&amp;lt;/math&amp;gt;&lt;br /&gt;
* wzrostu rozciągłości czasowej załamka&lt;br /&gt;
&lt;br /&gt;
O tych konsekwencjach zmienności latencji należy w szczególności pamiętać porównując średnie potencjały uzyskane w różnych warunkach eksperymentalnych. Gdy zauważymy, że średnie potencjały różnią się amplitudą należy rozważyć możliwość, że w istocie warunki eksperymentalne wpływają na różnice w wariancji latencji. &lt;br /&gt;
&lt;br /&gt;
Naturalne jest, że zmienność latencji jest bardziej widoczna w przypadku załamków trwających krótko niż w przypadku załamków trwających długo. Wariancja latencji rożnie wraz z jej wartością, stąd wśród późnych składowych potencjałów wywołanych nie obserwuje się komponentów krótkotrwałych.&lt;br /&gt;
&amp;lt;!--====Uśrednianie metodą Woody'ego ====&lt;br /&gt;
&lt;br /&gt;
Model potencjału ze zmienną latencją i sposób na jego efektywniejsze uśrednianie zaproponował Woody (1967). Model ten zakłada, że w każdej realizacji występuje komponent addytywny &amp;lt;math&amp;gt;s_i(t)\;&amp;lt;/math&amp;gt;, który co do kształtu jest stały, a pomiędzy realizacjami różni się tylko latencją:&lt;br /&gt;
: &amp;lt;math&amp;gt; s_i(t) = s(t +\Delta t_i)\;&amp;lt;/math&amp;gt;&lt;br /&gt;
Woody zaproponował aby &amp;lt;math&amp;gt;\Delta t_i\;&amp;lt;/math&amp;gt; szacować na podstawie maksimum funkcji korelacji wzajemnej pomiędzy ''i''-tą realizacją a wzorcem. W pierwszym kroku wzorcem jest średni potencjał uzyskany przez proste uśrednienie realizacji.  Następnie w sposób iteracyjny dokonuje się:&lt;br /&gt;
* poprawek w wyrównaniu poszczególnych realizacji,&lt;br /&gt;
* obliczenia nowego wzorca poprzez uśrednienie realizacji po korekcie wyrównania,&lt;br /&gt;
* obliczenia nowych poprawek do wyrównania realizacji.--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Habituacja ===&lt;br /&gt;
Zmienność w odpowiedziach na kolejno występujące po sobie bodźce można podzielić na komponent stochastyczny i deterministyczny. Komponent deterministyczny odzwierciedla zmianę czułości  układu nerwowego  na kolejne bodźce. Nowy bodziec często wywołuje reakcje pobudzenia widoczną w wielu parametrach takich jak przewodnictwo skóry, rytm serca i reaktywność kory mózgowej. Powszechnie obserwowanym zjawiskiem jest spadek reaktywności na powtarzające się bodźce zwany habituacją. Niekiedy obserwuje się także zjawisko przeciwne &amp;amp;mdash; wzrost reaktywności na bodziec &amp;amp;mdash; zwane sensytyzacją. &lt;br /&gt;
&lt;br /&gt;
Klasycznym sposobem na badanie tych zjawisk w potencjałach wywołanych jest uśrednianie w podzbiorach lub  uśrednianie blokowe. Wymaga ono  zmiany paradygmatu rejestracji danych. Załóżmy, że interesującym nas bodźcem jest błysk światła. Chcemy zaobserwować ewentualne zmiany amplitudy i latencji w ciągu 100 potencjałów będących reakcją na błysk powtarzający się co 500 ms.&lt;br /&gt;
====Uśrednianie w podzbiorach ====&lt;br /&gt;
W metodzie tej musimy założyć, że proces habituacji jest powolny, tzn. zmiany pomiędzy kolejnymi reakcjami są bardzo małe. W takim przypadku możemy podzielić długą serię bodźców na ciąg pod-serii i uśrednienie przeprowadzić dla każdej pod-serii osobno.&lt;br /&gt;
[[Plik:Usrednianie_podzbiory.svg‎|640px|thumb|center|Ilustracja uśredniania w podzbiorach]]&lt;br /&gt;
&lt;br /&gt;
====Uśrednianie blokowe====&lt;br /&gt;
W tym celu eksperyment wykonujemy w wielu seriach. Jedna seria składa się ze 100 błysków powtarzanych co 500 ms.  Po serii następuje przerwa trwająca np. 5 s (długość przerwy wyraża nasze oszacowanie czasu potrzebnego na zanik habituacji). Po przerwie seria jest powtarzana. Powtórzeń serii wykonujemy ''N''.&lt;br /&gt;
Następnie uśredniamy fragmenty sygnałów odpowiadające sobie w kolejnych seriach. &lt;br /&gt;
&lt;br /&gt;
W tym paradygmacie zakładamy, że każda seria rejestrowana jest w tych samych warunkach. Zaniedbujemy efekty związane ze zmęczeniem i zmianami w np. stopniu koncentracji badanego.&lt;br /&gt;
[[Plik:Usrednianie blokowe.svg|Usrednianie blokowe.svg|640px|thumb|center|Ilustracja uśredniania w blokach]]&lt;br /&gt;
&lt;br /&gt;
===Załamki w krzywej potencjału wywołanego vs ukryte komponenty===&lt;br /&gt;
Komponenta potencjału wywołanego to bardzo ważne ale jednocześnie źle określone pojęcie. Krzywa otrzymana w wyniku uśredniania potencjałów wywołanych przedstawia serię załamków dodatnich i ujemnych, ale trzeba być świadomym, że ten przebieg napięcia rejestrowany przez elektrody przedstawia tak naprawdę sumę potencjałów pochodzących od wielu dość niezależnie działających źródeł w mózgu. Przyczynek pochodzący od jednego funkcjonalnego źródła będziemy określać jako komponentę. &lt;br /&gt;
&lt;br /&gt;
Komentarza wymaga też pojęcie źródła funkcjonalnego. Czynność elektryczną synchronicznie działających neuronów piramidalnych w określonym fragmencie kory mózgowej z pewnej odległości można przybliżyć potencjałem dipola prądowego. Taki aktywny fragment kory stanowi źródło dające przyczynek do mierzonego na powierzchni głowy potencjału. W najprostszej sytuacji taki przyczynek może być obserwowany jako komponenta. Mózg jest jednak obiektem niezwykle złożonym i gęsto połączonym. Wiele obszarów korowych może być funkcjonalnie połączonych i aktywowanych synchronicznie w celu realizacji określonego zadania &amp;amp;mdash; o takim funkcjonalnym zespole też możemy myśleć jako o pojedynczym źródle, choć może ono mieć złożoną strukturę przestrzenną. Często zatem myślimy o komponentach ukrytych potencjału wywołanego jako o aktywności takich funkcjonalnych zespołów. &lt;br /&gt;
&lt;br /&gt;
Po tym wstępie widać już chyba, że do zrozumienia co dzieje się w czasie reakcji na bodziec, którą obserwujemy w potencjale wywołanym, bardziej pożądane byłoby badanie komponent ukrytych niż poszczególnych załamków krzywej potencjału wywołanego, która stanowi ważoną sumę owych komponentów. Zanim przejdziemy do omówienia technik służących &amp;amp;bdquo;wyłuskiwaniu&amp;amp;rdquo; komponent prześledźmy kilka symulacji i wnioski z nich płynące.&lt;br /&gt;
&lt;br /&gt;
==== Załamki i komponenty nie są tym samym.====&lt;br /&gt;
Tę samą krzywą można otrzymać na nieskończenie wiele sposobów  przez sumowanie rożnych kombinacji domniemanych komponentów. Przykładowy rysunek pokazuje, jak tę samą krzywą można złożyć z dwóch rożnych zestawów komponentów (kod wytwarzający przykładową symulację pokazany jest poniżej).&lt;br /&gt;
[[Plik:Sumowanie_komponentow1.png|center|thumb|600px| Panel a) przedstawia hipotetyczną krzywą ERP, panel b) jedna z możliwych dekompozycji sygnału w panelu a), panel c) inna możliwa dekompozycja sygnału z panelu a) ]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
from __future__ import division&lt;br /&gt;
import numpy as np&lt;br /&gt;
from matplotlib.pyplot import plot, show ,subplot, figure, title, xlabel, ylabel, ylim&lt;br /&gt;
&lt;br /&gt;
Fs = 1&lt;br /&gt;
t = np.arange(0,700)&lt;br /&gt;
&lt;br /&gt;
C1 = np.exp(-(t-100)**2/(2*30**2))&lt;br /&gt;
C2 = np.exp(-(t-200)**2/(2*50**2))&lt;br /&gt;
C3 = np.exp(-(t-350)**2/(2*100**2))&lt;br /&gt;
ERP = 0.5*C1-C2+C3&lt;br /&gt;
&lt;br /&gt;
C2p = np.concatenate((C2[0:200], np.ones(30), C2[200:700-30] ))&lt;br /&gt;
C3p = ERP - 0.5*C1 + C2p&lt;br /&gt;
ERP_v2 = 0.5*C1-C2p+C3p&lt;br /&gt;
&lt;br /&gt;
subplot(3,1,1)&lt;br /&gt;
plot(t,ERP, t[::10],ERP_v2[::10],'g.')&lt;br /&gt;
ylabel('a)',rotation='horizontal')&lt;br /&gt;
ylim([-1, 1.5])&lt;br /&gt;
&lt;br /&gt;
subplot(3,1,2)&lt;br /&gt;
plot(t,0.5*C1,t,-C2,t,C3)&lt;br /&gt;
ylabel('b)',rotation='horizontal')&lt;br /&gt;
ylim([-1, 1.5])&lt;br /&gt;
&lt;br /&gt;
subplot(3,1,3)&lt;br /&gt;
plot(t,0.5*C1,t,-C2p,t,C3p)&lt;br /&gt;
ylabel('c)',rotation='horizontal')&lt;br /&gt;
ylim([-1, 1.5])&lt;br /&gt;
&lt;br /&gt;
show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Zmiana jednej komponenty może powodować zmiany w amplitudzie i latencji więcej niż jednego załamka.====&lt;br /&gt;
Poniższy rysunek przedstawia sytuację gdy zmiana amplitudy jednego komponentu może znacząco wpływać na amplitudę i latencję innych załamków.&lt;br /&gt;
&lt;br /&gt;
[[Plik:Sumowanie_komponentow2.png|center|thumb|768px| Panel a) przedstawia dwie hipotetyczne krzywe ERP, panel b) panel b i c komponenty z których powstały owe krzywe. Zmiana amplitudy komponentu oznaczonego kolorem powoduje zmianę amplitudy oznaczonych załamków ale także zmianę latencji wcześniejszego załamka. ]]&lt;br /&gt;
Poniżej kod odtwarzający powyższy przykład:&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
from __future__ import division&lt;br /&gt;
import numpy as np&lt;br /&gt;
from matplotlib.pyplot import plot, show, subplot, figure, title, xlabel, ylabel, ylim&lt;br /&gt;
&lt;br /&gt;
Fs = 1&lt;br /&gt;
t = np.arange(0,700)&lt;br /&gt;
&lt;br /&gt;
C1 = np.exp(-(t-100)**2/(2*30**2))&lt;br /&gt;
C2 = np.exp(-(t-200)**2/(2*50**2))&lt;br /&gt;
C3 = np.exp(-(t-350)**2/(2*100**2))&lt;br /&gt;
ERP1 = 0.5*C1-C2+C3&lt;br /&gt;
ERP2 = 0.5*C1-C2+1.5*C3&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
subplot(3,1,1)&lt;br /&gt;
plot(t,ERP1,'b', t,ERP2,'g')&lt;br /&gt;
plot(t[np.argmin(ERP1)],np.min(ERP1),'r.' )&lt;br /&gt;
plot(t[np.argmax(ERP1)],np.max(ERP1),'m.' )&lt;br /&gt;
plot(t[np.argmin(ERP2)],np.min(ERP2),'r.' )&lt;br /&gt;
plot(t[np.argmax(ERP2)],np.max(ERP2),'m.' )&lt;br /&gt;
&lt;br /&gt;
ylabel('a)',rotation='horizontal')&lt;br /&gt;
ylim([-1, 1.6])&lt;br /&gt;
&lt;br /&gt;
subplot(3,1,2)&lt;br /&gt;
plot(t,0.5*C1,'k',t,-C2,'k',t,C3,'b')&lt;br /&gt;
ylabel('b)',rotation='horizontal')&lt;br /&gt;
ylim([-1, 1.6])&lt;br /&gt;
&lt;br /&gt;
subplot(3,1,3)&lt;br /&gt;
plot(t,0.5*C1,'k',t,-C2,'k',t,1.5*C3,'g')&lt;br /&gt;
ylabel('c)',rotation='horizontal')&lt;br /&gt;
ylim([-1, 1.6])&lt;br /&gt;
&lt;br /&gt;
show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Instrukcje do ćwiczeń =&lt;br /&gt;
&lt;br /&gt;
==Zadanie 1: uśrednianie symulowanych sygnałów==&lt;br /&gt;
w tym ćwiczeniu chcemy pokazać efekty:&lt;br /&gt;
# uśredniania sygnałów związanych fazowo z bodźcem i nieskorelowanych z bodźcem / wpływ liczby realizacji,&lt;br /&gt;
# uśredniania sygnałów z fluktuacją latencji,&lt;br /&gt;
# wpływ filtrów o różnych funkcjach odpowiedzi impulsowej na morfologię uśrednionego potencjału.&lt;br /&gt;
&lt;br /&gt;
===Sygnały testowe===&lt;br /&gt;
Proszę zaimplementować funkcje generujące następujące przebiegi czasowe (oznaczenia: ''F&amp;lt;sub&amp;gt;s&amp;lt;/sub&amp;gt;'' &amp;amp;mdash; częstość próbkowania, ''T'' &amp;amp;mdash; czas trwania w sekundach, [[%C4%86wiczenia_1#Sygna.C5.82y_testowe|analogicznie do tego]]):&lt;br /&gt;
* sinusoida o zadanej częstości ''f'' i fazie &amp;lt;math&amp;gt;\phi&amp;lt;/math&amp;gt;: &amp;lt;tt&amp;gt;y = sin(f, phi, Fs, T)&amp;lt;/tt&amp;gt;,&lt;br /&gt;
* funkcja Gaussa o zadanym położeniu i szerokości &amp;lt;tt&amp;gt;y = g_1(t0, sigma, Fs, T) &amp;lt;/tt&amp;gt;&lt;br /&gt;
: &amp;lt;math&amp;gt;g_1(t) = \exp\left(-\frac{(t-t_0)^2}{2 \sigma^2}\right)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* pochodną funkcji Gaussa o zadanym położeniu i szerokości &amp;lt;tt&amp;gt;y = g_2(t0, sigma, Fs, T)&amp;lt;/tt&amp;gt;,&lt;br /&gt;
* połowę funkcji Gaussa o zadanym położeniu i szerokości &amp;lt;tt&amp;gt;y = g_3(t0, sigma, Fs, T)&amp;lt;/tt&amp;gt;,&lt;br /&gt;
: &amp;lt;math&amp;gt;g_{3}(t) = \left\{ &lt;br /&gt;
\begin{array}{lll}&lt;br /&gt;
0 &amp;amp; \mathrm{dla}&amp;amp; t&amp;lt;t_0 \\&lt;br /&gt;
\exp\left(-\frac{(t-t_0)^2}{2 \sigma^2}\right)&amp;amp; \mathrm{dla}&amp;amp; t \ge t_0  &lt;br /&gt;
\end{array}&lt;br /&gt;
\right. &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
W dalszych zadaniach tej sekcji przyjmiemy:&lt;br /&gt;
* ''T'' = 1 s,&lt;br /&gt;
* ''F&amp;lt;sub&amp;gt;s&amp;lt;/sub&amp;gt;'' = 128 Hz,&lt;br /&gt;
* ''t''&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; = 0,3 s,&lt;br /&gt;
* &amp;amp;sigma; = 0,02 s.&lt;br /&gt;
&lt;br /&gt;
===Uśrednianie w modelu addytywnym: sygnał + szum===&lt;br /&gt;
Dla funkcji &amp;lt;math&amp;gt;g_1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;g_2&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;g_3&amp;lt;/math&amp;gt;  wykonaj ''N'' symulacji sygnału opisanego daną funkcją z dodanym szumem gaussowskim (&amp;lt;tt&amp;gt;numpy.random.randn&amp;lt;/tt&amp;gt;). Zaobserwuj zmianę wariancji uśrednianego sygnału wraz z ''N''.&lt;br /&gt;
&lt;br /&gt;
===Uśrednianie w modelu addytywnym: sygnał + szum + niezależna czynność rytmiczna===&lt;br /&gt;
Powtórz poprzednie symulacje dokładając w każdej realizacji sinusoidę o losowo wybranej fazie. Symulacje wykonaj dla różnych częstości sinusoidy, takich których połówka okresu zbliżona jest do szerokości funkcji Gaussa, oraz znacząco od niej różnych.&lt;br /&gt;
&lt;br /&gt;
===Uśrednianie w modelu z resetem fazy===&lt;br /&gt;
Zbuduj sygnał składający się z dwóch fragmentów sinusoidy o częstości ''f'': &lt;br /&gt;
* pierwszy fragment ma losową fazę,&lt;br /&gt;
* drugi fragment ma fazę równą 0.&lt;br /&gt;
Wykonaj ''N'' realizacji takiego sygnału, przy czym każda realizacja ma częstość losowaną z rozkładu Gaussa o średniej 10 i pewnej wariancji (czyli &amp;lt;math&amp;gt;f \in \mathrm{N}(10,\sigma)&amp;lt;/math&amp;gt;). &lt;br /&gt;
Uśrednij otrzymane realizacje. Zaobserwuj zależność średniej od liczby uśrednianych realizacji i od wariancji częstości.&lt;br /&gt;
&lt;br /&gt;
===Uśrednianie potencjału z fluktuacją latencji===&lt;br /&gt;
Wygeneruj sygnały składające się z funkcji &amp;lt;math&amp;gt;g_1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;g_2&amp;lt;/math&amp;gt; albo &amp;lt;math&amp;gt;g_3&amp;lt;/math&amp;gt; z fluktuującą latencją, tzn. z wartością &amp;lt;math&amp;gt;t_0&amp;lt;/math&amp;gt; pochodzącą z jakiegoś rozkładu prawdopodobieństwa. U nas dla ustalenia uwagi niech będzie to rozkład Gaussa. Wykonaj zestaw symulacji obrazujący zależność od liczby realizacji i od wielkości fluktuacji, mierzonej przez wariancję rozkładu. Czy jest związek pomiędzy wariancją fluktuacji &amp;lt;math&amp;gt;t_0&amp;lt;/math&amp;gt; a szerokością załamków?&lt;br /&gt;
&lt;br /&gt;
===Wpływ filtrów===&lt;br /&gt;
# Zaprojektuj następujące filtry (przyjmij częstość próbkowania 128 Hz):&lt;br /&gt;
#* dolnoprzepustowy: Butterwortha z częstością odcięcia: 30, 40, 50 Hz, i rzędach od 1 do 5 (funkcja butter w module scipy.signal),&lt;br /&gt;
#* górnoprzepustowy: Butterwortha z częstością odcięcia: 0,1, 0,5, 2 i 5 Hz, i rzędach od 1 do 5,&lt;br /&gt;
#* notch: Czybyszewa II rodzaju z pasmem zaporowym ustawionym na 50 Hz, i rzędach od 1 do 3 (funkcja cheby2),&lt;br /&gt;
# Zbadaj funkcję odpowiedzi impulsowej i funkcję przenoszenia tych filtrów (w skali dB). Zaobserwuj jak długa jest odpowiedź impulsowa i jak daleko od częstości odcięcia zaburzone jest pasmo przenoszenia.&lt;br /&gt;
# Zastosuj powyższe filtry do funkcji &amp;lt;math&amp;gt;g_1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;g_2&amp;lt;/math&amp;gt; albo &amp;lt;math&amp;gt;g_3&amp;lt;/math&amp;gt;. Filtrowanie przeprowadź w jedną (lfilter) oraz w dwie strony (filtfilt). Zaobserwuj związek między zniekształceniem wprowadzanym przez filtr a funkcją odpowiedzi impulsowej filtru.&lt;br /&gt;
# W ćwiczeniu tym posłuż się symulowanymi sygnałami uzyskanymi z modelu addytywnego: &amp;amp;bdquo;sygnał+szum&amp;amp;rdquo;. Dla funkcji &amp;lt;math&amp;gt;g_1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;g_2&amp;lt;/math&amp;gt; albo &amp;lt;math&amp;gt;g_3&amp;lt;/math&amp;gt;  wykonaj ''N'' = 60 realizacji sygnału opisanego daną funkcją z dodanym szumem gaussowskim (&amp;lt;tt&amp;gt;numpy.random.randn&amp;lt;/tt&amp;gt;). Każdą z realizacji przefiltruj, a następnie uśrednij uzyskane sygnały.&lt;br /&gt;
&lt;br /&gt;
==Zadanie 2: rejestracje i analiza potencjałów wzrokowych==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;! -- ===Synchronizacja występowania bodźców z sygnałem EEG===&lt;br /&gt;
&lt;br /&gt;
Rejestracja potencjałów wywołanych jest przykładem pomiaru czynności elektrycznej mózgu w odpowiedzi na określony bodziec. W przypadku tego rodzaju pomiarów konieczna jest synchronizacja momentu wystąpienia bodźca z sygnałem EEG. Wzmacniacze do pomiaru czynności elektrycznej mózgu wyposażone są w specjalne wejścia, na które można podawać sygnał odpowiadający pojawianiu się bodźca. Jak pamiętamy z zeszłego semestru, wejście to (jak i podawany na nie sygnał) nazywamy trigerem (ang. ''trigger'' &amp;amp;mdash; spust, cyngiel, wyzwalacz). W najprostszym przypadku, bodziec moglibyśmy wyświetlać na monitorze komputerowym, a sygnał związany z jego wystąpieniem wysyłać przez któryś z portów komputera (LPT, COM) na wzmacniacz EEG. Niestety, obecnie dostępne i popularne systemy operacyjne, takie jak Windows czy Linux nie są systemami czasu rzeczywistego (http://pl.wikipedia.org/wiki/System_operacyjny_czasu_rzeczywistego). Od momentu wyświetlania bodźca na ekranie, do pojawiania się sygnału odpowiednim porcie komputerowym może upłynąć kilkadziesiąt milisekund i co gorsza czas ten zwykle jest losowy. W przypadku gdy wzmacniacz próbkuje sygnał z częstością 1000 Hz, moment wystąpienia bodźca możemy określić z dokładnością 1 ms, jednakże wspomniane opóźnienia w systemie operacyjnym uniemożliwiają to. Ponadto, jak dowiedzieliśmy się w rozdziale wstępnym [http://brain.fuw.edu.pl/edu-wiki/action/edit/EEG:Potencja%C5%82y_wywo%C5%82ane?section=T-1], pierwsze załamki związane z potencjałami wywołanymi pojawiają się już 10 ms po wystąpieniu bodźca. W związku z tym, losowe, rzędu kilkudziesięciu milisekund opóźnienia sygnału określającego moment pojawienia się bodźca względem jego rzeczywistego wystąpienia są niedopuszczalne.&lt;br /&gt;
Istnieją pewne techniki programowania, dzięki którym opisywane opóźnienia można zmniejszyć, jednakże są one bardzo trudne  do realizacji. Ponadto, standardowe porty komputera, takie jak LPT, czy COM zostały zaprojektowane przede wszystkim do sterowania urządzeniami zewnętrznymi, a nie ich zasilania. Przykładowo, jedna linia portu drukarkowego (LPT) może być obciążona prądem nie większym niż 5 mA, podczas gdy do zapalenie zwykłej diody LED potrzeba około 10 mA. Taki pobór prądu możliwy jest do uzyskania z portu USB, jednakże  jest on  wyjątkowo trudny do oprogramowania.  &lt;br /&gt;
W celu ominięcia powyższych niedogodności w Zakładzie Fizyki Biomedycznej UW w przeprowadzanych eksperymentach wykorzystywane są  mikrokontrolery [http://pl.wikipedia.org/wiki/Mikrokontroler], w szczególności ATmega16 i ATmega32.  Mikrokontrolery te wyposażone są w procesory o architekturze RISC [http://pl.wikipedia.org/wiki/RISC] i mocy obliczeniowej porównywalnej z szeroko stosowanym kiedyś w komputerach ZX Spectrum, Commodore, Amiga i Atari procesorem Z80. Oprócz jednostki centralnej mikrokontrolery zawierają   stałą pamięć FLASH przeznaczoną do przechowywania kodu programu, pamięć  RAM i pamięć EEPROM, liczniki 8- i 16-bitowe, komparatory, przetworniki analogowo-cyfrowe, porty wejścia/wyjścia, łącze RS232 (popularnie nazywane portem szeregowym) i układy przerwań.&lt;br /&gt;
&lt;br /&gt;
Mikrokontrolery wchodzące w skład zestawów pomiarowych na Pracowni EEG zawierają program, który umożliwia komunikację z nimi poprzez port szeregowy. Obecnie, komputery są coraz rzadziej wyposażane w porty szeregowe. Standard komunikacji RS-232, opracowany w 1962 roku  nadal jest jednak popularny i często wykorzystywany do komunikacji miedzy urządzeniami.  W celu połączenia komputera posiadającego tylko porty USB z mikrokontrolerem zastosowano przejściówkę USB/RS-232. &lt;br /&gt;
&lt;br /&gt;
Jak każde urządzenie w systemie Linuks, przejściówka USB/RS-232 widoczna jest jako plik, znajdujący się w katalogu &amp;lt;tt&amp;gt;/dev&amp;lt;/tt&amp;gt;. Nazwy plików obsługujących urządzenia szeregowe to &amp;lt;tt&amp;gt;ttyXY&amp;lt;/tt&amp;gt;, gdzie &amp;lt;tt&amp;gt;XY&amp;lt;/tt&amp;gt; to kolejny numer przydzielony do urządzenia szeregowego.&lt;br /&gt;
Do komunikacji komputera z mikroknotrolerem  w Zakładzie Fizyki Biomedycznej UW została napisana prosta biblioteka.  Jej użycie jest następujące:&lt;br /&gt;
* Po podłączeniu przejściówki USB/RS232 do komputera mikrokontrolera sprawdź jaki plik w katalogu &amp;lt;tt&amp;gt;/dev&amp;lt;/tt&amp;gt; został utworzony i przydzielony do urządzenia. &lt;br /&gt;
* Zaimportuj bibliotekę do komunikacji z mikrokontrolerem: &lt;br /&gt;
: &amp;lt;tt&amp;gt;import SerialPort as SP&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Otwórz plik powiązany z urządzeniem zewnętrznym:&lt;br /&gt;
: &amp;lt;tt&amp;gt;sp = SP.SerialPort(nazwa_pliku) &amp;lt;/tt&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
: &amp;lt;tt&amp;gt;sp.open()&amp;lt;/tt&amp;gt;&lt;br /&gt;
W naszym przypadku prawidłowa nazwa pliku to &amp;lt;tt&amp;gt;/dev/ttyUSB0&amp;lt;/tt&amp;gt;.&lt;br /&gt;
* Po włączeniu zasilania mikrokontrolera, diody podłączone do niego i wykorzystywane w eksperymencie z potencjałami wywołanymi będą zapalone. Następujące polecenie zgasi obydwie diody:&lt;br /&gt;
: &amp;lt;tt&amp;gt;sp.blinkP300([0, 0])&amp;lt;/tt&amp;gt;&lt;br /&gt;
* Wydanie poniższego polecenia spowoduje, iż mikrokontroler zapali podłączoną do niego diodę numer 1 na czas 100 ms, zaś diodę numer 2 na 200 ms. Jednocześnie, w momencie włączenia jak i wyłączenia diody, sygnał z mikrokontrolera zostanie wysłany na 5-stykowe wejście AUX mikrokontrolera:&lt;br /&gt;
: &amp;lt;tt&amp;gt;sp.blinkP300([100, 200])&amp;lt;/tt&amp;gt;&lt;br /&gt;
* Jeśli chcemy zapalić tylko diodę numer dwa, np. na czas 500 ms w programie podajemy następującą instrukcję:&lt;br /&gt;
: &amp;lt;tt&amp;gt;sp.blinkP300([0, 500])&amp;lt;/tt&amp;gt;&lt;br /&gt;
* Jeśli chcemy zakończyć komunikację z mikrokontrolerem piszemy:&lt;br /&gt;
: &amp;lt;tt&amp;gt;sp.close()&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Kod biblioteki do komunikacji z mikrokontrolerem:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;!--  Kod w Pythonie 2&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# -*- coding: cp1250 -*-&lt;br /&gt;
import serial&lt;br /&gt;
import logging&lt;br /&gt;
import sys&lt;br /&gt;
import os&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def to_hex_word(a):&lt;br /&gt;
    '''encodes a decimal number hexadecimally on two bytes'''&lt;br /&gt;
    return chr(a%256) + chr(a/256)&lt;br /&gt;
&lt;br /&gt;
class SerialPort(object):&lt;br /&gt;
    def __init__(self, port_name):&lt;br /&gt;
        import serial&lt;br /&gt;
        try:&lt;br /&gt;
            self.port = serial.Serial(&lt;br /&gt;
                port=port_name,&lt;br /&gt;
                baudrate=9600,&lt;br /&gt;
                bytesize=serial.EIGHTBITS,&lt;br /&gt;
                parity=serial.PARITY_NONE,&lt;br /&gt;
                stopbits=serial.STOPBITS_ONE,&lt;br /&gt;
                xonxoff=False&lt;br /&gt;
                )&lt;br /&gt;
        except serial.SerialException as e:&lt;br /&gt;
            print(&amp;quot;Nieprawidłowa nazwa portu lub port zajęty.&amp;quot;)&lt;br /&gt;
            raise e&lt;br /&gt;
        self.close()&lt;br /&gt;
        &lt;br /&gt;
    def open(self):&lt;br /&gt;
        self.port.open()&lt;br /&gt;
&lt;br /&gt;
    def close(self):&lt;br /&gt;
        self.port.close()&lt;br /&gt;
&lt;br /&gt;
    def send(self, value):&lt;br /&gt;
        self.port.write(value)&lt;br /&gt;
                           &lt;br /&gt;
    def blinkSSVEP(self,d, p1, p2):&lt;br /&gt;
        '''&lt;br /&gt;
        d = list of frequencies;&lt;br /&gt;
        p1:p2 = ratio LED_on_time/LED_off_time&lt;br /&gt;
        if you want i-th LED to be OFF all the time send  d[i] = 0&lt;br /&gt;
        if you want i-th LED to be ON all the time send  d[i] = -1&lt;br /&gt;
        in these two cases p1 and p2 do not matter&lt;br /&gt;
        '''&lt;br /&gt;
        clock  = 62500&lt;br /&gt;
        factor = float(p1) / float(p1 + p2)&lt;br /&gt;
    &lt;br /&gt;
        str = chr(3) # 'SSVEP_RUN'&lt;br /&gt;
&lt;br /&gt;
        for i in range(len(d)):&lt;br /&gt;
            # i-th LED OFF&lt;br /&gt;
            if d[i] == 0:                       &lt;br /&gt;
                str += to_hex_word(0) + to_hex_word(255) &lt;br /&gt;
            # i-th LED ON&lt;br /&gt;
            elif d[i] == -1:&lt;br /&gt;
                str += to_hex_word(255) + to_hex_word(0)&lt;br /&gt;
                #str = 'S'&lt;br /&gt;
                # i-th LED blinks d[i] times per second&lt;br /&gt;
                # p1:p2 = on_time:off_time in one blink&lt;br /&gt;
            else:&lt;br /&gt;
                period = clock/d[i]&lt;br /&gt;
                bright = int((clock/d[i]) * factor)&lt;br /&gt;
                dark = period - bright&lt;br /&gt;
                str += to_hex_word(bright) + to_hex_word(dark)&lt;br /&gt;
&lt;br /&gt;
        self.send(str)&lt;br /&gt;
&lt;br /&gt;
    def blinkP300(self,d):&lt;br /&gt;
        clock  = 62500&lt;br /&gt;
        str = chr(4) # 'P300_RUN'&lt;br /&gt;
&lt;br /&gt;
        for i in range(len(d)):&lt;br /&gt;
            period = int(clock*d[i]/1000.0)&lt;br /&gt;
            str += to_hex_word(period)&lt;br /&gt;
            print(period)&lt;br /&gt;
&lt;br /&gt;
        self.send(str)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
--&amp;gt; &amp;lt;!-- Kod w Pythonie 3 --&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# -*- coding: cp1250 -*-&lt;br /&gt;
import serial&lt;br /&gt;
import logging&lt;br /&gt;
import sys&lt;br /&gt;
import os&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
def to_hex_word(a):&lt;br /&gt;
    '''encodes a decimal number hexadecimally on two bytes'''&lt;br /&gt;
    return a.to_bytes(2,byteorder=sys.byteorder)&lt;br /&gt;
 &lt;br /&gt;
class SerialPort(object):&lt;br /&gt;
    def __init__(self, port_name):&lt;br /&gt;
        import serial&lt;br /&gt;
        try:&lt;br /&gt;
            self.port = serial.Serial(&lt;br /&gt;
                port=port_name,&lt;br /&gt;
                baudrate=9600,&lt;br /&gt;
                bytesize=serial.EIGHTBITS,&lt;br /&gt;
                parity=serial.PARITY_NONE,&lt;br /&gt;
                stopbits=serial.STOPBITS_ONE,&lt;br /&gt;
                xonxoff=False&lt;br /&gt;
                )&lt;br /&gt;
        except serial.SerialException as e:&lt;br /&gt;
            print(&amp;quot;Nieprawidłowa nazwa portu lub port zajęty.&amp;quot;)&lt;br /&gt;
            raise e&lt;br /&gt;
        self.close()&lt;br /&gt;
 &lt;br /&gt;
    def open(self):&lt;br /&gt;
        self.port.open()&lt;br /&gt;
 &lt;br /&gt;
    def close(self):&lt;br /&gt;
        self.port.close()&lt;br /&gt;
 &lt;br /&gt;
    def send(self, value):&lt;br /&gt;
        self.port.write(value)&lt;br /&gt;
 &lt;br /&gt;
    def blinkSSVEP(self,d, p1, p2):&lt;br /&gt;
        '''&lt;br /&gt;
        d = list of frequencies;&lt;br /&gt;
        p1:p2 = ratio LED_on_time/LED_off_time&lt;br /&gt;
        if you want i-th LED to be OFF all the time send  d[i] = 0&lt;br /&gt;
        if you want i-th LED to be ON all the time send  d[i] = -1&lt;br /&gt;
        in these two cases p1 and p2 do not matter&lt;br /&gt;
        '''&lt;br /&gt;
        clock  = 62500&lt;br /&gt;
        factor = float(p1) / float(p1 + p2)&lt;br /&gt;
 &lt;br /&gt;
        str = (3).to_bytes(1,byteorder=sys.byteorder) # 'SSVEP_RUN'&lt;br /&gt;
 &lt;br /&gt;
        for i in range(len(d)):&lt;br /&gt;
            # i-th LED OFF&lt;br /&gt;
            if d[i] == 0:                       &lt;br /&gt;
                str += to_hex_word(0) + to_hex_word(255) &lt;br /&gt;
            # i-th LED ON&lt;br /&gt;
            elif d[i] == -1:&lt;br /&gt;
                str += to_hex_word(255) + to_hex_word(0)&lt;br /&gt;
                #str = 'S'&lt;br /&gt;
                # i-th LED blinks d[i] times per second&lt;br /&gt;
                # p1:p2 = on_time:off_time in one blink&lt;br /&gt;
            else:&lt;br /&gt;
                period = clock/d[i]&lt;br /&gt;
                bright = int((clock/d[i]) * factor)&lt;br /&gt;
                dark = int(period - bright)&lt;br /&gt;
                str += to_hex_word(bright) + to_hex_word(dark)&lt;br /&gt;
 &lt;br /&gt;
        self.send(str)&lt;br /&gt;
 &lt;br /&gt;
    def blinkP300(self,d):&lt;br /&gt;
        clock  = 62500&lt;br /&gt;
        str = (4).to_bytes(1,byteorder=sys.byteorder) # 'P300_RUN'&lt;br /&gt;
 &lt;br /&gt;
        for i in range(len(d)):&lt;br /&gt;
            period = int(clock*d[i]/1000.0)&lt;br /&gt;
            str += to_hex_word(period)&lt;br /&gt;
 &lt;br /&gt;
        self.send(str)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
--&amp;gt; &lt;br /&gt;
&lt;br /&gt;
===Zestaw eksperymentalny===&lt;br /&gt;
Zestaw składa się ze:&lt;br /&gt;
* wzmacniacza,&lt;br /&gt;
* stymulatora   &lt;br /&gt;
&amp;lt;!--* izolowanego galwanicznie układu generującego impulsy odpowiadające gaszeniu i zapalaniu diody,  o wartościach dopasowanych do akceptowalnych przez wejścia AUX wzmacniacza,--&amp;gt;&lt;br /&gt;
* komputera: w tym eksperymencie komputer będzie służył do zaprogramowania stymulatora i do rejestracji sygnałów.&lt;br /&gt;
&lt;br /&gt;
===Eksperyment 1. Obserwacja bodźca wzrokowego  ===&lt;br /&gt;
&amp;lt;!--Proszę zapoznać się ze standardami rejestracji wzrokowych potencjałów wywołanych [http://www.gcu.ac.uk/media/gcalwebv2/theuniversity/academicschools/sls/psytimetables/SLS%20-%20VEP_Standard_2010.pdf] --&amp;gt;&lt;br /&gt;
Proszę zapoznać się z typowym wyglądem załamków w przypadku potencjałów wzrokowych, jaki jest przedstawiony na [https://link.springer.com/article/10.1007/s10633-009-9195-4/figures/2 rysunku] (cały artykuł jest dostępny [http://link.springer.com/article/10.1007%2Fs10633-009-9195-4 tu]).&lt;br /&gt;
&amp;lt;!--[[Plik:Fig 4 VEP.jpg|thumb|320px|right|&amp;lt;figure id=&amp;quot;fig:zalamki_VEP&amp;quot;&amp;gt;&amp;lt;/figure&amp;gt;&lt;br /&gt;
&amp;lt;xr id=&amp;quot;fig:zalamki_VEP&amp;quot;&amp;gt;Rys. %i.&amp;lt;/xr&amp;gt; Schemat załamków rozpoznawanych we wzrokowych potencjach wywołanych (z pracy: J. V. Odom i in. &amp;amp;bdquo;ISCEV standard for clinical visual evoked potentials&lt;br /&gt;
(2009 update)&amp;amp;rdquo;, Doc Ophthalmol (2010), 120:111–119).]]&lt;br /&gt;
--&amp;gt; &lt;br /&gt;
&lt;br /&gt;
==== Rejestracja ====&lt;br /&gt;
* Paradygmat: z odległości około 40 cm badany obserwuje wyświetalny na ekranie biały kwadrat. Bodźce trwają 300 ms i  powtarzają się co 0.5 sekundy. Bodziec poprzedza punkt fiksacji pokazywany przez 300 ms. Natężenie bodźca ma przyjąć jedną z 4 wartości (manipulujemy jego przeźroczystością: 1, 0.7, 0.3 i 0.1, gdzie 1 oznacza brak przeźroczystości). Każda z intensywności bodźca ma pojawić się 100 razy podczas badania, bodźce podawane mają być w sposób losowy. Zadanie poprzedza krótka instrukcja, kończy podziękowanie. &lt;br /&gt;
&lt;br /&gt;
* Pomiar&lt;br /&gt;
**Zakładamy czepek i elektrody w systemie 10-20, dbamy o to by opory pomiędzy elektrodami były poniżej 10 k&amp;amp;Omega; i różnice pomiędzy oporami różnych elektrod nie przekraczały 20%. [[Plik:Glowka10-20 ERPy.svg|thumb|600px|right]]&lt;br /&gt;
** Elektrodę GND mocujemy w otworze czepka odpowiadającym pozycji AFz (na linii centralnej 10% w stronę nosa od elektrody Fz) &lt;br /&gt;
** Montujemy także elektrody M1 i M2 i FCz.&lt;br /&gt;
&lt;br /&gt;
==== Analiza ====&lt;br /&gt;
# Filtrujemy sygnał w paśmie 1-20 Hz.&lt;br /&gt;
# Z ciągłego zapisu wycinamy fragmenty od &amp;amp;minus;300 ms do +800 ms (zero oznacza moment wystąpienia bodźca). W czasie wycinania badamy wycinane fragmenty pod względem zakresu amplitudy (wszystkie kanały powinny mieć amplitudę w granicach &amp;amp;plusmn;75 &amp;amp;mu;V) i zawartości artefaktów od mrugania (w tym celu trzeba oglądając sygnał w SVAROG-u ustalić próg na amplitudę sygnału w kanałach Fp1 i Fp2).&lt;br /&gt;
# Uśredniamy wycięte sygnały.&lt;br /&gt;
# Rysujemy średni potencjał we wszystkich kanałach.&lt;br /&gt;
# Pierwszy sposób: Identyfikujemy załamki P1 i N2. Mierzymy amplitudę P1 jako różnicę między ekstremalną wartością załamka N2 a ekstremalną wartością załamka N2. &lt;br /&gt;
# Drugi sposób: Identyfikujemy załamki P1 i N2. Mierzymy amplitudę P1 w stosunku do zera. &lt;br /&gt;
#porównujemy uzyskane amplitudy w 4 warunkach za pomocą odpowiedniego testu statystycznego (porównanie warunków ze skrajnymi wartościami amplitudy - zastosuj test permutacyjny (opisany poniżej) lub test t-Studenta/nieparametryczny odpowiednik). &lt;br /&gt;
&lt;br /&gt;
**Opis testu permutacyjnego &lt;br /&gt;
Pytanie: Czy intensywność bodźca wpływa na amplitudę potencjału P1?&lt;br /&gt;
Jak stwierdzić czy amplitudy załamków P1 istotnie różnią się pomiędzy seriami?&lt;br /&gt;
&lt;br /&gt;
Musimy przeprowadzić test statystyczny. Możemy skonstruować go np. tak:&lt;br /&gt;
Mamy dwa warunki I i II. Jako statystykę przyjmiemy różnicę pomiędzy amplitudą załamka zmierzoną w serii z dwoma diodami (P2&amp;lt;sub&amp;gt;II&amp;lt;/sub&amp;gt;) a amplitudą zmierzoną w serii z jedną diodą (P2&amp;lt;sub&amp;gt;I&amp;lt;/sub&amp;gt;):&lt;br /&gt;
: ''S'' = P2&amp;lt;sub&amp;gt;II&amp;lt;/sub&amp;gt; &amp;amp;minus; P2&amp;lt;sub&amp;gt;I&amp;lt;/sub&amp;gt;&lt;br /&gt;
Postawmy hipotezę zerową, że nie ma różnicy w amplitudzie pomiędzy warunkiem II a I oraz hipotezę alternatywną, że różnica taka występuje.&lt;br /&gt;
: H&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;: ''S'' = 0&lt;br /&gt;
: H&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;: ''S'' &amp;amp;ne; 0&lt;br /&gt;
Zgodnie z H&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; dla wartości ''S'' nie ma różnicy czy realizacja została zarejestrowana w warunkach I czy II, zatem można losowo poprzypisywać numery warunków do realizacji i w ten sposób uzyskać rozkład statystyki ''S'' pod warunkiem prawdziwości H&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;, czyli obliczyć średnie potencjały dla &amp;amp;bdquo;pomieszanych&amp;amp;rdquo; tagów, wyliczyć średnie potencjały dla sztucznie wygenerowaych grup, i wyliczyć różnicę amplitud dla tych średnich, czyli wartość statystyki dla hipotezy H&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Zaimplementuj test permutacyjny zgodny z powyższą koncepcją.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- ===Wersja 2: obserwacja habituacji / uśrednianie w blokach ===&lt;br /&gt;
==== Rejestracja ====&lt;br /&gt;
# Paradygmat: &lt;br /&gt;
#* z odległości około 40 cm badany obserwuje błyski diody. &lt;br /&gt;
#* Błyski powtarzają się co 0,5 sekundy. &lt;br /&gt;
#* Rejestrujemy 60 serii po 15 błysków.  &lt;br /&gt;
#* Pomiędzy seriami badany odpoczywa około 10 sekund.&lt;br /&gt;
# Zakładamy czepek i elektrody w systemie 10-20, dbamy o to by opory pomiędzy elektrodami były poniżej 5 k&amp;amp;Omega; i różnice pomiędzy oporami różnych elektrod nie przekraczały 20%.&lt;br /&gt;
#* Elektrodę GND mocujemy w otworze czepka odpowiadającym pozycji AFz (na linii centralnej 10% w stronę nosa od elektrody Fz) &lt;br /&gt;
#* Montujemy także elektrodę FCz (na linii centralnej pomiędzy Fz a Cz), będziemy jej używać w montażu i w czasie analizy jako referencji.&lt;br /&gt;
#* Częstość próbkowania 512 Hz.&lt;br /&gt;
&lt;br /&gt;
==== Analiza ====&lt;br /&gt;
# Filtrujemy sygnał w paśmie 0,1-20 Hz.&lt;br /&gt;
# Z ciągłego zapisu wycinamy fragmenty od &amp;amp;minus;300 ms do +600 ms (zero oznacza moment wystąpienia bodźca). W czasie wycinania badamy wycinane fragmenty pod względem zakresu amplitudy (wszystkie kanały powinny mieć amplitudę w granicach &amp;amp;plusmn;75 &amp;amp;mu;V) i zawartości artefaktów od mrugania (w tym celu trzeba oglądając sygnał w SVAROG-u ustalić próg na amplitudę sygnału w kanałach Fp1 i Fp2).&lt;br /&gt;
# Uśredniamy wycięte sygnały o tym samym numerze wewnątrz serii.&lt;br /&gt;
# Rysujemy serie 15 uśrednionych potencjałów dla tego kanału, który wykazywał najsilniejszy potencjał w pierwszej wersji eksperymentu. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Eksperyment 2: rejestracja i analiza potencjału P3 ==&lt;br /&gt;
==== Rejestracja ====&lt;br /&gt;
# Paradygmat: &lt;br /&gt;
#* z odległości około 40 cm badany obserwuje kwadrat, który występuje w dwóch kolorach. &lt;br /&gt;
#* Bodźce trwają 300 ms, poprzedzane punktem fiksacji wyświetlanym na 300 ms, przerwa między próbami jest losowana i wynosi od 0.8-1.2 s.  &lt;br /&gt;
#* Proporcja wystapień bodźców koloru pierwszego i drugiego wynosi 1:5.   &lt;br /&gt;
#* Zadaniem badanego jest liczenie kwadratów w rzadkim kolorze. &lt;br /&gt;
#* Wykonujemy tyle realizacji aby zarejestrować 100 powtórzeń bodźców rzadkich. &lt;br /&gt;
# Zakładamy czepek i elektrody w systemie 10-20, dbamy o to by opory pomiędzy elektrodami były poniżej 5 k&amp;amp;Omega; i różnice pomiędzy oporami różnych elektrod nie przekraczały 20%.&lt;br /&gt;
#* Elektrodę GND mocujemy w otworze czepka odpowiadającym pozycji AFz (na linii centralnej 10% w stronę nosa od elektrody Fz) &lt;br /&gt;
#* Montujemy także elektrody M1 i M2, będziemy ich używać w montażu i w czasie analizy jako referencji typu połączone uszy.&lt;br /&gt;
#* Częstość próbkowania 512 Hz.&lt;br /&gt;
&lt;br /&gt;
==== Analiza ====&lt;br /&gt;
# Filtrujemy sygnał w paśmie 1-20 Hz.&lt;br /&gt;
# Z ciągłego zapisu wycinamy fragmenty od &amp;amp;minus;300 ms do +900 ms (zero oznacza moment wystąpienia bodźca). W czasie wycinania badamy wycinane fragmenty pod względem zakresu amplitudy (wszystkie kanały powinny mieć amplitudę w granicach &amp;amp;plusmn;75 &amp;amp;mu;V) i zawartości artefaktów od mrugania (w tym celu trzeba oglądając sygnał w SVAROG-u ustalić próg na amplitudę sygnału w kanałach Fp1 i Fp2).&lt;br /&gt;
# Uśredniamy osobno realizacje błysków pojedynczych i błysków podwójnych.&lt;br /&gt;
# Nakładamy na siebie na rysunkach oba typy średnich.&lt;br /&gt;
# liczymy test statystyczny pomiędzy warunkami&lt;br /&gt;
&lt;br /&gt;
==Ćwiczenie dodatkowe: P300 BCI==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wykorzystujemy elektrody z systemu 10-10 umieszczone nad korą wzrokową: P07, O1, O2, PO8, PO3, PO4, Pz, Cz.&lt;br /&gt;
&lt;br /&gt;
Uruchamiamy &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
obci_gui --presets eeg_workshop&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
i z guzika &amp;amp;bdquo;select amplifier&amp;amp;rdquo; wybieramy właściwy wzmacniacz.&lt;br /&gt;
&lt;br /&gt;
Do kontroli jakości sygnału możemy uruchomić Svaroga.&lt;br /&gt;
&lt;br /&gt;
Dane z kalibracji zapisują się w pliku test1 w katalogu domowym użytkownika, z labiryntu w pliku test2.&lt;br /&gt;
&lt;br /&gt;
Po zakończeniu kalibracji pojawia się napis &amp;amp;bdquo;Trwają obliczenia&amp;amp;rdquo; lub podobny. Odczekujemy kilka minut, aż skończy się peer &amp;amp;bdquo;Calibration&amp;amp;rdquo; (widoczny w obci_gui) i zamykamy okienko klawiszami Alt-F4 lub zatrzymując scenariusz guzikiem &amp;amp;bdquo;Stop&amp;amp;rdquo;. W katalogu domowym pojawi się plik z wynikami kalibracji, co pozwala na uruchomienie scenariusza &amp;amp;bdquo;labirynt&amp;amp;rdquo;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Po zebraniu danych, przed wczytaniem ich do Svaroga należy w tym samym katalogu uruchomić skrypt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
#!/usr/bin/env python&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
&lt;br /&gt;
from obci.analysis.obci_signal_processing.tags import tags_file_writer&lt;br /&gt;
from obci.analysis.obci_signal_processing.read_manager import ReadManager&lt;br /&gt;
&lt;br /&gt;
def main(): &lt;br /&gt;
	file_name = 'test1'&lt;br /&gt;
	&lt;br /&gt;
	mgr = ReadManager(&lt;br /&gt;
		file_name + '.obci.xml',&lt;br /&gt;
		file_name + '.obci.raw',&lt;br /&gt;
		file_name + '.obci.tag')&lt;br /&gt;
	&lt;br /&gt;
	tags = mgr.get_tags()&lt;br /&gt;
	for i in xrange(0, len(tags)):&lt;br /&gt;
		if tags[i]['desc']['index'] == tags[i]['desc']['target']:&lt;br /&gt;
			tags[i]['name'] = 'blink_target'&lt;br /&gt;
		else:&lt;br /&gt;
			tags[i]['name'] = 'blink'&lt;br /&gt;
			&lt;br /&gt;
	tags_writer = tags_file_writer.TagsFileWriter(file_name + '.obci.tag')&lt;br /&gt;
	for tag in tags:&lt;br /&gt;
		tags_writer.tag_received(tag)		&lt;br /&gt;
	tags_writer.finish_saving(0)	&lt;br /&gt;
 &lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Aduszyk</name></author>
		
	</entry>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=Pracownia_EEG/Potencja%C5%82y_wywo%C5%82ane&amp;diff=8972</id>
		<title>Pracownia EEG/Potencjały wywołane</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=Pracownia_EEG/Potencja%C5%82y_wywo%C5%82ane&amp;diff=8972"/>
		<updated>2022-11-08T10:38:08Z</updated>

		<summary type="html">&lt;p&gt;Aduszyk: /* Wersja 1: obserwacja błyskającej diody */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Pracownia EEG|Pracownia EEG]] / Potencjały wywołane&lt;br /&gt;
&lt;br /&gt;
=Wstęp=&lt;br /&gt;
==Potencjały wywołane==&lt;br /&gt;
=== Wstęp ===&lt;br /&gt;
Potencjały wywołane EEG (ang. ''evoked potentials'', EP) są śladami odpowiedzi mózgu na bodźce. W przypadku MEG poprawnie mówi się o polach wywołanych (ang. ''evoked fields'', EF).&lt;br /&gt;
Zwykle reakcja ta jest mała (wyjątek stanowią [[Elektroencefalografia/Metody_analizy_sygnałów_EEG_-_analiza_w_dziedzinie_czasu |kompleksy K]]) i w zapisie pojedynczej realizacji reakcji na bodziec najczęściej niewidoczna wśród czynności pochodzącej od wielu innych procesów zachodzących w tym samym czasie w mózgu. &lt;br /&gt;
Ich wyodrębnienie z tak zwanego tła EEG/MEG, czyli manifestacji elektrycznej innych, trwających w tym samym czasie w mózgu procesów (aktywny prąd niezależny), wymaga w dniu dzisiejszym zapisu odpowiedzi na szereg powtórzeń tego samego bodźca (&amp;lt;xr id=&amp;quot;fig:EP&amp;quot;&amp;gt;rys. %i&amp;lt;/xr&amp;gt;). Pierwsze potencjały wywołane pokazał pod koniec lat 40-tych Dawson (Dawson 1947) wykonując superpozycję pojedynczych realizacji na kliszy fotograficznej.&lt;br /&gt;
Z czasem skomplikowane urządzenia analogowe zastąpione zostały przez cyfrowe uśrednianie kolejnych fragmentów EEG, zsynchronizowanych według momentu wystąpienia bodźca, łatwo realizowane za pomocą komputera.&lt;br /&gt;
&lt;br /&gt;
[[Grafika:EP.png|thumb|640px|center|&amp;lt;figure id=&amp;quot;fig:EP&amp;quot;&amp;gt;&amp;lt;/figure&amp;gt;&lt;br /&gt;
Uśrednianie potencjałów wywołanych. a) ciągły zapis EEG z wyróżnionymi momentami wystąpienia bodźca (w tym przypadku słuchowego) b) kilkadziesiąt kolejnych odcinków, wyciętych jako sekunda EEG od momentu wystąpienia kolejnych bodźców, ustawione jeden pod drugim c) uśredniony potencjał wywołany &amp;amp;mdash; widać m. in. załamek P300 ok. 300 milisekund po bodźcu]]&lt;br /&gt;
&lt;br /&gt;
Techniki te opierają się na założeniu, że zawarta w EEG odpowiedź mózgu na każdy z kolejnych bodźców jest niezmienna, a EEG odzwierciedlające pozostałe procesy traktowane jest jak nieskorelowany z nią proces stochastyczny. Zależnie od rodzaju potencjałów wywołanych, założenia te są mniej lub bardziej nieuzasadnione; podważa je choćby powszechnie znany efekt habituacji, polegający na osłabieniu późnych potencjałów wywołanych kolejnymi powtórzeniami bodźca.&lt;br /&gt;
&lt;br /&gt;
Istota potencjałów wywołanych jest przedmiotem otwartej dyskusji i dziesiątków prac, dotykających od lat podstawowych w tej dziedzinie pytań: czym jest potencjał wywołany, który widzimy w uśrednionym przebiegu? Czy naprawdę wynika z deterministycznie powtarzanej, jednakowej odpowiedzi pojawiającej się po każdym powtórzeniu bodźca niezależnie od &amp;amp;bdquo;tła&amp;amp;rdquo;, czy może wynika z reorganizacji faz tego właśnie &amp;amp;bdquo;tła&amp;amp;rdquo; EEG, czy może kombinacji tych dwóch efektów? Jest to wspaniałe pole dla zastosowań zaawansowanych metod modelowania i analizy sygnałów. W ostatnich latach powstają dziesiątki prac na ten temat, a od czasu do czasu również krytyczne artykuły wykazujące, że dotychczasowe odkrycia są raczej artefaktami stosowanych metod a nie wynikają z własności analizowanych danych (Yeung et al., 2004). Jak widać jest tu wciąż bardzo wiele do zrobienia, gdyż zrozumienie tego mechanizmu stoi na drodze do &amp;amp;bdquo;świętego Graala&amp;amp;rdquo;, którym w tej dziedzinie jest wyodrębnienie pojedynczych potencjałów wywołanych.&lt;br /&gt;
&lt;br /&gt;
Niezależnie od tego, w neurofizjologii klinicznej nazwą potencjał wywołany określa się krzywą widoczną po uśrednieniu odpowiedzi na kilkanaście do kilku tysięcy bodźców (Szelenberger 2000). Gromadzona od dziesięcioleci wiedza o behawioralnych i klinicznych korelatach potencjałów wywołanych opiera się na rozpoznawaniu w przebiegach uśrednionych tak zwanych załamków, czyli przejściowych wzrostów lub spadków potencjału (na przykład na &amp;lt;xr id=&amp;quot;fig:EP&amp;quot;&amp;gt;rys. %i&amp;lt;/xr&amp;gt; widać załamek P300). Nazwy załamków składają się zwykle z litery &amp;amp;bdquo;P&amp;amp;rdquo; (od ang. ''positive''), jeśli wychylenie jest dodatnie, lub &amp;amp;bdquo;N&amp;amp;rdquo; (od ang. ''negative''), jeśli wychylenie jest ujemne, oraz liczby. Uwaga: &lt;br /&gt;
* Nie ma niestety jednej ustalonej konwencji prezentacji potencjałów koniecznie trzeba więc zwracać uwagę na orientację wykresu, a wykonując wykres samemu - zamieszczać informację o orientacji kierunku dodatniego,gdyż kierunek dodatni może być wykresie skierowany do góry lub do dołu. &lt;br /&gt;
* Liczba następująca po N lub P określa przybliżoną liczbę milisekund od wystąpienia bodźca, czyli tak zwaną latencję. Nie można jednak ścisłego związku między tą liczbą a liczbą milisekund np. potencjał P300 w zależności od szczegółów paradygmatu doświadczalnego może wystąpić znacznie później. np. w eksperymentach językowych zdarza się że P300 występuje później niż N400 :-).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;xr id=&amp;quot;fig:zalamki&amp;quot;&amp;gt;Rys. %i&amp;lt;/xr&amp;gt; przedstawia schematycznie najważniejsze załamki rozpoznawane w potencjałach słuchowych, czyli wywoływanych bodźcem dźwiękowym. Dla potencjałów wzrokowych i somatosensorycznych istnieją podobne klasyfikacje.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Grafika:Zalamki.png|thumb|320px|right|&amp;lt;figure id=&amp;quot;fig:zalamki&amp;quot;&amp;gt;&amp;lt;/figure&amp;gt;&lt;br /&gt;
Orientacyjny schemat załamków rozpoznawanych w słuchowych potencjach wywołanych, na podstawie (Szelenberger 2000). Skala czasu logarytmiczna. Najszybsze (do 12 ms) składowe egzogenne to potencjały pniowe (BAEP), oznaczane jako fale I-VII. Litery &amp;amp;bdquo;P&amp;amp;rdquo; i &amp;amp;bdquo;N&amp;amp;rdquo; oznaczają dodatnie i ujemne wychylenia związane z dalszymi załamkami]]&lt;br /&gt;
&lt;br /&gt;
Najszybsze (czyli o najmniejszej latencji) składowe to potencjały egzogenne, odzwierciedlające wstępne fazy przekazu informacji. W potencjałach słuchowych są to potencjały pnia (ang. ''brainstem auditory evoked potentials'', BAEP), składające się z siedmiu fal występujących pomiędzy 1 a 12 ms od bodźca. Są one generowane np. w nerwie słuchowym czy pniu mózgu, i wykorzystywane w klinicznej diagnostyce integralności dróg słuchowych. Podobnie jak inne wczesne potencjały o latencjach poniżej 100 ms, są praktycznie niezależne od stanu uwagi.&lt;br /&gt;
&lt;br /&gt;
Po potencjałach o średniej latencji (między 12 a 50 ms) zaczynają się późne potencjały słuchowe (od 100 ms od podania bodźca), odzwierciedlające bardziej złożone reakcje na bodziec. Potencjały ok. 100 ms obserwowane w okolicach sensorycznych odzwierciedlają odpowiedź tejże kory na bodziec. Ich amplituda zależy od parametrów fizycznych bodźca oraz od uwagi, np. amplituda załamka N100 wzrasta w stanie skupienia uwagi czy pobudzenia emocjonalnego. Pierwszy i najpopularniejszy całkowicie endogenny załamek to P300, pojawiający się po rozpoznaniu bodźca oczekiwanego, na którym skupiamy uwagę: na przykład, jeśli w serii pojawiających się losowo liter mamy zliczać wystąpienia jednej z nich, to na średniej odpowiedzi na pojawienie się tej litery pojawi się załamek P300. Załamek ten występuje również w odpowiedzi na bodźce wyczekiwane, niespodziewane i ważne dla osoby (np. własne imię). &lt;br /&gt;
&lt;br /&gt;
=== Uśrednianie w dziedzinie czasu ===&lt;br /&gt;
Jak już było wspomniane powyżej podstawową techniką stosowaną do analizy potencjałów wywołanych jest uśrednianie wielu realizacji odpowiedzi na bodziec wyrównanych względem jakiegoś charakterystycznego zdarzenia, np. momentu podania bodźca albo momentu behawioralnej reakcji na bodziec (np. wciśnięcie przycisku). Podejście to bazuje na trzech założeniach:&lt;br /&gt;
* Reakcja jest czasowo związana z bodźcem. Tzn. w kolejnych realizacjach występuje ona zawsze z tym samym opóźnieniem.&lt;br /&gt;
* Reakcja na bodziec skutkuje zawsze pojawieniem się w sygnale składowej o stałym kształcie (mówimy o stałej morfologii).&lt;br /&gt;
* Spontaniczna czynność EEG &amp;amp;mdash; ta która nie dotyczy przetwarzania interesującego nas bodźca &amp;amp;mdash; jest niezależnym, stacjonarnym szumem o średniej zero.&lt;br /&gt;
&lt;br /&gt;
Zgodnie z powyższymi założeniami mierzony w ''i''-tej realizacji sygnał można wyrazić jako:&lt;br /&gt;
: &amp;lt;math&amp;gt;x_i(t) = s(t) + n_i(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
Uśrednianie po ''N'' realizacjach daje:&lt;br /&gt;
: &amp;lt;math&amp;gt;\bar x (t) = \frac{1}{N} \sum_{i=1}^N x_i(t) = \frac{1}{N} \left(N s(t) + \sum_{i=1}^N n_i(t) \right) &amp;lt;/math&amp;gt;&lt;br /&gt;
Wartość oczekiwana średniego sygnału wynosi:&lt;br /&gt;
: &amp;lt;math&amp;gt;\mathrm{E}\left[ \bar x(t) \right] = s(t) &amp;lt;/math&amp;gt;&lt;br /&gt;
gdyż dla szumu o średniej zero mamy:&lt;br /&gt;
: &amp;lt;math&amp;gt;\mathrm{E}\left[\frac{1}{N} \sum_{i=1}^N n_i(t)\right] = 0&amp;lt;/math&amp;gt;.&lt;br /&gt;
Wariancja &amp;lt;math&amp;gt;\bar x(t)&amp;lt;/math&amp;gt; wynosi:&lt;br /&gt;
: &amp;lt;math&amp;gt;\sigma^2_{\bar x(t)} = \mathrm{E} \left[  \left( \frac{1}{N} \sum_{i=1}^N n_i(t)\right)^2 \right] \approx \frac{1}{N} \sigma^2_{n(t)}&amp;lt;/math&amp;gt;&lt;br /&gt;
gdyż &amp;lt;math&amp;gt;s(t)&amp;lt;/math&amp;gt; jest deterministyczne. &lt;br /&gt;
&lt;br /&gt;
Dla potencjałów pojawiających się w pierwszych kilkudziesięciu milisekundach po bodźcu model ten można uznać za poprawny, gdyż wykazują one zależność głównie od parametrów fizycznych bodźca. Dla późniejszych składowych staje się on coraz bardziej wątpliwy ze względu na występujące korelacje ze stanem (np. uwagi) badanego.&lt;br /&gt;
&lt;br /&gt;
Dla późniejszych składowych można by postulować bardziej ogólną wersję modelu potencjału wywołanego:&lt;br /&gt;
: &amp;lt;math&amp;gt;x_i(t) = s_i(t) + n_i(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
Ten model uwidacznia, że do opisu potencjału wywołanego potrzebna jest nie tylko średnia, ale i wyższe momenty rozkładu (np. drugi moment centralny czyli wariancja).&lt;br /&gt;
&lt;br /&gt;
====Wariancja w przypadku szumu skorelowanego ====&lt;br /&gt;
W poprzednim paragrafie pokazaliśmy, że w przypadku niezależnego szumu wariancja uśrednionego sygnału (w danej chwili czasu) maleje jak  &amp;lt;math&amp;gt;\frac{1}{N}&amp;lt;/math&amp;gt;. Jednak w przypadku gdy kolejne próbki szumu są skorelowane (np. występuje silna aktywność rytmiczna alfa) sytuacja się komplikuje. Intuicyjnie łatwo możemy to sobie wyobrazić w granicznym przypadku. Załóżmy, że tło dla  potencjałów o stałej morfologii   stanowi sinusoida. Jeśli będziemy podawać bodźce w odstępach będących wielokrotnością okresu tej sinusoidy to w uśrednianych fragmentach sygnału owa sinusoida jest tak samo powtarzalna jak badany potencjał i uśrednianie nie prowadzi do poprawy stosunku amplitudy sygnału do amplitudy tła. &lt;br /&gt;
&lt;br /&gt;
Stopień zależności pomiędzy próbkami można zmierzyć przy pomocy funkcji autokorelacji. &lt;br /&gt;
Jeśli funkcję autokorelacji przybliżymy przez:&lt;br /&gt;
: &amp;lt;math&amp;gt;R_{xx}(\tau) = \sigma^2 \exp(-\beta |\tau|) \cos(2 \pi f_0 \tau)&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\sigma^2&amp;lt;/math&amp;gt; jest wariancją szumu, &amp;lt;math&amp;gt;f_0&amp;lt;/math&amp;gt; jest średnią częstością aktywności rytmicznej, &amp;lt;math&amp;gt;\beta/ \pi&amp;lt;/math&amp;gt; jest szerokością pasma tej czynności, zaś &amp;lt;math&amp;gt;\tau&amp;lt;/math&amp;gt; opóźnieniem, to wariancję potencjału wywołanego można wyrazić jako&amp;lt;!-- \cite{Spekreijse_1976}--&amp;gt;:&lt;br /&gt;
: &amp;lt;math&amp;gt;\sigma^2_{\bar x(t)} = \frac{\sigma^2}{N} \left[ \frac{1-\exp(-2 \beta T)}{1 - 2 \exp(- \beta T) \cos(2 \pi f_0 T) +\exp(-2 \beta T)} \right]&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; jest odstępem między bodźcami. &lt;br /&gt;
Widać stąd, że obecność czynności rytmicznej w tle wpływa na stosunek sygnału do szumu. Z powyższego równania widać, że stosunek wariancji dąży do &amp;lt;math&amp;gt;\frac{\sigma^2}{N}&amp;lt;/math&amp;gt; gdy &amp;lt;math&amp;gt;\beta T&amp;lt;/math&amp;gt; staje się duże.  &lt;br /&gt;
&lt;br /&gt;
Periodyczna stymulacja może ponadto prowadzić do wzbudzenia czynności rytmicznej o częstości równej częstości pobudzania bądź jej harmonicznej.&lt;br /&gt;
&lt;br /&gt;
===Wariancja latencji===&lt;br /&gt;
&lt;br /&gt;
Jedną z form zmienności potencjału wywołanego w pojedynczych realizacjach jest wariancja latencji. &lt;br /&gt;
[[Grafika:Wariancja_latencji.png|thumb|500px|right|&lt;br /&gt;
Czerwona linia: Uśrednianie 100 potencjałów wywołanych o latncjach z rozkładu normalnego N(300,30 ), Niebieskie linie: przykładowe pojedyncze realizacje wzięte do średniej]]&amp;lt;!--# -*- coding: utf-8 -*-&lt;br /&gt;
from __future__ import division&lt;br /&gt;
import numpy as np&lt;br /&gt;
from matplotlib.pyplot import plot, show ,subplot, figure, title, xlabel, ylabel, ylim&lt;br /&gt;
 &lt;br /&gt;
def fun(t,lat=100):&lt;br /&gt;
    return np.exp(-(t-lat)**2/(2*30**2))&lt;br /&gt;
Fs = 1&lt;br /&gt;
N = 100&lt;br /&gt;
t = np.arange(0,700)&lt;br /&gt;
f = np.zeros((N,700))&lt;br /&gt;
f_sr = np.zeros(t.shape)&lt;br /&gt;
for i in range(N):&lt;br /&gt;
    f[i,:] = fun(t,lat = 300 + 30* np.random.randn())&lt;br /&gt;
for i in range(3):&lt;br /&gt;
    plot(t,f[i,:], 'b')&lt;br /&gt;
plot(t,f.mean(0),'r')&lt;br /&gt;
show()--&amp;gt;&lt;br /&gt;
Zmienność latencji prowadzi do:&lt;br /&gt;
* zmniejszenia amplitudy &amp;lt;math&amp;gt;\bar x&amp;lt;/math&amp;gt;&lt;br /&gt;
* wzrostu rozciągłości czasowej załamka&lt;br /&gt;
&lt;br /&gt;
O tych konsekwencjach zmienności latencji należy w szczególności pamiętać porównując średnie potencjały uzyskane w różnych warunkach eksperymentalnych. Gdy zauważymy, że średnie potencjały różnią się amplitudą należy rozważyć możliwość, że w istocie warunki eksperymentalne wpływają na różnice w wariancji latencji. &lt;br /&gt;
&lt;br /&gt;
Naturalne jest, że zmienność latencji jest bardziej widoczna w przypadku załamków trwających krótko niż w przypadku załamków trwających długo. Wariancja latencji rożnie wraz z jej wartością, stąd wśród późnych składowych potencjałów wywołanych nie obserwuje się komponentów krótkotrwałych.&lt;br /&gt;
&amp;lt;!--====Uśrednianie metodą Woody'ego ====&lt;br /&gt;
&lt;br /&gt;
Model potencjału ze zmienną latencją i sposób na jego efektywniejsze uśrednianie zaproponował Woody (1967). Model ten zakłada, że w każdej realizacji występuje komponent addytywny &amp;lt;math&amp;gt;s_i(t)\;&amp;lt;/math&amp;gt;, który co do kształtu jest stały, a pomiędzy realizacjami różni się tylko latencją:&lt;br /&gt;
: &amp;lt;math&amp;gt; s_i(t) = s(t +\Delta t_i)\;&amp;lt;/math&amp;gt;&lt;br /&gt;
Woody zaproponował aby &amp;lt;math&amp;gt;\Delta t_i\;&amp;lt;/math&amp;gt; szacować na podstawie maksimum funkcji korelacji wzajemnej pomiędzy ''i''-tą realizacją a wzorcem. W pierwszym kroku wzorcem jest średni potencjał uzyskany przez proste uśrednienie realizacji.  Następnie w sposób iteracyjny dokonuje się:&lt;br /&gt;
* poprawek w wyrównaniu poszczególnych realizacji,&lt;br /&gt;
* obliczenia nowego wzorca poprzez uśrednienie realizacji po korekcie wyrównania,&lt;br /&gt;
* obliczenia nowych poprawek do wyrównania realizacji.--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Habituacja ===&lt;br /&gt;
Zmienność w odpowiedziach na kolejno występujące po sobie bodźce można podzielić na komponent stochastyczny i deterministyczny. Komponent deterministyczny odzwierciedla zmianę czułości  układu nerwowego  na kolejne bodźce. Nowy bodziec często wywołuje reakcje pobudzenia widoczną w wielu parametrach takich jak przewodnictwo skóry, rytm serca i reaktywność kory mózgowej. Powszechnie obserwowanym zjawiskiem jest spadek reaktywności na powtarzające się bodźce zwany habituacją. Niekiedy obserwuje się także zjawisko przeciwne &amp;amp;mdash; wzrost reaktywności na bodziec &amp;amp;mdash; zwane sensytyzacją. &lt;br /&gt;
&lt;br /&gt;
Klasycznym sposobem na badanie tych zjawisk w potencjałach wywołanych jest uśrednianie w podzbiorach lub  uśrednianie blokowe. Wymaga ono  zmiany paradygmatu rejestracji danych. Załóżmy, że interesującym nas bodźcem jest błysk światła. Chcemy zaobserwować ewentualne zmiany amplitudy i latencji w ciągu 100 potencjałów będących reakcją na błysk powtarzający się co 500 ms.&lt;br /&gt;
====Uśrednianie w podzbiorach ====&lt;br /&gt;
W metodzie tej musimy założyć, że proces habituacji jest powolny, tzn. zmiany pomiędzy kolejnymi reakcjami są bardzo małe. W takim przypadku możemy podzielić długą serię bodźców na ciąg pod-serii i uśrednienie przeprowadzić dla każdej pod-serii osobno.&lt;br /&gt;
[[Plik:Usrednianie_podzbiory.svg‎|640px|thumb|center|Ilustracja uśredniania w podzbiorach]]&lt;br /&gt;
&lt;br /&gt;
====Uśrednianie blokowe====&lt;br /&gt;
W tym celu eksperyment wykonujemy w wielu seriach. Jedna seria składa się ze 100 błysków powtarzanych co 500 ms.  Po serii następuje przerwa trwająca np. 5 s (długość przerwy wyraża nasze oszacowanie czasu potrzebnego na zanik habituacji). Po przerwie seria jest powtarzana. Powtórzeń serii wykonujemy ''N''.&lt;br /&gt;
Następnie uśredniamy fragmenty sygnałów odpowiadające sobie w kolejnych seriach. &lt;br /&gt;
&lt;br /&gt;
W tym paradygmacie zakładamy, że każda seria rejestrowana jest w tych samych warunkach. Zaniedbujemy efekty związane ze zmęczeniem i zmianami w np. stopniu koncentracji badanego.&lt;br /&gt;
[[Plik:Usrednianie blokowe.svg|Usrednianie blokowe.svg|640px|thumb|center|Ilustracja uśredniania w blokach]]&lt;br /&gt;
&lt;br /&gt;
===Załamki w krzywej potencjału wywołanego vs ukryte komponenty===&lt;br /&gt;
Komponenta potencjału wywołanego to bardzo ważne ale jednocześnie źle określone pojęcie. Krzywa otrzymana w wyniku uśredniania potencjałów wywołanych przedstawia serię załamków dodatnich i ujemnych, ale trzeba być świadomym, że ten przebieg napięcia rejestrowany przez elektrody przedstawia tak naprawdę sumę potencjałów pochodzących od wielu dość niezależnie działających źródeł w mózgu. Przyczynek pochodzący od jednego funkcjonalnego źródła będziemy określać jako komponentę. &lt;br /&gt;
&lt;br /&gt;
Komentarza wymaga też pojęcie źródła funkcjonalnego. Czynność elektryczną synchronicznie działających neuronów piramidalnych w określonym fragmencie kory mózgowej z pewnej odległości można przybliżyć potencjałem dipola prądowego. Taki aktywny fragment kory stanowi źródło dające przyczynek do mierzonego na powierzchni głowy potencjału. W najprostszej sytuacji taki przyczynek może być obserwowany jako komponenta. Mózg jest jednak obiektem niezwykle złożonym i gęsto połączonym. Wiele obszarów korowych może być funkcjonalnie połączonych i aktywowanych synchronicznie w celu realizacji określonego zadania &amp;amp;mdash; o takim funkcjonalnym zespole też możemy myśleć jako o pojedynczym źródle, choć może ono mieć złożoną strukturę przestrzenną. Często zatem myślimy o komponentach ukrytych potencjału wywołanego jako o aktywności takich funkcjonalnych zespołów. &lt;br /&gt;
&lt;br /&gt;
Po tym wstępie widać już chyba, że do zrozumienia co dzieje się w czasie reakcji na bodziec, którą obserwujemy w potencjale wywołanym, bardziej pożądane byłoby badanie komponent ukrytych niż poszczególnych załamków krzywej potencjału wywołanego, która stanowi ważoną sumę owych komponentów. Zanim przejdziemy do omówienia technik służących &amp;amp;bdquo;wyłuskiwaniu&amp;amp;rdquo; komponent prześledźmy kilka symulacji i wnioski z nich płynące.&lt;br /&gt;
&lt;br /&gt;
==== Załamki i komponenty nie są tym samym.====&lt;br /&gt;
Tę samą krzywą można otrzymać na nieskończenie wiele sposobów  przez sumowanie rożnych kombinacji domniemanych komponentów. Przykładowy rysunek pokazuje, jak tę samą krzywą można złożyć z dwóch rożnych zestawów komponentów (kod wytwarzający przykładową symulację pokazany jest poniżej).&lt;br /&gt;
[[Plik:Sumowanie_komponentow1.png|center|thumb|600px| Panel a) przedstawia hipotetyczną krzywą ERP, panel b) jedna z możliwych dekompozycji sygnału w panelu a), panel c) inna możliwa dekompozycja sygnału z panelu a) ]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
from __future__ import division&lt;br /&gt;
import numpy as np&lt;br /&gt;
from matplotlib.pyplot import plot, show ,subplot, figure, title, xlabel, ylabel, ylim&lt;br /&gt;
&lt;br /&gt;
Fs = 1&lt;br /&gt;
t = np.arange(0,700)&lt;br /&gt;
&lt;br /&gt;
C1 = np.exp(-(t-100)**2/(2*30**2))&lt;br /&gt;
C2 = np.exp(-(t-200)**2/(2*50**2))&lt;br /&gt;
C3 = np.exp(-(t-350)**2/(2*100**2))&lt;br /&gt;
ERP = 0.5*C1-C2+C3&lt;br /&gt;
&lt;br /&gt;
C2p = np.concatenate((C2[0:200], np.ones(30), C2[200:700-30] ))&lt;br /&gt;
C3p = ERP - 0.5*C1 + C2p&lt;br /&gt;
ERP_v2 = 0.5*C1-C2p+C3p&lt;br /&gt;
&lt;br /&gt;
subplot(3,1,1)&lt;br /&gt;
plot(t,ERP, t[::10],ERP_v2[::10],'g.')&lt;br /&gt;
ylabel('a)',rotation='horizontal')&lt;br /&gt;
ylim([-1, 1.5])&lt;br /&gt;
&lt;br /&gt;
subplot(3,1,2)&lt;br /&gt;
plot(t,0.5*C1,t,-C2,t,C3)&lt;br /&gt;
ylabel('b)',rotation='horizontal')&lt;br /&gt;
ylim([-1, 1.5])&lt;br /&gt;
&lt;br /&gt;
subplot(3,1,3)&lt;br /&gt;
plot(t,0.5*C1,t,-C2p,t,C3p)&lt;br /&gt;
ylabel('c)',rotation='horizontal')&lt;br /&gt;
ylim([-1, 1.5])&lt;br /&gt;
&lt;br /&gt;
show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Zmiana jednej komponenty może powodować zmiany w amplitudzie i latencji więcej niż jednego załamka.====&lt;br /&gt;
Poniższy rysunek przedstawia sytuację gdy zmiana amplitudy jednego komponentu może znacząco wpływać na amplitudę i latencję innych załamków.&lt;br /&gt;
&lt;br /&gt;
[[Plik:Sumowanie_komponentow2.png|center|thumb|768px| Panel a) przedstawia dwie hipotetyczne krzywe ERP, panel b) panel b i c komponenty z których powstały owe krzywe. Zmiana amplitudy komponentu oznaczonego kolorem powoduje zmianę amplitudy oznaczonych załamków ale także zmianę latencji wcześniejszego załamka. ]]&lt;br /&gt;
Poniżej kod odtwarzający powyższy przykład:&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
from __future__ import division&lt;br /&gt;
import numpy as np&lt;br /&gt;
from matplotlib.pyplot import plot, show, subplot, figure, title, xlabel, ylabel, ylim&lt;br /&gt;
&lt;br /&gt;
Fs = 1&lt;br /&gt;
t = np.arange(0,700)&lt;br /&gt;
&lt;br /&gt;
C1 = np.exp(-(t-100)**2/(2*30**2))&lt;br /&gt;
C2 = np.exp(-(t-200)**2/(2*50**2))&lt;br /&gt;
C3 = np.exp(-(t-350)**2/(2*100**2))&lt;br /&gt;
ERP1 = 0.5*C1-C2+C3&lt;br /&gt;
ERP2 = 0.5*C1-C2+1.5*C3&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
subplot(3,1,1)&lt;br /&gt;
plot(t,ERP1,'b', t,ERP2,'g')&lt;br /&gt;
plot(t[np.argmin(ERP1)],np.min(ERP1),'r.' )&lt;br /&gt;
plot(t[np.argmax(ERP1)],np.max(ERP1),'m.' )&lt;br /&gt;
plot(t[np.argmin(ERP2)],np.min(ERP2),'r.' )&lt;br /&gt;
plot(t[np.argmax(ERP2)],np.max(ERP2),'m.' )&lt;br /&gt;
&lt;br /&gt;
ylabel('a)',rotation='horizontal')&lt;br /&gt;
ylim([-1, 1.6])&lt;br /&gt;
&lt;br /&gt;
subplot(3,1,2)&lt;br /&gt;
plot(t,0.5*C1,'k',t,-C2,'k',t,C3,'b')&lt;br /&gt;
ylabel('b)',rotation='horizontal')&lt;br /&gt;
ylim([-1, 1.6])&lt;br /&gt;
&lt;br /&gt;
subplot(3,1,3)&lt;br /&gt;
plot(t,0.5*C1,'k',t,-C2,'k',t,1.5*C3,'g')&lt;br /&gt;
ylabel('c)',rotation='horizontal')&lt;br /&gt;
ylim([-1, 1.6])&lt;br /&gt;
&lt;br /&gt;
show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Instrukcje do ćwiczeń =&lt;br /&gt;
&lt;br /&gt;
==Zadanie 1: uśrednianie symulowanych sygnałów==&lt;br /&gt;
w tym ćwiczeniu chcemy pokazać efekty:&lt;br /&gt;
# uśredniania sygnałów związanych fazowo z bodźcem i nieskorelowanych z bodźcem / wpływ liczby realizacji,&lt;br /&gt;
# uśredniania sygnałów z fluktuacją latencji,&lt;br /&gt;
# wpływ filtrów o różnych funkcjach odpowiedzi impulsowej na morfologię uśrednionego potencjału.&lt;br /&gt;
&lt;br /&gt;
===Sygnały testowe===&lt;br /&gt;
Proszę zaimplementować funkcje generujące następujące przebiegi czasowe (oznaczenia: ''F&amp;lt;sub&amp;gt;s&amp;lt;/sub&amp;gt;'' &amp;amp;mdash; częstość próbkowania, ''T'' &amp;amp;mdash; czas trwania w sekundach, [[%C4%86wiczenia_1#Sygna.C5.82y_testowe|analogicznie do tego]]):&lt;br /&gt;
* sinusoida o zadanej częstości ''f'' i fazie &amp;lt;math&amp;gt;\phi&amp;lt;/math&amp;gt;: &amp;lt;tt&amp;gt;y = sin(f, phi, Fs, T)&amp;lt;/tt&amp;gt;,&lt;br /&gt;
* funkcja Gaussa o zadanym położeniu i szerokości &amp;lt;tt&amp;gt;y = g_1(t0, sigma, Fs, T) &amp;lt;/tt&amp;gt;&lt;br /&gt;
: &amp;lt;math&amp;gt;g_1(t) = \exp\left(-\frac{(t-t_0)^2}{2 \sigma^2}\right)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* pochodną funkcji Gaussa o zadanym położeniu i szerokości &amp;lt;tt&amp;gt;y = g_2(t0, sigma, Fs, T)&amp;lt;/tt&amp;gt;,&lt;br /&gt;
* połowę funkcji Gaussa o zadanym położeniu i szerokości &amp;lt;tt&amp;gt;y = g_3(t0, sigma, Fs, T)&amp;lt;/tt&amp;gt;,&lt;br /&gt;
: &amp;lt;math&amp;gt;g_{3}(t) = \left\{ &lt;br /&gt;
\begin{array}{lll}&lt;br /&gt;
0 &amp;amp; \mathrm{dla}&amp;amp; t&amp;lt;t_0 \\&lt;br /&gt;
\exp\left(-\frac{(t-t_0)^2}{2 \sigma^2}\right)&amp;amp; \mathrm{dla}&amp;amp; t \ge t_0  &lt;br /&gt;
\end{array}&lt;br /&gt;
\right. &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
W dalszych zadaniach tej sekcji przyjmiemy:&lt;br /&gt;
* ''T'' = 1 s,&lt;br /&gt;
* ''F&amp;lt;sub&amp;gt;s&amp;lt;/sub&amp;gt;'' = 128 Hz,&lt;br /&gt;
* ''t''&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; = 0,3 s,&lt;br /&gt;
* &amp;amp;sigma; = 0,02 s.&lt;br /&gt;
&lt;br /&gt;
===Uśrednianie w modelu addytywnym: sygnał + szum===&lt;br /&gt;
Dla funkcji &amp;lt;math&amp;gt;g_1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;g_2&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;g_3&amp;lt;/math&amp;gt;  wykonaj ''N'' symulacji sygnału opisanego daną funkcją z dodanym szumem gaussowskim (&amp;lt;tt&amp;gt;numpy.random.randn&amp;lt;/tt&amp;gt;). Zaobserwuj zmianę wariancji uśrednianego sygnału wraz z ''N''.&lt;br /&gt;
&lt;br /&gt;
===Uśrednianie w modelu addytywnym: sygnał + szum + niezależna czynność rytmiczna===&lt;br /&gt;
Powtórz poprzednie symulacje dokładając w każdej realizacji sinusoidę o losowo wybranej fazie. Symulacje wykonaj dla różnych częstości sinusoidy, takich których połówka okresu zbliżona jest do szerokości funkcji Gaussa, oraz znacząco od niej różnych.&lt;br /&gt;
&lt;br /&gt;
===Uśrednianie w modelu z resetem fazy===&lt;br /&gt;
Zbuduj sygnał składający się z dwóch fragmentów sinusoidy o częstości ''f'': &lt;br /&gt;
* pierwszy fragment ma losową fazę,&lt;br /&gt;
* drugi fragment ma fazę równą 0.&lt;br /&gt;
Wykonaj ''N'' realizacji takiego sygnału, przy czym każda realizacja ma częstość losowaną z rozkładu Gaussa o średniej 10 i pewnej wariancji (czyli &amp;lt;math&amp;gt;f \in \mathrm{N}(10,\sigma)&amp;lt;/math&amp;gt;). &lt;br /&gt;
Uśrednij otrzymane realizacje. Zaobserwuj zależność średniej od liczby uśrednianych realizacji i od wariancji częstości.&lt;br /&gt;
&lt;br /&gt;
===Uśrednianie potencjału z fluktuacją latencji===&lt;br /&gt;
Wygeneruj sygnały składające się z funkcji &amp;lt;math&amp;gt;g_1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;g_2&amp;lt;/math&amp;gt; albo &amp;lt;math&amp;gt;g_3&amp;lt;/math&amp;gt; z fluktuującą latencją, tzn. z wartością &amp;lt;math&amp;gt;t_0&amp;lt;/math&amp;gt; pochodzącą z jakiegoś rozkładu prawdopodobieństwa. U nas dla ustalenia uwagi niech będzie to rozkład Gaussa. Wykonaj zestaw symulacji obrazujący zależność od liczby realizacji i od wielkości fluktuacji, mierzonej przez wariancję rozkładu. Czy jest związek pomiędzy wariancją fluktuacji &amp;lt;math&amp;gt;t_0&amp;lt;/math&amp;gt; a szerokością załamków?&lt;br /&gt;
&lt;br /&gt;
===Wpływ filtrów===&lt;br /&gt;
# Zaprojektuj następujące filtry (przyjmij częstość próbkowania 128 Hz):&lt;br /&gt;
#* dolnoprzepustowy: Butterwortha z częstością odcięcia: 30, 40, 50 Hz, i rzędach od 1 do 5 (funkcja butter w module scipy.signal),&lt;br /&gt;
#* górnoprzepustowy: Butterwortha z częstością odcięcia: 0,1, 0,5, 2 i 5 Hz, i rzędach od 1 do 5,&lt;br /&gt;
#* notch: Czybyszewa II rodzaju z pasmem zaporowym ustawionym na 50 Hz, i rzędach od 1 do 3 (funkcja cheby2),&lt;br /&gt;
# Zbadaj funkcję odpowiedzi impulsowej i funkcję przenoszenia tych filtrów (w skali dB). Zaobserwuj jak długa jest odpowiedź impulsowa i jak daleko od częstości odcięcia zaburzone jest pasmo przenoszenia.&lt;br /&gt;
# Zastosuj powyższe filtry do funkcji &amp;lt;math&amp;gt;g_1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;g_2&amp;lt;/math&amp;gt; albo &amp;lt;math&amp;gt;g_3&amp;lt;/math&amp;gt;. Filtrowanie przeprowadź w jedną (lfilter) oraz w dwie strony (filtfilt). Zaobserwuj związek między zniekształceniem wprowadzanym przez filtr a funkcją odpowiedzi impulsowej filtru.&lt;br /&gt;
# W ćwiczeniu tym posłuż się symulowanymi sygnałami uzyskanymi z modelu addytywnego: &amp;amp;bdquo;sygnał+szum&amp;amp;rdquo;. Dla funkcji &amp;lt;math&amp;gt;g_1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;g_2&amp;lt;/math&amp;gt; albo &amp;lt;math&amp;gt;g_3&amp;lt;/math&amp;gt;  wykonaj ''N'' = 60 realizacji sygnału opisanego daną funkcją z dodanym szumem gaussowskim (&amp;lt;tt&amp;gt;numpy.random.randn&amp;lt;/tt&amp;gt;). Każdą z realizacji przefiltruj, a następnie uśrednij uzyskane sygnały.&lt;br /&gt;
&lt;br /&gt;
==Zadanie 2: rejestracje i analiza potencjałów wzrokowych==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;! -- ===Synchronizacja występowania bodźców z sygnałem EEG===&lt;br /&gt;
&lt;br /&gt;
Rejestracja potencjałów wywołanych jest przykładem pomiaru czynności elektrycznej mózgu w odpowiedzi na określony bodziec. W przypadku tego rodzaju pomiarów konieczna jest synchronizacja momentu wystąpienia bodźca z sygnałem EEG. Wzmacniacze do pomiaru czynności elektrycznej mózgu wyposażone są w specjalne wejścia, na które można podawać sygnał odpowiadający pojawianiu się bodźca. Jak pamiętamy z zeszłego semestru, wejście to (jak i podawany na nie sygnał) nazywamy trigerem (ang. ''trigger'' &amp;amp;mdash; spust, cyngiel, wyzwalacz). W najprostszym przypadku, bodziec moglibyśmy wyświetlać na monitorze komputerowym, a sygnał związany z jego wystąpieniem wysyłać przez któryś z portów komputera (LPT, COM) na wzmacniacz EEG. Niestety, obecnie dostępne i popularne systemy operacyjne, takie jak Windows czy Linux nie są systemami czasu rzeczywistego (http://pl.wikipedia.org/wiki/System_operacyjny_czasu_rzeczywistego). Od momentu wyświetlania bodźca na ekranie, do pojawiania się sygnału odpowiednim porcie komputerowym może upłynąć kilkadziesiąt milisekund i co gorsza czas ten zwykle jest losowy. W przypadku gdy wzmacniacz próbkuje sygnał z częstością 1000 Hz, moment wystąpienia bodźca możemy określić z dokładnością 1 ms, jednakże wspomniane opóźnienia w systemie operacyjnym uniemożliwiają to. Ponadto, jak dowiedzieliśmy się w rozdziale wstępnym [http://brain.fuw.edu.pl/edu-wiki/action/edit/EEG:Potencja%C5%82y_wywo%C5%82ane?section=T-1], pierwsze załamki związane z potencjałami wywołanymi pojawiają się już 10 ms po wystąpieniu bodźca. W związku z tym, losowe, rzędu kilkudziesięciu milisekund opóźnienia sygnału określającego moment pojawienia się bodźca względem jego rzeczywistego wystąpienia są niedopuszczalne.&lt;br /&gt;
Istnieją pewne techniki programowania, dzięki którym opisywane opóźnienia można zmniejszyć, jednakże są one bardzo trudne  do realizacji. Ponadto, standardowe porty komputera, takie jak LPT, czy COM zostały zaprojektowane przede wszystkim do sterowania urządzeniami zewnętrznymi, a nie ich zasilania. Przykładowo, jedna linia portu drukarkowego (LPT) może być obciążona prądem nie większym niż 5 mA, podczas gdy do zapalenie zwykłej diody LED potrzeba około 10 mA. Taki pobór prądu możliwy jest do uzyskania z portu USB, jednakże  jest on  wyjątkowo trudny do oprogramowania.  &lt;br /&gt;
W celu ominięcia powyższych niedogodności w Zakładzie Fizyki Biomedycznej UW w przeprowadzanych eksperymentach wykorzystywane są  mikrokontrolery [http://pl.wikipedia.org/wiki/Mikrokontroler], w szczególności ATmega16 i ATmega32.  Mikrokontrolery te wyposażone są w procesory o architekturze RISC [http://pl.wikipedia.org/wiki/RISC] i mocy obliczeniowej porównywalnej z szeroko stosowanym kiedyś w komputerach ZX Spectrum, Commodore, Amiga i Atari procesorem Z80. Oprócz jednostki centralnej mikrokontrolery zawierają   stałą pamięć FLASH przeznaczoną do przechowywania kodu programu, pamięć  RAM i pamięć EEPROM, liczniki 8- i 16-bitowe, komparatory, przetworniki analogowo-cyfrowe, porty wejścia/wyjścia, łącze RS232 (popularnie nazywane portem szeregowym) i układy przerwań.&lt;br /&gt;
&lt;br /&gt;
Mikrokontrolery wchodzące w skład zestawów pomiarowych na Pracowni EEG zawierają program, który umożliwia komunikację z nimi poprzez port szeregowy. Obecnie, komputery są coraz rzadziej wyposażane w porty szeregowe. Standard komunikacji RS-232, opracowany w 1962 roku  nadal jest jednak popularny i często wykorzystywany do komunikacji miedzy urządzeniami.  W celu połączenia komputera posiadającego tylko porty USB z mikrokontrolerem zastosowano przejściówkę USB/RS-232. &lt;br /&gt;
&lt;br /&gt;
Jak każde urządzenie w systemie Linuks, przejściówka USB/RS-232 widoczna jest jako plik, znajdujący się w katalogu &amp;lt;tt&amp;gt;/dev&amp;lt;/tt&amp;gt;. Nazwy plików obsługujących urządzenia szeregowe to &amp;lt;tt&amp;gt;ttyXY&amp;lt;/tt&amp;gt;, gdzie &amp;lt;tt&amp;gt;XY&amp;lt;/tt&amp;gt; to kolejny numer przydzielony do urządzenia szeregowego.&lt;br /&gt;
Do komunikacji komputera z mikroknotrolerem  w Zakładzie Fizyki Biomedycznej UW została napisana prosta biblioteka.  Jej użycie jest następujące:&lt;br /&gt;
* Po podłączeniu przejściówki USB/RS232 do komputera mikrokontrolera sprawdź jaki plik w katalogu &amp;lt;tt&amp;gt;/dev&amp;lt;/tt&amp;gt; został utworzony i przydzielony do urządzenia. &lt;br /&gt;
* Zaimportuj bibliotekę do komunikacji z mikrokontrolerem: &lt;br /&gt;
: &amp;lt;tt&amp;gt;import SerialPort as SP&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Otwórz plik powiązany z urządzeniem zewnętrznym:&lt;br /&gt;
: &amp;lt;tt&amp;gt;sp = SP.SerialPort(nazwa_pliku) &amp;lt;/tt&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
: &amp;lt;tt&amp;gt;sp.open()&amp;lt;/tt&amp;gt;&lt;br /&gt;
W naszym przypadku prawidłowa nazwa pliku to &amp;lt;tt&amp;gt;/dev/ttyUSB0&amp;lt;/tt&amp;gt;.&lt;br /&gt;
* Po włączeniu zasilania mikrokontrolera, diody podłączone do niego i wykorzystywane w eksperymencie z potencjałami wywołanymi będą zapalone. Następujące polecenie zgasi obydwie diody:&lt;br /&gt;
: &amp;lt;tt&amp;gt;sp.blinkP300([0, 0])&amp;lt;/tt&amp;gt;&lt;br /&gt;
* Wydanie poniższego polecenia spowoduje, iż mikrokontroler zapali podłączoną do niego diodę numer 1 na czas 100 ms, zaś diodę numer 2 na 200 ms. Jednocześnie, w momencie włączenia jak i wyłączenia diody, sygnał z mikrokontrolera zostanie wysłany na 5-stykowe wejście AUX mikrokontrolera:&lt;br /&gt;
: &amp;lt;tt&amp;gt;sp.blinkP300([100, 200])&amp;lt;/tt&amp;gt;&lt;br /&gt;
* Jeśli chcemy zapalić tylko diodę numer dwa, np. na czas 500 ms w programie podajemy następującą instrukcję:&lt;br /&gt;
: &amp;lt;tt&amp;gt;sp.blinkP300([0, 500])&amp;lt;/tt&amp;gt;&lt;br /&gt;
* Jeśli chcemy zakończyć komunikację z mikrokontrolerem piszemy:&lt;br /&gt;
: &amp;lt;tt&amp;gt;sp.close()&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Kod biblioteki do komunikacji z mikrokontrolerem:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;!--  Kod w Pythonie 2&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# -*- coding: cp1250 -*-&lt;br /&gt;
import serial&lt;br /&gt;
import logging&lt;br /&gt;
import sys&lt;br /&gt;
import os&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def to_hex_word(a):&lt;br /&gt;
    '''encodes a decimal number hexadecimally on two bytes'''&lt;br /&gt;
    return chr(a%256) + chr(a/256)&lt;br /&gt;
&lt;br /&gt;
class SerialPort(object):&lt;br /&gt;
    def __init__(self, port_name):&lt;br /&gt;
        import serial&lt;br /&gt;
        try:&lt;br /&gt;
            self.port = serial.Serial(&lt;br /&gt;
                port=port_name,&lt;br /&gt;
                baudrate=9600,&lt;br /&gt;
                bytesize=serial.EIGHTBITS,&lt;br /&gt;
                parity=serial.PARITY_NONE,&lt;br /&gt;
                stopbits=serial.STOPBITS_ONE,&lt;br /&gt;
                xonxoff=False&lt;br /&gt;
                )&lt;br /&gt;
        except serial.SerialException as e:&lt;br /&gt;
            print(&amp;quot;Nieprawidłowa nazwa portu lub port zajęty.&amp;quot;)&lt;br /&gt;
            raise e&lt;br /&gt;
        self.close()&lt;br /&gt;
        &lt;br /&gt;
    def open(self):&lt;br /&gt;
        self.port.open()&lt;br /&gt;
&lt;br /&gt;
    def close(self):&lt;br /&gt;
        self.port.close()&lt;br /&gt;
&lt;br /&gt;
    def send(self, value):&lt;br /&gt;
        self.port.write(value)&lt;br /&gt;
                           &lt;br /&gt;
    def blinkSSVEP(self,d, p1, p2):&lt;br /&gt;
        '''&lt;br /&gt;
        d = list of frequencies;&lt;br /&gt;
        p1:p2 = ratio LED_on_time/LED_off_time&lt;br /&gt;
        if you want i-th LED to be OFF all the time send  d[i] = 0&lt;br /&gt;
        if you want i-th LED to be ON all the time send  d[i] = -1&lt;br /&gt;
        in these two cases p1 and p2 do not matter&lt;br /&gt;
        '''&lt;br /&gt;
        clock  = 62500&lt;br /&gt;
        factor = float(p1) / float(p1 + p2)&lt;br /&gt;
    &lt;br /&gt;
        str = chr(3) # 'SSVEP_RUN'&lt;br /&gt;
&lt;br /&gt;
        for i in range(len(d)):&lt;br /&gt;
            # i-th LED OFF&lt;br /&gt;
            if d[i] == 0:                       &lt;br /&gt;
                str += to_hex_word(0) + to_hex_word(255) &lt;br /&gt;
            # i-th LED ON&lt;br /&gt;
            elif d[i] == -1:&lt;br /&gt;
                str += to_hex_word(255) + to_hex_word(0)&lt;br /&gt;
                #str = 'S'&lt;br /&gt;
                # i-th LED blinks d[i] times per second&lt;br /&gt;
                # p1:p2 = on_time:off_time in one blink&lt;br /&gt;
            else:&lt;br /&gt;
                period = clock/d[i]&lt;br /&gt;
                bright = int((clock/d[i]) * factor)&lt;br /&gt;
                dark = period - bright&lt;br /&gt;
                str += to_hex_word(bright) + to_hex_word(dark)&lt;br /&gt;
&lt;br /&gt;
        self.send(str)&lt;br /&gt;
&lt;br /&gt;
    def blinkP300(self,d):&lt;br /&gt;
        clock  = 62500&lt;br /&gt;
        str = chr(4) # 'P300_RUN'&lt;br /&gt;
&lt;br /&gt;
        for i in range(len(d)):&lt;br /&gt;
            period = int(clock*d[i]/1000.0)&lt;br /&gt;
            str += to_hex_word(period)&lt;br /&gt;
            print(period)&lt;br /&gt;
&lt;br /&gt;
        self.send(str)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
--&amp;gt; &amp;lt;!-- Kod w Pythonie 3 --&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# -*- coding: cp1250 -*-&lt;br /&gt;
import serial&lt;br /&gt;
import logging&lt;br /&gt;
import sys&lt;br /&gt;
import os&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
def to_hex_word(a):&lt;br /&gt;
    '''encodes a decimal number hexadecimally on two bytes'''&lt;br /&gt;
    return a.to_bytes(2,byteorder=sys.byteorder)&lt;br /&gt;
 &lt;br /&gt;
class SerialPort(object):&lt;br /&gt;
    def __init__(self, port_name):&lt;br /&gt;
        import serial&lt;br /&gt;
        try:&lt;br /&gt;
            self.port = serial.Serial(&lt;br /&gt;
                port=port_name,&lt;br /&gt;
                baudrate=9600,&lt;br /&gt;
                bytesize=serial.EIGHTBITS,&lt;br /&gt;
                parity=serial.PARITY_NONE,&lt;br /&gt;
                stopbits=serial.STOPBITS_ONE,&lt;br /&gt;
                xonxoff=False&lt;br /&gt;
                )&lt;br /&gt;
        except serial.SerialException as e:&lt;br /&gt;
            print(&amp;quot;Nieprawidłowa nazwa portu lub port zajęty.&amp;quot;)&lt;br /&gt;
            raise e&lt;br /&gt;
        self.close()&lt;br /&gt;
 &lt;br /&gt;
    def open(self):&lt;br /&gt;
        self.port.open()&lt;br /&gt;
 &lt;br /&gt;
    def close(self):&lt;br /&gt;
        self.port.close()&lt;br /&gt;
 &lt;br /&gt;
    def send(self, value):&lt;br /&gt;
        self.port.write(value)&lt;br /&gt;
 &lt;br /&gt;
    def blinkSSVEP(self,d, p1, p2):&lt;br /&gt;
        '''&lt;br /&gt;
        d = list of frequencies;&lt;br /&gt;
        p1:p2 = ratio LED_on_time/LED_off_time&lt;br /&gt;
        if you want i-th LED to be OFF all the time send  d[i] = 0&lt;br /&gt;
        if you want i-th LED to be ON all the time send  d[i] = -1&lt;br /&gt;
        in these two cases p1 and p2 do not matter&lt;br /&gt;
        '''&lt;br /&gt;
        clock  = 62500&lt;br /&gt;
        factor = float(p1) / float(p1 + p2)&lt;br /&gt;
 &lt;br /&gt;
        str = (3).to_bytes(1,byteorder=sys.byteorder) # 'SSVEP_RUN'&lt;br /&gt;
 &lt;br /&gt;
        for i in range(len(d)):&lt;br /&gt;
            # i-th LED OFF&lt;br /&gt;
            if d[i] == 0:                       &lt;br /&gt;
                str += to_hex_word(0) + to_hex_word(255) &lt;br /&gt;
            # i-th LED ON&lt;br /&gt;
            elif d[i] == -1:&lt;br /&gt;
                str += to_hex_word(255) + to_hex_word(0)&lt;br /&gt;
                #str = 'S'&lt;br /&gt;
                # i-th LED blinks d[i] times per second&lt;br /&gt;
                # p1:p2 = on_time:off_time in one blink&lt;br /&gt;
            else:&lt;br /&gt;
                period = clock/d[i]&lt;br /&gt;
                bright = int((clock/d[i]) * factor)&lt;br /&gt;
                dark = int(period - bright)&lt;br /&gt;
                str += to_hex_word(bright) + to_hex_word(dark)&lt;br /&gt;
 &lt;br /&gt;
        self.send(str)&lt;br /&gt;
 &lt;br /&gt;
    def blinkP300(self,d):&lt;br /&gt;
        clock  = 62500&lt;br /&gt;
        str = (4).to_bytes(1,byteorder=sys.byteorder) # 'P300_RUN'&lt;br /&gt;
 &lt;br /&gt;
        for i in range(len(d)):&lt;br /&gt;
            period = int(clock*d[i]/1000.0)&lt;br /&gt;
            str += to_hex_word(period)&lt;br /&gt;
 &lt;br /&gt;
        self.send(str)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
--&amp;gt; &lt;br /&gt;
&lt;br /&gt;
===Zestaw eksperymentalny===&lt;br /&gt;
Zestaw składa się ze:&lt;br /&gt;
* wzmacniacza,&lt;br /&gt;
* stymulatora   &lt;br /&gt;
&amp;lt;!--* izolowanego galwanicznie układu generującego impulsy odpowiadające gaszeniu i zapalaniu diody,  o wartościach dopasowanych do akceptowalnych przez wejścia AUX wzmacniacza,--&amp;gt;&lt;br /&gt;
* komputera: w tym eksperymencie komputer będzie służył do zaprogramowania stymulatora i do rejestracji sygnałów.&lt;br /&gt;
&lt;br /&gt;
===Eksperyment 1. Obserwacja bodźca wzrokowego  ===&lt;br /&gt;
&amp;lt;!--Proszę zapoznać się ze standardami rejestracji wzrokowych potencjałów wywołanych [http://www.gcu.ac.uk/media/gcalwebv2/theuniversity/academicschools/sls/psytimetables/SLS%20-%20VEP_Standard_2010.pdf] --&amp;gt;&lt;br /&gt;
Proszę zapoznać się z typowym wyglądem załamków w przypadku potencjałów wzrokowych, jaki jest przedstawiony na [https://link.springer.com/article/10.1007/s10633-009-9195-4/figures/2 rysunku] (cały artykuł jest dostępny [http://link.springer.com/article/10.1007%2Fs10633-009-9195-4 tu]).&lt;br /&gt;
&amp;lt;!--[[Plik:Fig 4 VEP.jpg|thumb|320px|right|&amp;lt;figure id=&amp;quot;fig:zalamki_VEP&amp;quot;&amp;gt;&amp;lt;/figure&amp;gt;&lt;br /&gt;
&amp;lt;xr id=&amp;quot;fig:zalamki_VEP&amp;quot;&amp;gt;Rys. %i.&amp;lt;/xr&amp;gt; Schemat załamków rozpoznawanych we wzrokowych potencjach wywołanych (z pracy: J. V. Odom i in. &amp;amp;bdquo;ISCEV standard for clinical visual evoked potentials&lt;br /&gt;
(2009 update)&amp;amp;rdquo;, Doc Ophthalmol (2010), 120:111–119).]]&lt;br /&gt;
--&amp;gt; &lt;br /&gt;
&lt;br /&gt;
==== Rejestracja ====&lt;br /&gt;
* Paradygmat: z odległości około 40 cm badany obserwuje wyświetalny na ekranie biały kwadrat. Bodźce trwają 300 ms i  powtarzają się co 0.5 sekundy. Bodziec poprzedza punkt fiksacji pokazywany przez 300 ms. Natężenie bodźca ma przyjąć jedną z 4 wartości (manipulujemy jego przeźroczystością: 1, 0.7, 0.3 i 0.1, gdzie 1 oznacza brak przeźroczystości). Każda z intensywności bodźca ma pojawić się 100 razy podczas badania, bodźce podawane mają być w sposób losowy. Zadanie poprzedza krótka instrukcja, kończy podziękowanie. &lt;br /&gt;
&lt;br /&gt;
* Pomiar&lt;br /&gt;
**Zakładamy czepek i elektrody w systemie 10-20, dbamy o to by opory pomiędzy elektrodami były poniżej 10 k&amp;amp;Omega; i różnice pomiędzy oporami różnych elektrod nie przekraczały 20%. [[Plik:Glowka10-20 ERPy.svg|thumb|600px|right]]&lt;br /&gt;
** Elektrodę GND mocujemy w otworze czepka odpowiadającym pozycji AFz (na linii centralnej 10% w stronę nosa od elektrody Fz) &lt;br /&gt;
** Montujemy także elektrody M1 i M2 i FCz.&lt;br /&gt;
&lt;br /&gt;
==== Analiza ====&lt;br /&gt;
# Filtrujemy sygnał w paśmie 1-20 Hz.&lt;br /&gt;
# Z ciągłego zapisu wycinamy fragmenty od &amp;amp;minus;300 ms do +800 ms (zero oznacza moment wystąpienia bodźca). W czasie wycinania badamy wycinane fragmenty pod względem zakresu amplitudy (wszystkie kanały powinny mieć amplitudę w granicach &amp;amp;plusmn;75 &amp;amp;mu;V) i zawartości artefaktów od mrugania (w tym celu trzeba oglądając sygnał w SVAROG-u ustalić próg na amplitudę sygnału w kanałach Fp1 i Fp2).&lt;br /&gt;
# Uśredniamy wycięte sygnały.&lt;br /&gt;
# Rysujemy średni potencjał we wszystkich kanałach.&lt;br /&gt;
# Pierwszy sposób: Identyfikujemy załamki P1 i N2. Mierzymy amplitudę P1 jako różnicę między ekstremalną wartością załamka N2 a ekstremalną wartością załamka N2. &lt;br /&gt;
# Drugi sposób: Identyfikujemy załamki P1 i N2. Mierzymy amplitudę P1 w stosunku do zera. &lt;br /&gt;
#porównujemy uzyskane amplitudy w 4 warunkach za pomocą odpowiedniego testu statystycznego (porównanie warunków ze skrajnymi wartościami amplitudy - zastosuj test permutacyjny (opisany poniżej) lub test t-Studenta/nieparametryczny odpowiednik). &lt;br /&gt;
&lt;br /&gt;
**Opis testu permutacyjnego &lt;br /&gt;
Pytanie: Czy intensywność bodźca wpływa na amplitudę potencjału P1?&lt;br /&gt;
Jak stwierdzić czy amplitudy załamków P1 istotnie różnią się pomiędzy seriami?&lt;br /&gt;
&lt;br /&gt;
Musimy przeprowadzić test statystyczny. Możemy skonstruować go np. tak:&lt;br /&gt;
Mamy dwa warunki I i II. Jako statystykę przyjmiemy różnicę pomiędzy amplitudą załamka zmierzoną w serii z dwoma diodami (P2&amp;lt;sub&amp;gt;II&amp;lt;/sub&amp;gt;) a amplitudą zmierzoną w serii z jedną diodą (P2&amp;lt;sub&amp;gt;I&amp;lt;/sub&amp;gt;):&lt;br /&gt;
: ''S'' = P2&amp;lt;sub&amp;gt;II&amp;lt;/sub&amp;gt; &amp;amp;minus; P2&amp;lt;sub&amp;gt;I&amp;lt;/sub&amp;gt;&lt;br /&gt;
Postawmy hipotezę zerową, że nie ma różnicy w amplitudzie pomiędzy warunkiem II a I oraz hipotezę alternatywną, że różnica taka występuje.&lt;br /&gt;
: H&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;: ''S'' = 0&lt;br /&gt;
: H&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;: ''S'' &amp;amp;ne; 0&lt;br /&gt;
Zgodnie z H&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; dla wartości ''S'' nie ma różnicy czy realizacja została zarejestrowana w warunkach I czy II, zatem można losowo poprzypisywać numery warunków do realizacji i w ten sposób uzyskać rozkład statystyki ''S'' pod warunkiem prawdziwości H&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;, czyli obliczyć średnie potencjały dla &amp;amp;bdquo;pomieszanych&amp;amp;rdquo; tagów, wyliczyć średnie potencjały dla sztucznie wygenerowaych grup, i wyliczyć różnicę amplitud dla tych średnich, czyli wartość statystyki dla hipotezy H&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Zaimplementuj test permutacyjny zgodny z powyższą koncepcją.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- ===Wersja 2: obserwacja habituacji / uśrednianie w blokach ===&lt;br /&gt;
==== Rejestracja ====&lt;br /&gt;
# Paradygmat: &lt;br /&gt;
#* z odległości około 40 cm badany obserwuje błyski diody. &lt;br /&gt;
#* Błyski powtarzają się co 0,5 sekundy. &lt;br /&gt;
#* Rejestrujemy 60 serii po 15 błysków.  &lt;br /&gt;
#* Pomiędzy seriami badany odpoczywa około 10 sekund.&lt;br /&gt;
# Zakładamy czepek i elektrody w systemie 10-20, dbamy o to by opory pomiędzy elektrodami były poniżej 5 k&amp;amp;Omega; i różnice pomiędzy oporami różnych elektrod nie przekraczały 20%.&lt;br /&gt;
#* Elektrodę GND mocujemy w otworze czepka odpowiadającym pozycji AFz (na linii centralnej 10% w stronę nosa od elektrody Fz) &lt;br /&gt;
#* Montujemy także elektrodę FCz (na linii centralnej pomiędzy Fz a Cz), będziemy jej używać w montażu i w czasie analizy jako referencji.&lt;br /&gt;
#* Częstość próbkowania 512 Hz.&lt;br /&gt;
&lt;br /&gt;
==== Analiza ====&lt;br /&gt;
# Filtrujemy sygnał w paśmie 0,1-20 Hz.&lt;br /&gt;
# Z ciągłego zapisu wycinamy fragmenty od &amp;amp;minus;300 ms do +600 ms (zero oznacza moment wystąpienia bodźca). W czasie wycinania badamy wycinane fragmenty pod względem zakresu amplitudy (wszystkie kanały powinny mieć amplitudę w granicach &amp;amp;plusmn;75 &amp;amp;mu;V) i zawartości artefaktów od mrugania (w tym celu trzeba oglądając sygnał w SVAROG-u ustalić próg na amplitudę sygnału w kanałach Fp1 i Fp2).&lt;br /&gt;
# Uśredniamy wycięte sygnały o tym samym numerze wewnątrz serii.&lt;br /&gt;
# Rysujemy serie 15 uśrednionych potencjałów dla tego kanału, który wykazywał najsilniejszy potencjał w pierwszej wersji eksperymentu. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Zadanie 3: rejestracja i analiza potencjału P3 ==&lt;br /&gt;
==== Rejestracja ====&lt;br /&gt;
# Paradygmat: &lt;br /&gt;
#* z odległości około 40 cm badany obserwuje błyski diody. &lt;br /&gt;
#* Błyski diody nr 1 powtarzają się co 1&amp;amp;plusmn;0,1 sekundy. &lt;br /&gt;
#* W losowych realizacjach zapalana jest także dioda nr 2. &lt;br /&gt;
#* Proporcja pomiędzy liczbą błysków pojedynczych i podwójnych powinna wynosić 10:2, przy czym błyski podwójne muszą być odseparowane co najmniej jednym błyskiem pojedynczym. &lt;br /&gt;
#* Czas zapalenia diod, tak jak w poprzednich eksperymentach, wynosi 20 ms. &lt;br /&gt;
#* Zadaniem badanego jest liczenie liczby błysków podwójnych.&lt;br /&gt;
#* Wykonujemy tyle realizacji aby zarejestrować 50 powtórzeń podwójnych błysków. &lt;br /&gt;
# Zakładamy czepek i elektrody w systemie 10-20, dbamy o to by opory pomiędzy elektrodami były poniżej 5 k&amp;amp;Omega; i różnice pomiędzy oporami różnych elektrod nie przekraczały 20%.&lt;br /&gt;
#* Elektrodę GND mocujemy w otworze czepka odpowiadającym pozycji AFz (na linii centralnej 10% w stronę nosa od elektrody Fz) &lt;br /&gt;
#* Montujemy także elektrody M1 i M2, będziemy ich używać w montażu i w czasie analizy jako referencji typu połączone uszy.&lt;br /&gt;
#* Częstość próbkowania 512 Hz.&lt;br /&gt;
&lt;br /&gt;
==== Analiza ====&lt;br /&gt;
# Filtrujemy sygnał w paśmie 0,1-20 Hz.&lt;br /&gt;
# Z ciągłego zapisu wycinamy fragmenty od &amp;amp;minus;300 ms do +600 ms (zero oznacza moment wystąpienia bodźca). W czasie wycinania badamy wycinane fragmenty pod względem zakresu amplitudy (wszystkie kanały powinny mieć amplitudę w granicach &amp;amp;plusmn;75 &amp;amp;mu;V) i zawartości artefaktów od mrugania (w tym celu trzeba oglądając sygnał w SVAROG-u ustalić próg na amplitudę sygnału w kanałach Fp1 i Fp2).&lt;br /&gt;
# Uśredniamy osobno realizacje błysków pojedynczych i błysków podwójnych.&lt;br /&gt;
# Nakładamy na siebie na rysunkach oba typy średnich.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Ćwiczenie dodatkowe: P300 BCI==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wykorzystujemy elektrody z systemu 10-10 umieszczone nad korą wzrokową: P07, O1, O2, PO8, PO3, PO4, Pz, Cz.&lt;br /&gt;
&lt;br /&gt;
Uruchamiamy &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
obci_gui --presets eeg_workshop&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
i z guzika &amp;amp;bdquo;select amplifier&amp;amp;rdquo; wybieramy właściwy wzmacniacz.&lt;br /&gt;
&lt;br /&gt;
Do kontroli jakości sygnału możemy uruchomić Svaroga.&lt;br /&gt;
&lt;br /&gt;
Dane z kalibracji zapisują się w pliku test1 w katalogu domowym użytkownika, z labiryntu w pliku test2.&lt;br /&gt;
&lt;br /&gt;
Po zakończeniu kalibracji pojawia się napis &amp;amp;bdquo;Trwają obliczenia&amp;amp;rdquo; lub podobny. Odczekujemy kilka minut, aż skończy się peer &amp;amp;bdquo;Calibration&amp;amp;rdquo; (widoczny w obci_gui) i zamykamy okienko klawiszami Alt-F4 lub zatrzymując scenariusz guzikiem &amp;amp;bdquo;Stop&amp;amp;rdquo;. W katalogu domowym pojawi się plik z wynikami kalibracji, co pozwala na uruchomienie scenariusza &amp;amp;bdquo;labirynt&amp;amp;rdquo;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Po zebraniu danych, przed wczytaniem ich do Svaroga należy w tym samym katalogu uruchomić skrypt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
#!/usr/bin/env python&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
&lt;br /&gt;
from obci.analysis.obci_signal_processing.tags import tags_file_writer&lt;br /&gt;
from obci.analysis.obci_signal_processing.read_manager import ReadManager&lt;br /&gt;
&lt;br /&gt;
def main(): &lt;br /&gt;
	file_name = 'test1'&lt;br /&gt;
	&lt;br /&gt;
	mgr = ReadManager(&lt;br /&gt;
		file_name + '.obci.xml',&lt;br /&gt;
		file_name + '.obci.raw',&lt;br /&gt;
		file_name + '.obci.tag')&lt;br /&gt;
	&lt;br /&gt;
	tags = mgr.get_tags()&lt;br /&gt;
	for i in xrange(0, len(tags)):&lt;br /&gt;
		if tags[i]['desc']['index'] == tags[i]['desc']['target']:&lt;br /&gt;
			tags[i]['name'] = 'blink_target'&lt;br /&gt;
		else:&lt;br /&gt;
			tags[i]['name'] = 'blink'&lt;br /&gt;
			&lt;br /&gt;
	tags_writer = tags_file_writer.TagsFileWriter(file_name + '.obci.tag')&lt;br /&gt;
	for tag in tags:&lt;br /&gt;
		tags_writer.tag_received(tag)		&lt;br /&gt;
	tags_writer.finish_saving(0)	&lt;br /&gt;
 &lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Aduszyk</name></author>
		
	</entry>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=Pracownia_EEG/Potencja%C5%82y_wywo%C5%82ane&amp;diff=8971</id>
		<title>Pracownia EEG/Potencjały wywołane</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=Pracownia_EEG/Potencja%C5%82y_wywo%C5%82ane&amp;diff=8971"/>
		<updated>2022-11-08T10:37:02Z</updated>

		<summary type="html">&lt;p&gt;Aduszyk: /* Rejestracja */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Pracownia EEG|Pracownia EEG]] / Potencjały wywołane&lt;br /&gt;
&lt;br /&gt;
=Wstęp=&lt;br /&gt;
==Potencjały wywołane==&lt;br /&gt;
=== Wstęp ===&lt;br /&gt;
Potencjały wywołane EEG (ang. ''evoked potentials'', EP) są śladami odpowiedzi mózgu na bodźce. W przypadku MEG poprawnie mówi się o polach wywołanych (ang. ''evoked fields'', EF).&lt;br /&gt;
Zwykle reakcja ta jest mała (wyjątek stanowią [[Elektroencefalografia/Metody_analizy_sygnałów_EEG_-_analiza_w_dziedzinie_czasu |kompleksy K]]) i w zapisie pojedynczej realizacji reakcji na bodziec najczęściej niewidoczna wśród czynności pochodzącej od wielu innych procesów zachodzących w tym samym czasie w mózgu. &lt;br /&gt;
Ich wyodrębnienie z tak zwanego tła EEG/MEG, czyli manifestacji elektrycznej innych, trwających w tym samym czasie w mózgu procesów (aktywny prąd niezależny), wymaga w dniu dzisiejszym zapisu odpowiedzi na szereg powtórzeń tego samego bodźca (&amp;lt;xr id=&amp;quot;fig:EP&amp;quot;&amp;gt;rys. %i&amp;lt;/xr&amp;gt;). Pierwsze potencjały wywołane pokazał pod koniec lat 40-tych Dawson (Dawson 1947) wykonując superpozycję pojedynczych realizacji na kliszy fotograficznej.&lt;br /&gt;
Z czasem skomplikowane urządzenia analogowe zastąpione zostały przez cyfrowe uśrednianie kolejnych fragmentów EEG, zsynchronizowanych według momentu wystąpienia bodźca, łatwo realizowane za pomocą komputera.&lt;br /&gt;
&lt;br /&gt;
[[Grafika:EP.png|thumb|640px|center|&amp;lt;figure id=&amp;quot;fig:EP&amp;quot;&amp;gt;&amp;lt;/figure&amp;gt;&lt;br /&gt;
Uśrednianie potencjałów wywołanych. a) ciągły zapis EEG z wyróżnionymi momentami wystąpienia bodźca (w tym przypadku słuchowego) b) kilkadziesiąt kolejnych odcinków, wyciętych jako sekunda EEG od momentu wystąpienia kolejnych bodźców, ustawione jeden pod drugim c) uśredniony potencjał wywołany &amp;amp;mdash; widać m. in. załamek P300 ok. 300 milisekund po bodźcu]]&lt;br /&gt;
&lt;br /&gt;
Techniki te opierają się na założeniu, że zawarta w EEG odpowiedź mózgu na każdy z kolejnych bodźców jest niezmienna, a EEG odzwierciedlające pozostałe procesy traktowane jest jak nieskorelowany z nią proces stochastyczny. Zależnie od rodzaju potencjałów wywołanych, założenia te są mniej lub bardziej nieuzasadnione; podważa je choćby powszechnie znany efekt habituacji, polegający na osłabieniu późnych potencjałów wywołanych kolejnymi powtórzeniami bodźca.&lt;br /&gt;
&lt;br /&gt;
Istota potencjałów wywołanych jest przedmiotem otwartej dyskusji i dziesiątków prac, dotykających od lat podstawowych w tej dziedzinie pytań: czym jest potencjał wywołany, który widzimy w uśrednionym przebiegu? Czy naprawdę wynika z deterministycznie powtarzanej, jednakowej odpowiedzi pojawiającej się po każdym powtórzeniu bodźca niezależnie od &amp;amp;bdquo;tła&amp;amp;rdquo;, czy może wynika z reorganizacji faz tego właśnie &amp;amp;bdquo;tła&amp;amp;rdquo; EEG, czy może kombinacji tych dwóch efektów? Jest to wspaniałe pole dla zastosowań zaawansowanych metod modelowania i analizy sygnałów. W ostatnich latach powstają dziesiątki prac na ten temat, a od czasu do czasu również krytyczne artykuły wykazujące, że dotychczasowe odkrycia są raczej artefaktami stosowanych metod a nie wynikają z własności analizowanych danych (Yeung et al., 2004). Jak widać jest tu wciąż bardzo wiele do zrobienia, gdyż zrozumienie tego mechanizmu stoi na drodze do &amp;amp;bdquo;świętego Graala&amp;amp;rdquo;, którym w tej dziedzinie jest wyodrębnienie pojedynczych potencjałów wywołanych.&lt;br /&gt;
&lt;br /&gt;
Niezależnie od tego, w neurofizjologii klinicznej nazwą potencjał wywołany określa się krzywą widoczną po uśrednieniu odpowiedzi na kilkanaście do kilku tysięcy bodźców (Szelenberger 2000). Gromadzona od dziesięcioleci wiedza o behawioralnych i klinicznych korelatach potencjałów wywołanych opiera się na rozpoznawaniu w przebiegach uśrednionych tak zwanych załamków, czyli przejściowych wzrostów lub spadków potencjału (na przykład na &amp;lt;xr id=&amp;quot;fig:EP&amp;quot;&amp;gt;rys. %i&amp;lt;/xr&amp;gt; widać załamek P300). Nazwy załamków składają się zwykle z litery &amp;amp;bdquo;P&amp;amp;rdquo; (od ang. ''positive''), jeśli wychylenie jest dodatnie, lub &amp;amp;bdquo;N&amp;amp;rdquo; (od ang. ''negative''), jeśli wychylenie jest ujemne, oraz liczby. Uwaga: &lt;br /&gt;
* Nie ma niestety jednej ustalonej konwencji prezentacji potencjałów koniecznie trzeba więc zwracać uwagę na orientację wykresu, a wykonując wykres samemu - zamieszczać informację o orientacji kierunku dodatniego,gdyż kierunek dodatni może być wykresie skierowany do góry lub do dołu. &lt;br /&gt;
* Liczba następująca po N lub P określa przybliżoną liczbę milisekund od wystąpienia bodźca, czyli tak zwaną latencję. Nie można jednak ścisłego związku między tą liczbą a liczbą milisekund np. potencjał P300 w zależności od szczegółów paradygmatu doświadczalnego może wystąpić znacznie później. np. w eksperymentach językowych zdarza się że P300 występuje później niż N400 :-).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;xr id=&amp;quot;fig:zalamki&amp;quot;&amp;gt;Rys. %i&amp;lt;/xr&amp;gt; przedstawia schematycznie najważniejsze załamki rozpoznawane w potencjałach słuchowych, czyli wywoływanych bodźcem dźwiękowym. Dla potencjałów wzrokowych i somatosensorycznych istnieją podobne klasyfikacje.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Grafika:Zalamki.png|thumb|320px|right|&amp;lt;figure id=&amp;quot;fig:zalamki&amp;quot;&amp;gt;&amp;lt;/figure&amp;gt;&lt;br /&gt;
Orientacyjny schemat załamków rozpoznawanych w słuchowych potencjach wywołanych, na podstawie (Szelenberger 2000). Skala czasu logarytmiczna. Najszybsze (do 12 ms) składowe egzogenne to potencjały pniowe (BAEP), oznaczane jako fale I-VII. Litery &amp;amp;bdquo;P&amp;amp;rdquo; i &amp;amp;bdquo;N&amp;amp;rdquo; oznaczają dodatnie i ujemne wychylenia związane z dalszymi załamkami]]&lt;br /&gt;
&lt;br /&gt;
Najszybsze (czyli o najmniejszej latencji) składowe to potencjały egzogenne, odzwierciedlające wstępne fazy przekazu informacji. W potencjałach słuchowych są to potencjały pnia (ang. ''brainstem auditory evoked potentials'', BAEP), składające się z siedmiu fal występujących pomiędzy 1 a 12 ms od bodźca. Są one generowane np. w nerwie słuchowym czy pniu mózgu, i wykorzystywane w klinicznej diagnostyce integralności dróg słuchowych. Podobnie jak inne wczesne potencjały o latencjach poniżej 100 ms, są praktycznie niezależne od stanu uwagi.&lt;br /&gt;
&lt;br /&gt;
Po potencjałach o średniej latencji (między 12 a 50 ms) zaczynają się późne potencjały słuchowe (od 100 ms od podania bodźca), odzwierciedlające bardziej złożone reakcje na bodziec. Potencjały ok. 100 ms obserwowane w okolicach sensorycznych odzwierciedlają odpowiedź tejże kory na bodziec. Ich amplituda zależy od parametrów fizycznych bodźca oraz od uwagi, np. amplituda załamka N100 wzrasta w stanie skupienia uwagi czy pobudzenia emocjonalnego. Pierwszy i najpopularniejszy całkowicie endogenny załamek to P300, pojawiający się po rozpoznaniu bodźca oczekiwanego, na którym skupiamy uwagę: na przykład, jeśli w serii pojawiających się losowo liter mamy zliczać wystąpienia jednej z nich, to na średniej odpowiedzi na pojawienie się tej litery pojawi się załamek P300. Załamek ten występuje również w odpowiedzi na bodźce wyczekiwane, niespodziewane i ważne dla osoby (np. własne imię). &lt;br /&gt;
&lt;br /&gt;
=== Uśrednianie w dziedzinie czasu ===&lt;br /&gt;
Jak już było wspomniane powyżej podstawową techniką stosowaną do analizy potencjałów wywołanych jest uśrednianie wielu realizacji odpowiedzi na bodziec wyrównanych względem jakiegoś charakterystycznego zdarzenia, np. momentu podania bodźca albo momentu behawioralnej reakcji na bodziec (np. wciśnięcie przycisku). Podejście to bazuje na trzech założeniach:&lt;br /&gt;
* Reakcja jest czasowo związana z bodźcem. Tzn. w kolejnych realizacjach występuje ona zawsze z tym samym opóźnieniem.&lt;br /&gt;
* Reakcja na bodziec skutkuje zawsze pojawieniem się w sygnale składowej o stałym kształcie (mówimy o stałej morfologii).&lt;br /&gt;
* Spontaniczna czynność EEG &amp;amp;mdash; ta która nie dotyczy przetwarzania interesującego nas bodźca &amp;amp;mdash; jest niezależnym, stacjonarnym szumem o średniej zero.&lt;br /&gt;
&lt;br /&gt;
Zgodnie z powyższymi założeniami mierzony w ''i''-tej realizacji sygnał można wyrazić jako:&lt;br /&gt;
: &amp;lt;math&amp;gt;x_i(t) = s(t) + n_i(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
Uśrednianie po ''N'' realizacjach daje:&lt;br /&gt;
: &amp;lt;math&amp;gt;\bar x (t) = \frac{1}{N} \sum_{i=1}^N x_i(t) = \frac{1}{N} \left(N s(t) + \sum_{i=1}^N n_i(t) \right) &amp;lt;/math&amp;gt;&lt;br /&gt;
Wartość oczekiwana średniego sygnału wynosi:&lt;br /&gt;
: &amp;lt;math&amp;gt;\mathrm{E}\left[ \bar x(t) \right] = s(t) &amp;lt;/math&amp;gt;&lt;br /&gt;
gdyż dla szumu o średniej zero mamy:&lt;br /&gt;
: &amp;lt;math&amp;gt;\mathrm{E}\left[\frac{1}{N} \sum_{i=1}^N n_i(t)\right] = 0&amp;lt;/math&amp;gt;.&lt;br /&gt;
Wariancja &amp;lt;math&amp;gt;\bar x(t)&amp;lt;/math&amp;gt; wynosi:&lt;br /&gt;
: &amp;lt;math&amp;gt;\sigma^2_{\bar x(t)} = \mathrm{E} \left[  \left( \frac{1}{N} \sum_{i=1}^N n_i(t)\right)^2 \right] \approx \frac{1}{N} \sigma^2_{n(t)}&amp;lt;/math&amp;gt;&lt;br /&gt;
gdyż &amp;lt;math&amp;gt;s(t)&amp;lt;/math&amp;gt; jest deterministyczne. &lt;br /&gt;
&lt;br /&gt;
Dla potencjałów pojawiających się w pierwszych kilkudziesięciu milisekundach po bodźcu model ten można uznać za poprawny, gdyż wykazują one zależność głównie od parametrów fizycznych bodźca. Dla późniejszych składowych staje się on coraz bardziej wątpliwy ze względu na występujące korelacje ze stanem (np. uwagi) badanego.&lt;br /&gt;
&lt;br /&gt;
Dla późniejszych składowych można by postulować bardziej ogólną wersję modelu potencjału wywołanego:&lt;br /&gt;
: &amp;lt;math&amp;gt;x_i(t) = s_i(t) + n_i(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
Ten model uwidacznia, że do opisu potencjału wywołanego potrzebna jest nie tylko średnia, ale i wyższe momenty rozkładu (np. drugi moment centralny czyli wariancja).&lt;br /&gt;
&lt;br /&gt;
====Wariancja w przypadku szumu skorelowanego ====&lt;br /&gt;
W poprzednim paragrafie pokazaliśmy, że w przypadku niezależnego szumu wariancja uśrednionego sygnału (w danej chwili czasu) maleje jak  &amp;lt;math&amp;gt;\frac{1}{N}&amp;lt;/math&amp;gt;. Jednak w przypadku gdy kolejne próbki szumu są skorelowane (np. występuje silna aktywność rytmiczna alfa) sytuacja się komplikuje. Intuicyjnie łatwo możemy to sobie wyobrazić w granicznym przypadku. Załóżmy, że tło dla  potencjałów o stałej morfologii   stanowi sinusoida. Jeśli będziemy podawać bodźce w odstępach będących wielokrotnością okresu tej sinusoidy to w uśrednianych fragmentach sygnału owa sinusoida jest tak samo powtarzalna jak badany potencjał i uśrednianie nie prowadzi do poprawy stosunku amplitudy sygnału do amplitudy tła. &lt;br /&gt;
&lt;br /&gt;
Stopień zależności pomiędzy próbkami można zmierzyć przy pomocy funkcji autokorelacji. &lt;br /&gt;
Jeśli funkcję autokorelacji przybliżymy przez:&lt;br /&gt;
: &amp;lt;math&amp;gt;R_{xx}(\tau) = \sigma^2 \exp(-\beta |\tau|) \cos(2 \pi f_0 \tau)&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\sigma^2&amp;lt;/math&amp;gt; jest wariancją szumu, &amp;lt;math&amp;gt;f_0&amp;lt;/math&amp;gt; jest średnią częstością aktywności rytmicznej, &amp;lt;math&amp;gt;\beta/ \pi&amp;lt;/math&amp;gt; jest szerokością pasma tej czynności, zaś &amp;lt;math&amp;gt;\tau&amp;lt;/math&amp;gt; opóźnieniem, to wariancję potencjału wywołanego można wyrazić jako&amp;lt;!-- \cite{Spekreijse_1976}--&amp;gt;:&lt;br /&gt;
: &amp;lt;math&amp;gt;\sigma^2_{\bar x(t)} = \frac{\sigma^2}{N} \left[ \frac{1-\exp(-2 \beta T)}{1 - 2 \exp(- \beta T) \cos(2 \pi f_0 T) +\exp(-2 \beta T)} \right]&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; jest odstępem między bodźcami. &lt;br /&gt;
Widać stąd, że obecność czynności rytmicznej w tle wpływa na stosunek sygnału do szumu. Z powyższego równania widać, że stosunek wariancji dąży do &amp;lt;math&amp;gt;\frac{\sigma^2}{N}&amp;lt;/math&amp;gt; gdy &amp;lt;math&amp;gt;\beta T&amp;lt;/math&amp;gt; staje się duże.  &lt;br /&gt;
&lt;br /&gt;
Periodyczna stymulacja może ponadto prowadzić do wzbudzenia czynności rytmicznej o częstości równej częstości pobudzania bądź jej harmonicznej.&lt;br /&gt;
&lt;br /&gt;
===Wariancja latencji===&lt;br /&gt;
&lt;br /&gt;
Jedną z form zmienności potencjału wywołanego w pojedynczych realizacjach jest wariancja latencji. &lt;br /&gt;
[[Grafika:Wariancja_latencji.png|thumb|500px|right|&lt;br /&gt;
Czerwona linia: Uśrednianie 100 potencjałów wywołanych o latncjach z rozkładu normalnego N(300,30 ), Niebieskie linie: przykładowe pojedyncze realizacje wzięte do średniej]]&amp;lt;!--# -*- coding: utf-8 -*-&lt;br /&gt;
from __future__ import division&lt;br /&gt;
import numpy as np&lt;br /&gt;
from matplotlib.pyplot import plot, show ,subplot, figure, title, xlabel, ylabel, ylim&lt;br /&gt;
 &lt;br /&gt;
def fun(t,lat=100):&lt;br /&gt;
    return np.exp(-(t-lat)**2/(2*30**2))&lt;br /&gt;
Fs = 1&lt;br /&gt;
N = 100&lt;br /&gt;
t = np.arange(0,700)&lt;br /&gt;
f = np.zeros((N,700))&lt;br /&gt;
f_sr = np.zeros(t.shape)&lt;br /&gt;
for i in range(N):&lt;br /&gt;
    f[i,:] = fun(t,lat = 300 + 30* np.random.randn())&lt;br /&gt;
for i in range(3):&lt;br /&gt;
    plot(t,f[i,:], 'b')&lt;br /&gt;
plot(t,f.mean(0),'r')&lt;br /&gt;
show()--&amp;gt;&lt;br /&gt;
Zmienność latencji prowadzi do:&lt;br /&gt;
* zmniejszenia amplitudy &amp;lt;math&amp;gt;\bar x&amp;lt;/math&amp;gt;&lt;br /&gt;
* wzrostu rozciągłości czasowej załamka&lt;br /&gt;
&lt;br /&gt;
O tych konsekwencjach zmienności latencji należy w szczególności pamiętać porównując średnie potencjały uzyskane w różnych warunkach eksperymentalnych. Gdy zauważymy, że średnie potencjały różnią się amplitudą należy rozważyć możliwość, że w istocie warunki eksperymentalne wpływają na różnice w wariancji latencji. &lt;br /&gt;
&lt;br /&gt;
Naturalne jest, że zmienność latencji jest bardziej widoczna w przypadku załamków trwających krótko niż w przypadku załamków trwających długo. Wariancja latencji rożnie wraz z jej wartością, stąd wśród późnych składowych potencjałów wywołanych nie obserwuje się komponentów krótkotrwałych.&lt;br /&gt;
&amp;lt;!--====Uśrednianie metodą Woody'ego ====&lt;br /&gt;
&lt;br /&gt;
Model potencjału ze zmienną latencją i sposób na jego efektywniejsze uśrednianie zaproponował Woody (1967). Model ten zakłada, że w każdej realizacji występuje komponent addytywny &amp;lt;math&amp;gt;s_i(t)\;&amp;lt;/math&amp;gt;, który co do kształtu jest stały, a pomiędzy realizacjami różni się tylko latencją:&lt;br /&gt;
: &amp;lt;math&amp;gt; s_i(t) = s(t +\Delta t_i)\;&amp;lt;/math&amp;gt;&lt;br /&gt;
Woody zaproponował aby &amp;lt;math&amp;gt;\Delta t_i\;&amp;lt;/math&amp;gt; szacować na podstawie maksimum funkcji korelacji wzajemnej pomiędzy ''i''-tą realizacją a wzorcem. W pierwszym kroku wzorcem jest średni potencjał uzyskany przez proste uśrednienie realizacji.  Następnie w sposób iteracyjny dokonuje się:&lt;br /&gt;
* poprawek w wyrównaniu poszczególnych realizacji,&lt;br /&gt;
* obliczenia nowego wzorca poprzez uśrednienie realizacji po korekcie wyrównania,&lt;br /&gt;
* obliczenia nowych poprawek do wyrównania realizacji.--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Habituacja ===&lt;br /&gt;
Zmienność w odpowiedziach na kolejno występujące po sobie bodźce można podzielić na komponent stochastyczny i deterministyczny. Komponent deterministyczny odzwierciedla zmianę czułości  układu nerwowego  na kolejne bodźce. Nowy bodziec często wywołuje reakcje pobudzenia widoczną w wielu parametrach takich jak przewodnictwo skóry, rytm serca i reaktywność kory mózgowej. Powszechnie obserwowanym zjawiskiem jest spadek reaktywności na powtarzające się bodźce zwany habituacją. Niekiedy obserwuje się także zjawisko przeciwne &amp;amp;mdash; wzrost reaktywności na bodziec &amp;amp;mdash; zwane sensytyzacją. &lt;br /&gt;
&lt;br /&gt;
Klasycznym sposobem na badanie tych zjawisk w potencjałach wywołanych jest uśrednianie w podzbiorach lub  uśrednianie blokowe. Wymaga ono  zmiany paradygmatu rejestracji danych. Załóżmy, że interesującym nas bodźcem jest błysk światła. Chcemy zaobserwować ewentualne zmiany amplitudy i latencji w ciągu 100 potencjałów będących reakcją na błysk powtarzający się co 500 ms.&lt;br /&gt;
====Uśrednianie w podzbiorach ====&lt;br /&gt;
W metodzie tej musimy założyć, że proces habituacji jest powolny, tzn. zmiany pomiędzy kolejnymi reakcjami są bardzo małe. W takim przypadku możemy podzielić długą serię bodźców na ciąg pod-serii i uśrednienie przeprowadzić dla każdej pod-serii osobno.&lt;br /&gt;
[[Plik:Usrednianie_podzbiory.svg‎|640px|thumb|center|Ilustracja uśredniania w podzbiorach]]&lt;br /&gt;
&lt;br /&gt;
====Uśrednianie blokowe====&lt;br /&gt;
W tym celu eksperyment wykonujemy w wielu seriach. Jedna seria składa się ze 100 błysków powtarzanych co 500 ms.  Po serii następuje przerwa trwająca np. 5 s (długość przerwy wyraża nasze oszacowanie czasu potrzebnego na zanik habituacji). Po przerwie seria jest powtarzana. Powtórzeń serii wykonujemy ''N''.&lt;br /&gt;
Następnie uśredniamy fragmenty sygnałów odpowiadające sobie w kolejnych seriach. &lt;br /&gt;
&lt;br /&gt;
W tym paradygmacie zakładamy, że każda seria rejestrowana jest w tych samych warunkach. Zaniedbujemy efekty związane ze zmęczeniem i zmianami w np. stopniu koncentracji badanego.&lt;br /&gt;
[[Plik:Usrednianie blokowe.svg|Usrednianie blokowe.svg|640px|thumb|center|Ilustracja uśredniania w blokach]]&lt;br /&gt;
&lt;br /&gt;
===Załamki w krzywej potencjału wywołanego vs ukryte komponenty===&lt;br /&gt;
Komponenta potencjału wywołanego to bardzo ważne ale jednocześnie źle określone pojęcie. Krzywa otrzymana w wyniku uśredniania potencjałów wywołanych przedstawia serię załamków dodatnich i ujemnych, ale trzeba być świadomym, że ten przebieg napięcia rejestrowany przez elektrody przedstawia tak naprawdę sumę potencjałów pochodzących od wielu dość niezależnie działających źródeł w mózgu. Przyczynek pochodzący od jednego funkcjonalnego źródła będziemy określać jako komponentę. &lt;br /&gt;
&lt;br /&gt;
Komentarza wymaga też pojęcie źródła funkcjonalnego. Czynność elektryczną synchronicznie działających neuronów piramidalnych w określonym fragmencie kory mózgowej z pewnej odległości można przybliżyć potencjałem dipola prądowego. Taki aktywny fragment kory stanowi źródło dające przyczynek do mierzonego na powierzchni głowy potencjału. W najprostszej sytuacji taki przyczynek może być obserwowany jako komponenta. Mózg jest jednak obiektem niezwykle złożonym i gęsto połączonym. Wiele obszarów korowych może być funkcjonalnie połączonych i aktywowanych synchronicznie w celu realizacji określonego zadania &amp;amp;mdash; o takim funkcjonalnym zespole też możemy myśleć jako o pojedynczym źródle, choć może ono mieć złożoną strukturę przestrzenną. Często zatem myślimy o komponentach ukrytych potencjału wywołanego jako o aktywności takich funkcjonalnych zespołów. &lt;br /&gt;
&lt;br /&gt;
Po tym wstępie widać już chyba, że do zrozumienia co dzieje się w czasie reakcji na bodziec, którą obserwujemy w potencjale wywołanym, bardziej pożądane byłoby badanie komponent ukrytych niż poszczególnych załamków krzywej potencjału wywołanego, która stanowi ważoną sumę owych komponentów. Zanim przejdziemy do omówienia technik służących &amp;amp;bdquo;wyłuskiwaniu&amp;amp;rdquo; komponent prześledźmy kilka symulacji i wnioski z nich płynące.&lt;br /&gt;
&lt;br /&gt;
==== Załamki i komponenty nie są tym samym.====&lt;br /&gt;
Tę samą krzywą można otrzymać na nieskończenie wiele sposobów  przez sumowanie rożnych kombinacji domniemanych komponentów. Przykładowy rysunek pokazuje, jak tę samą krzywą można złożyć z dwóch rożnych zestawów komponentów (kod wytwarzający przykładową symulację pokazany jest poniżej).&lt;br /&gt;
[[Plik:Sumowanie_komponentow1.png|center|thumb|600px| Panel a) przedstawia hipotetyczną krzywą ERP, panel b) jedna z możliwych dekompozycji sygnału w panelu a), panel c) inna możliwa dekompozycja sygnału z panelu a) ]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
from __future__ import division&lt;br /&gt;
import numpy as np&lt;br /&gt;
from matplotlib.pyplot import plot, show ,subplot, figure, title, xlabel, ylabel, ylim&lt;br /&gt;
&lt;br /&gt;
Fs = 1&lt;br /&gt;
t = np.arange(0,700)&lt;br /&gt;
&lt;br /&gt;
C1 = np.exp(-(t-100)**2/(2*30**2))&lt;br /&gt;
C2 = np.exp(-(t-200)**2/(2*50**2))&lt;br /&gt;
C3 = np.exp(-(t-350)**2/(2*100**2))&lt;br /&gt;
ERP = 0.5*C1-C2+C3&lt;br /&gt;
&lt;br /&gt;
C2p = np.concatenate((C2[0:200], np.ones(30), C2[200:700-30] ))&lt;br /&gt;
C3p = ERP - 0.5*C1 + C2p&lt;br /&gt;
ERP_v2 = 0.5*C1-C2p+C3p&lt;br /&gt;
&lt;br /&gt;
subplot(3,1,1)&lt;br /&gt;
plot(t,ERP, t[::10],ERP_v2[::10],'g.')&lt;br /&gt;
ylabel('a)',rotation='horizontal')&lt;br /&gt;
ylim([-1, 1.5])&lt;br /&gt;
&lt;br /&gt;
subplot(3,1,2)&lt;br /&gt;
plot(t,0.5*C1,t,-C2,t,C3)&lt;br /&gt;
ylabel('b)',rotation='horizontal')&lt;br /&gt;
ylim([-1, 1.5])&lt;br /&gt;
&lt;br /&gt;
subplot(3,1,3)&lt;br /&gt;
plot(t,0.5*C1,t,-C2p,t,C3p)&lt;br /&gt;
ylabel('c)',rotation='horizontal')&lt;br /&gt;
ylim([-1, 1.5])&lt;br /&gt;
&lt;br /&gt;
show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Zmiana jednej komponenty może powodować zmiany w amplitudzie i latencji więcej niż jednego załamka.====&lt;br /&gt;
Poniższy rysunek przedstawia sytuację gdy zmiana amplitudy jednego komponentu może znacząco wpływać na amplitudę i latencję innych załamków.&lt;br /&gt;
&lt;br /&gt;
[[Plik:Sumowanie_komponentow2.png|center|thumb|768px| Panel a) przedstawia dwie hipotetyczne krzywe ERP, panel b) panel b i c komponenty z których powstały owe krzywe. Zmiana amplitudy komponentu oznaczonego kolorem powoduje zmianę amplitudy oznaczonych załamków ale także zmianę latencji wcześniejszego załamka. ]]&lt;br /&gt;
Poniżej kod odtwarzający powyższy przykład:&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
from __future__ import division&lt;br /&gt;
import numpy as np&lt;br /&gt;
from matplotlib.pyplot import plot, show, subplot, figure, title, xlabel, ylabel, ylim&lt;br /&gt;
&lt;br /&gt;
Fs = 1&lt;br /&gt;
t = np.arange(0,700)&lt;br /&gt;
&lt;br /&gt;
C1 = np.exp(-(t-100)**2/(2*30**2))&lt;br /&gt;
C2 = np.exp(-(t-200)**2/(2*50**2))&lt;br /&gt;
C3 = np.exp(-(t-350)**2/(2*100**2))&lt;br /&gt;
ERP1 = 0.5*C1-C2+C3&lt;br /&gt;
ERP2 = 0.5*C1-C2+1.5*C3&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
subplot(3,1,1)&lt;br /&gt;
plot(t,ERP1,'b', t,ERP2,'g')&lt;br /&gt;
plot(t[np.argmin(ERP1)],np.min(ERP1),'r.' )&lt;br /&gt;
plot(t[np.argmax(ERP1)],np.max(ERP1),'m.' )&lt;br /&gt;
plot(t[np.argmin(ERP2)],np.min(ERP2),'r.' )&lt;br /&gt;
plot(t[np.argmax(ERP2)],np.max(ERP2),'m.' )&lt;br /&gt;
&lt;br /&gt;
ylabel('a)',rotation='horizontal')&lt;br /&gt;
ylim([-1, 1.6])&lt;br /&gt;
&lt;br /&gt;
subplot(3,1,2)&lt;br /&gt;
plot(t,0.5*C1,'k',t,-C2,'k',t,C3,'b')&lt;br /&gt;
ylabel('b)',rotation='horizontal')&lt;br /&gt;
ylim([-1, 1.6])&lt;br /&gt;
&lt;br /&gt;
subplot(3,1,3)&lt;br /&gt;
plot(t,0.5*C1,'k',t,-C2,'k',t,1.5*C3,'g')&lt;br /&gt;
ylabel('c)',rotation='horizontal')&lt;br /&gt;
ylim([-1, 1.6])&lt;br /&gt;
&lt;br /&gt;
show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Instrukcje do ćwiczeń =&lt;br /&gt;
&lt;br /&gt;
==Zadanie 1: uśrednianie symulowanych sygnałów==&lt;br /&gt;
w tym ćwiczeniu chcemy pokazać efekty:&lt;br /&gt;
# uśredniania sygnałów związanych fazowo z bodźcem i nieskorelowanych z bodźcem / wpływ liczby realizacji,&lt;br /&gt;
# uśredniania sygnałów z fluktuacją latencji,&lt;br /&gt;
# wpływ filtrów o różnych funkcjach odpowiedzi impulsowej na morfologię uśrednionego potencjału.&lt;br /&gt;
&lt;br /&gt;
===Sygnały testowe===&lt;br /&gt;
Proszę zaimplementować funkcje generujące następujące przebiegi czasowe (oznaczenia: ''F&amp;lt;sub&amp;gt;s&amp;lt;/sub&amp;gt;'' &amp;amp;mdash; częstość próbkowania, ''T'' &amp;amp;mdash; czas trwania w sekundach, [[%C4%86wiczenia_1#Sygna.C5.82y_testowe|analogicznie do tego]]):&lt;br /&gt;
* sinusoida o zadanej częstości ''f'' i fazie &amp;lt;math&amp;gt;\phi&amp;lt;/math&amp;gt;: &amp;lt;tt&amp;gt;y = sin(f, phi, Fs, T)&amp;lt;/tt&amp;gt;,&lt;br /&gt;
* funkcja Gaussa o zadanym położeniu i szerokości &amp;lt;tt&amp;gt;y = g_1(t0, sigma, Fs, T) &amp;lt;/tt&amp;gt;&lt;br /&gt;
: &amp;lt;math&amp;gt;g_1(t) = \exp\left(-\frac{(t-t_0)^2}{2 \sigma^2}\right)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* pochodną funkcji Gaussa o zadanym położeniu i szerokości &amp;lt;tt&amp;gt;y = g_2(t0, sigma, Fs, T)&amp;lt;/tt&amp;gt;,&lt;br /&gt;
* połowę funkcji Gaussa o zadanym położeniu i szerokości &amp;lt;tt&amp;gt;y = g_3(t0, sigma, Fs, T)&amp;lt;/tt&amp;gt;,&lt;br /&gt;
: &amp;lt;math&amp;gt;g_{3}(t) = \left\{ &lt;br /&gt;
\begin{array}{lll}&lt;br /&gt;
0 &amp;amp; \mathrm{dla}&amp;amp; t&amp;lt;t_0 \\&lt;br /&gt;
\exp\left(-\frac{(t-t_0)^2}{2 \sigma^2}\right)&amp;amp; \mathrm{dla}&amp;amp; t \ge t_0  &lt;br /&gt;
\end{array}&lt;br /&gt;
\right. &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
W dalszych zadaniach tej sekcji przyjmiemy:&lt;br /&gt;
* ''T'' = 1 s,&lt;br /&gt;
* ''F&amp;lt;sub&amp;gt;s&amp;lt;/sub&amp;gt;'' = 128 Hz,&lt;br /&gt;
* ''t''&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; = 0,3 s,&lt;br /&gt;
* &amp;amp;sigma; = 0,02 s.&lt;br /&gt;
&lt;br /&gt;
===Uśrednianie w modelu addytywnym: sygnał + szum===&lt;br /&gt;
Dla funkcji &amp;lt;math&amp;gt;g_1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;g_2&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;g_3&amp;lt;/math&amp;gt;  wykonaj ''N'' symulacji sygnału opisanego daną funkcją z dodanym szumem gaussowskim (&amp;lt;tt&amp;gt;numpy.random.randn&amp;lt;/tt&amp;gt;). Zaobserwuj zmianę wariancji uśrednianego sygnału wraz z ''N''.&lt;br /&gt;
&lt;br /&gt;
===Uśrednianie w modelu addytywnym: sygnał + szum + niezależna czynność rytmiczna===&lt;br /&gt;
Powtórz poprzednie symulacje dokładając w każdej realizacji sinusoidę o losowo wybranej fazie. Symulacje wykonaj dla różnych częstości sinusoidy, takich których połówka okresu zbliżona jest do szerokości funkcji Gaussa, oraz znacząco od niej różnych.&lt;br /&gt;
&lt;br /&gt;
===Uśrednianie w modelu z resetem fazy===&lt;br /&gt;
Zbuduj sygnał składający się z dwóch fragmentów sinusoidy o częstości ''f'': &lt;br /&gt;
* pierwszy fragment ma losową fazę,&lt;br /&gt;
* drugi fragment ma fazę równą 0.&lt;br /&gt;
Wykonaj ''N'' realizacji takiego sygnału, przy czym każda realizacja ma częstość losowaną z rozkładu Gaussa o średniej 10 i pewnej wariancji (czyli &amp;lt;math&amp;gt;f \in \mathrm{N}(10,\sigma)&amp;lt;/math&amp;gt;). &lt;br /&gt;
Uśrednij otrzymane realizacje. Zaobserwuj zależność średniej od liczby uśrednianych realizacji i od wariancji częstości.&lt;br /&gt;
&lt;br /&gt;
===Uśrednianie potencjału z fluktuacją latencji===&lt;br /&gt;
Wygeneruj sygnały składające się z funkcji &amp;lt;math&amp;gt;g_1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;g_2&amp;lt;/math&amp;gt; albo &amp;lt;math&amp;gt;g_3&amp;lt;/math&amp;gt; z fluktuującą latencją, tzn. z wartością &amp;lt;math&amp;gt;t_0&amp;lt;/math&amp;gt; pochodzącą z jakiegoś rozkładu prawdopodobieństwa. U nas dla ustalenia uwagi niech będzie to rozkład Gaussa. Wykonaj zestaw symulacji obrazujący zależność od liczby realizacji i od wielkości fluktuacji, mierzonej przez wariancję rozkładu. Czy jest związek pomiędzy wariancją fluktuacji &amp;lt;math&amp;gt;t_0&amp;lt;/math&amp;gt; a szerokością załamków?&lt;br /&gt;
&lt;br /&gt;
===Wpływ filtrów===&lt;br /&gt;
# Zaprojektuj następujące filtry (przyjmij częstość próbkowania 128 Hz):&lt;br /&gt;
#* dolnoprzepustowy: Butterwortha z częstością odcięcia: 30, 40, 50 Hz, i rzędach od 1 do 5 (funkcja butter w module scipy.signal),&lt;br /&gt;
#* górnoprzepustowy: Butterwortha z częstością odcięcia: 0,1, 0,5, 2 i 5 Hz, i rzędach od 1 do 5,&lt;br /&gt;
#* notch: Czybyszewa II rodzaju z pasmem zaporowym ustawionym na 50 Hz, i rzędach od 1 do 3 (funkcja cheby2),&lt;br /&gt;
# Zbadaj funkcję odpowiedzi impulsowej i funkcję przenoszenia tych filtrów (w skali dB). Zaobserwuj jak długa jest odpowiedź impulsowa i jak daleko od częstości odcięcia zaburzone jest pasmo przenoszenia.&lt;br /&gt;
# Zastosuj powyższe filtry do funkcji &amp;lt;math&amp;gt;g_1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;g_2&amp;lt;/math&amp;gt; albo &amp;lt;math&amp;gt;g_3&amp;lt;/math&amp;gt;. Filtrowanie przeprowadź w jedną (lfilter) oraz w dwie strony (filtfilt). Zaobserwuj związek między zniekształceniem wprowadzanym przez filtr a funkcją odpowiedzi impulsowej filtru.&lt;br /&gt;
# W ćwiczeniu tym posłuż się symulowanymi sygnałami uzyskanymi z modelu addytywnego: &amp;amp;bdquo;sygnał+szum&amp;amp;rdquo;. Dla funkcji &amp;lt;math&amp;gt;g_1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;g_2&amp;lt;/math&amp;gt; albo &amp;lt;math&amp;gt;g_3&amp;lt;/math&amp;gt;  wykonaj ''N'' = 60 realizacji sygnału opisanego daną funkcją z dodanym szumem gaussowskim (&amp;lt;tt&amp;gt;numpy.random.randn&amp;lt;/tt&amp;gt;). Każdą z realizacji przefiltruj, a następnie uśrednij uzyskane sygnały.&lt;br /&gt;
&lt;br /&gt;
==Zadanie 2: rejestracje i analiza potencjałów wzrokowych==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;! -- ===Synchronizacja występowania bodźców z sygnałem EEG===&lt;br /&gt;
&lt;br /&gt;
Rejestracja potencjałów wywołanych jest przykładem pomiaru czynności elektrycznej mózgu w odpowiedzi na określony bodziec. W przypadku tego rodzaju pomiarów konieczna jest synchronizacja momentu wystąpienia bodźca z sygnałem EEG. Wzmacniacze do pomiaru czynności elektrycznej mózgu wyposażone są w specjalne wejścia, na które można podawać sygnał odpowiadający pojawianiu się bodźca. Jak pamiętamy z zeszłego semestru, wejście to (jak i podawany na nie sygnał) nazywamy trigerem (ang. ''trigger'' &amp;amp;mdash; spust, cyngiel, wyzwalacz). W najprostszym przypadku, bodziec moglibyśmy wyświetlać na monitorze komputerowym, a sygnał związany z jego wystąpieniem wysyłać przez któryś z portów komputera (LPT, COM) na wzmacniacz EEG. Niestety, obecnie dostępne i popularne systemy operacyjne, takie jak Windows czy Linux nie są systemami czasu rzeczywistego (http://pl.wikipedia.org/wiki/System_operacyjny_czasu_rzeczywistego). Od momentu wyświetlania bodźca na ekranie, do pojawiania się sygnału odpowiednim porcie komputerowym może upłynąć kilkadziesiąt milisekund i co gorsza czas ten zwykle jest losowy. W przypadku gdy wzmacniacz próbkuje sygnał z częstością 1000 Hz, moment wystąpienia bodźca możemy określić z dokładnością 1 ms, jednakże wspomniane opóźnienia w systemie operacyjnym uniemożliwiają to. Ponadto, jak dowiedzieliśmy się w rozdziale wstępnym [http://brain.fuw.edu.pl/edu-wiki/action/edit/EEG:Potencja%C5%82y_wywo%C5%82ane?section=T-1], pierwsze załamki związane z potencjałami wywołanymi pojawiają się już 10 ms po wystąpieniu bodźca. W związku z tym, losowe, rzędu kilkudziesięciu milisekund opóźnienia sygnału określającego moment pojawienia się bodźca względem jego rzeczywistego wystąpienia są niedopuszczalne.&lt;br /&gt;
Istnieją pewne techniki programowania, dzięki którym opisywane opóźnienia można zmniejszyć, jednakże są one bardzo trudne  do realizacji. Ponadto, standardowe porty komputera, takie jak LPT, czy COM zostały zaprojektowane przede wszystkim do sterowania urządzeniami zewnętrznymi, a nie ich zasilania. Przykładowo, jedna linia portu drukarkowego (LPT) może być obciążona prądem nie większym niż 5 mA, podczas gdy do zapalenie zwykłej diody LED potrzeba około 10 mA. Taki pobór prądu możliwy jest do uzyskania z portu USB, jednakże  jest on  wyjątkowo trudny do oprogramowania.  &lt;br /&gt;
W celu ominięcia powyższych niedogodności w Zakładzie Fizyki Biomedycznej UW w przeprowadzanych eksperymentach wykorzystywane są  mikrokontrolery [http://pl.wikipedia.org/wiki/Mikrokontroler], w szczególności ATmega16 i ATmega32.  Mikrokontrolery te wyposażone są w procesory o architekturze RISC [http://pl.wikipedia.org/wiki/RISC] i mocy obliczeniowej porównywalnej z szeroko stosowanym kiedyś w komputerach ZX Spectrum, Commodore, Amiga i Atari procesorem Z80. Oprócz jednostki centralnej mikrokontrolery zawierają   stałą pamięć FLASH przeznaczoną do przechowywania kodu programu, pamięć  RAM i pamięć EEPROM, liczniki 8- i 16-bitowe, komparatory, przetworniki analogowo-cyfrowe, porty wejścia/wyjścia, łącze RS232 (popularnie nazywane portem szeregowym) i układy przerwań.&lt;br /&gt;
&lt;br /&gt;
Mikrokontrolery wchodzące w skład zestawów pomiarowych na Pracowni EEG zawierają program, który umożliwia komunikację z nimi poprzez port szeregowy. Obecnie, komputery są coraz rzadziej wyposażane w porty szeregowe. Standard komunikacji RS-232, opracowany w 1962 roku  nadal jest jednak popularny i często wykorzystywany do komunikacji miedzy urządzeniami.  W celu połączenia komputera posiadającego tylko porty USB z mikrokontrolerem zastosowano przejściówkę USB/RS-232. &lt;br /&gt;
&lt;br /&gt;
Jak każde urządzenie w systemie Linuks, przejściówka USB/RS-232 widoczna jest jako plik, znajdujący się w katalogu &amp;lt;tt&amp;gt;/dev&amp;lt;/tt&amp;gt;. Nazwy plików obsługujących urządzenia szeregowe to &amp;lt;tt&amp;gt;ttyXY&amp;lt;/tt&amp;gt;, gdzie &amp;lt;tt&amp;gt;XY&amp;lt;/tt&amp;gt; to kolejny numer przydzielony do urządzenia szeregowego.&lt;br /&gt;
Do komunikacji komputera z mikroknotrolerem  w Zakładzie Fizyki Biomedycznej UW została napisana prosta biblioteka.  Jej użycie jest następujące:&lt;br /&gt;
* Po podłączeniu przejściówki USB/RS232 do komputera mikrokontrolera sprawdź jaki plik w katalogu &amp;lt;tt&amp;gt;/dev&amp;lt;/tt&amp;gt; został utworzony i przydzielony do urządzenia. &lt;br /&gt;
* Zaimportuj bibliotekę do komunikacji z mikrokontrolerem: &lt;br /&gt;
: &amp;lt;tt&amp;gt;import SerialPort as SP&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Otwórz plik powiązany z urządzeniem zewnętrznym:&lt;br /&gt;
: &amp;lt;tt&amp;gt;sp = SP.SerialPort(nazwa_pliku) &amp;lt;/tt&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
: &amp;lt;tt&amp;gt;sp.open()&amp;lt;/tt&amp;gt;&lt;br /&gt;
W naszym przypadku prawidłowa nazwa pliku to &amp;lt;tt&amp;gt;/dev/ttyUSB0&amp;lt;/tt&amp;gt;.&lt;br /&gt;
* Po włączeniu zasilania mikrokontrolera, diody podłączone do niego i wykorzystywane w eksperymencie z potencjałami wywołanymi będą zapalone. Następujące polecenie zgasi obydwie diody:&lt;br /&gt;
: &amp;lt;tt&amp;gt;sp.blinkP300([0, 0])&amp;lt;/tt&amp;gt;&lt;br /&gt;
* Wydanie poniższego polecenia spowoduje, iż mikrokontroler zapali podłączoną do niego diodę numer 1 na czas 100 ms, zaś diodę numer 2 na 200 ms. Jednocześnie, w momencie włączenia jak i wyłączenia diody, sygnał z mikrokontrolera zostanie wysłany na 5-stykowe wejście AUX mikrokontrolera:&lt;br /&gt;
: &amp;lt;tt&amp;gt;sp.blinkP300([100, 200])&amp;lt;/tt&amp;gt;&lt;br /&gt;
* Jeśli chcemy zapalić tylko diodę numer dwa, np. na czas 500 ms w programie podajemy następującą instrukcję:&lt;br /&gt;
: &amp;lt;tt&amp;gt;sp.blinkP300([0, 500])&amp;lt;/tt&amp;gt;&lt;br /&gt;
* Jeśli chcemy zakończyć komunikację z mikrokontrolerem piszemy:&lt;br /&gt;
: &amp;lt;tt&amp;gt;sp.close()&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Kod biblioteki do komunikacji z mikrokontrolerem:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;!--  Kod w Pythonie 2&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# -*- coding: cp1250 -*-&lt;br /&gt;
import serial&lt;br /&gt;
import logging&lt;br /&gt;
import sys&lt;br /&gt;
import os&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def to_hex_word(a):&lt;br /&gt;
    '''encodes a decimal number hexadecimally on two bytes'''&lt;br /&gt;
    return chr(a%256) + chr(a/256)&lt;br /&gt;
&lt;br /&gt;
class SerialPort(object):&lt;br /&gt;
    def __init__(self, port_name):&lt;br /&gt;
        import serial&lt;br /&gt;
        try:&lt;br /&gt;
            self.port = serial.Serial(&lt;br /&gt;
                port=port_name,&lt;br /&gt;
                baudrate=9600,&lt;br /&gt;
                bytesize=serial.EIGHTBITS,&lt;br /&gt;
                parity=serial.PARITY_NONE,&lt;br /&gt;
                stopbits=serial.STOPBITS_ONE,&lt;br /&gt;
                xonxoff=False&lt;br /&gt;
                )&lt;br /&gt;
        except serial.SerialException as e:&lt;br /&gt;
            print(&amp;quot;Nieprawidłowa nazwa portu lub port zajęty.&amp;quot;)&lt;br /&gt;
            raise e&lt;br /&gt;
        self.close()&lt;br /&gt;
        &lt;br /&gt;
    def open(self):&lt;br /&gt;
        self.port.open()&lt;br /&gt;
&lt;br /&gt;
    def close(self):&lt;br /&gt;
        self.port.close()&lt;br /&gt;
&lt;br /&gt;
    def send(self, value):&lt;br /&gt;
        self.port.write(value)&lt;br /&gt;
                           &lt;br /&gt;
    def blinkSSVEP(self,d, p1, p2):&lt;br /&gt;
        '''&lt;br /&gt;
        d = list of frequencies;&lt;br /&gt;
        p1:p2 = ratio LED_on_time/LED_off_time&lt;br /&gt;
        if you want i-th LED to be OFF all the time send  d[i] = 0&lt;br /&gt;
        if you want i-th LED to be ON all the time send  d[i] = -1&lt;br /&gt;
        in these two cases p1 and p2 do not matter&lt;br /&gt;
        '''&lt;br /&gt;
        clock  = 62500&lt;br /&gt;
        factor = float(p1) / float(p1 + p2)&lt;br /&gt;
    &lt;br /&gt;
        str = chr(3) # 'SSVEP_RUN'&lt;br /&gt;
&lt;br /&gt;
        for i in range(len(d)):&lt;br /&gt;
            # i-th LED OFF&lt;br /&gt;
            if d[i] == 0:                       &lt;br /&gt;
                str += to_hex_word(0) + to_hex_word(255) &lt;br /&gt;
            # i-th LED ON&lt;br /&gt;
            elif d[i] == -1:&lt;br /&gt;
                str += to_hex_word(255) + to_hex_word(0)&lt;br /&gt;
                #str = 'S'&lt;br /&gt;
                # i-th LED blinks d[i] times per second&lt;br /&gt;
                # p1:p2 = on_time:off_time in one blink&lt;br /&gt;
            else:&lt;br /&gt;
                period = clock/d[i]&lt;br /&gt;
                bright = int((clock/d[i]) * factor)&lt;br /&gt;
                dark = period - bright&lt;br /&gt;
                str += to_hex_word(bright) + to_hex_word(dark)&lt;br /&gt;
&lt;br /&gt;
        self.send(str)&lt;br /&gt;
&lt;br /&gt;
    def blinkP300(self,d):&lt;br /&gt;
        clock  = 62500&lt;br /&gt;
        str = chr(4) # 'P300_RUN'&lt;br /&gt;
&lt;br /&gt;
        for i in range(len(d)):&lt;br /&gt;
            period = int(clock*d[i]/1000.0)&lt;br /&gt;
            str += to_hex_word(period)&lt;br /&gt;
            print(period)&lt;br /&gt;
&lt;br /&gt;
        self.send(str)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
--&amp;gt; &amp;lt;!-- Kod w Pythonie 3 --&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# -*- coding: cp1250 -*-&lt;br /&gt;
import serial&lt;br /&gt;
import logging&lt;br /&gt;
import sys&lt;br /&gt;
import os&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
def to_hex_word(a):&lt;br /&gt;
    '''encodes a decimal number hexadecimally on two bytes'''&lt;br /&gt;
    return a.to_bytes(2,byteorder=sys.byteorder)&lt;br /&gt;
 &lt;br /&gt;
class SerialPort(object):&lt;br /&gt;
    def __init__(self, port_name):&lt;br /&gt;
        import serial&lt;br /&gt;
        try:&lt;br /&gt;
            self.port = serial.Serial(&lt;br /&gt;
                port=port_name,&lt;br /&gt;
                baudrate=9600,&lt;br /&gt;
                bytesize=serial.EIGHTBITS,&lt;br /&gt;
                parity=serial.PARITY_NONE,&lt;br /&gt;
                stopbits=serial.STOPBITS_ONE,&lt;br /&gt;
                xonxoff=False&lt;br /&gt;
                )&lt;br /&gt;
        except serial.SerialException as e:&lt;br /&gt;
            print(&amp;quot;Nieprawidłowa nazwa portu lub port zajęty.&amp;quot;)&lt;br /&gt;
            raise e&lt;br /&gt;
        self.close()&lt;br /&gt;
 &lt;br /&gt;
    def open(self):&lt;br /&gt;
        self.port.open()&lt;br /&gt;
 &lt;br /&gt;
    def close(self):&lt;br /&gt;
        self.port.close()&lt;br /&gt;
 &lt;br /&gt;
    def send(self, value):&lt;br /&gt;
        self.port.write(value)&lt;br /&gt;
 &lt;br /&gt;
    def blinkSSVEP(self,d, p1, p2):&lt;br /&gt;
        '''&lt;br /&gt;
        d = list of frequencies;&lt;br /&gt;
        p1:p2 = ratio LED_on_time/LED_off_time&lt;br /&gt;
        if you want i-th LED to be OFF all the time send  d[i] = 0&lt;br /&gt;
        if you want i-th LED to be ON all the time send  d[i] = -1&lt;br /&gt;
        in these two cases p1 and p2 do not matter&lt;br /&gt;
        '''&lt;br /&gt;
        clock  = 62500&lt;br /&gt;
        factor = float(p1) / float(p1 + p2)&lt;br /&gt;
 &lt;br /&gt;
        str = (3).to_bytes(1,byteorder=sys.byteorder) # 'SSVEP_RUN'&lt;br /&gt;
 &lt;br /&gt;
        for i in range(len(d)):&lt;br /&gt;
            # i-th LED OFF&lt;br /&gt;
            if d[i] == 0:                       &lt;br /&gt;
                str += to_hex_word(0) + to_hex_word(255) &lt;br /&gt;
            # i-th LED ON&lt;br /&gt;
            elif d[i] == -1:&lt;br /&gt;
                str += to_hex_word(255) + to_hex_word(0)&lt;br /&gt;
                #str = 'S'&lt;br /&gt;
                # i-th LED blinks d[i] times per second&lt;br /&gt;
                # p1:p2 = on_time:off_time in one blink&lt;br /&gt;
            else:&lt;br /&gt;
                period = clock/d[i]&lt;br /&gt;
                bright = int((clock/d[i]) * factor)&lt;br /&gt;
                dark = int(period - bright)&lt;br /&gt;
                str += to_hex_word(bright) + to_hex_word(dark)&lt;br /&gt;
 &lt;br /&gt;
        self.send(str)&lt;br /&gt;
 &lt;br /&gt;
    def blinkP300(self,d):&lt;br /&gt;
        clock  = 62500&lt;br /&gt;
        str = (4).to_bytes(1,byteorder=sys.byteorder) # 'P300_RUN'&lt;br /&gt;
 &lt;br /&gt;
        for i in range(len(d)):&lt;br /&gt;
            period = int(clock*d[i]/1000.0)&lt;br /&gt;
            str += to_hex_word(period)&lt;br /&gt;
 &lt;br /&gt;
        self.send(str)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
--&amp;gt; &lt;br /&gt;
&lt;br /&gt;
===Zestaw eksperymentalny===&lt;br /&gt;
Zestaw składa się ze:&lt;br /&gt;
* wzmacniacza,&lt;br /&gt;
* stymulatora   &lt;br /&gt;
&amp;lt;!--* izolowanego galwanicznie układu generującego impulsy odpowiadające gaszeniu i zapalaniu diody,  o wartościach dopasowanych do akceptowalnych przez wejścia AUX wzmacniacza,--&amp;gt;&lt;br /&gt;
* komputera: w tym eksperymencie komputer będzie służył do zaprogramowania stymulatora i do rejestracji sygnałów.&lt;br /&gt;
&lt;br /&gt;
===Wersja 1: obserwacja błyskającej diody  ===&lt;br /&gt;
&amp;lt;!--Proszę zapoznać się ze standardami rejestracji wzrokowych potencjałów wywołanych [http://www.gcu.ac.uk/media/gcalwebv2/theuniversity/academicschools/sls/psytimetables/SLS%20-%20VEP_Standard_2010.pdf] --&amp;gt;&lt;br /&gt;
Proszę zapoznać się z typowym wyglądem załamków w przypadku potencjałów wzrokowych, jaki jest przedstawiony na [https://link.springer.com/article/10.1007/s10633-009-9195-4/figures/2 rysunku] (cały artykuł jest dostępny [http://link.springer.com/article/10.1007%2Fs10633-009-9195-4 tu]).&lt;br /&gt;
&amp;lt;!--[[Plik:Fig 4 VEP.jpg|thumb|320px|right|&amp;lt;figure id=&amp;quot;fig:zalamki_VEP&amp;quot;&amp;gt;&amp;lt;/figure&amp;gt;&lt;br /&gt;
&amp;lt;xr id=&amp;quot;fig:zalamki_VEP&amp;quot;&amp;gt;Rys. %i.&amp;lt;/xr&amp;gt; Schemat załamków rozpoznawanych we wzrokowych potencjach wywołanych (z pracy: J. V. Odom i in. &amp;amp;bdquo;ISCEV standard for clinical visual evoked potentials&lt;br /&gt;
(2009 update)&amp;amp;rdquo;, Doc Ophthalmol (2010), 120:111–119).]]&lt;br /&gt;
--&amp;gt; &lt;br /&gt;
&lt;br /&gt;
==== Rejestracja ====&lt;br /&gt;
* Paradygmat: z odległości około 40 cm badany obserwuje wyświetalny na ekranie biały kwadrat. Bodźce trwają 300 ms i  powtarzają się co 0.5 sekundy. Bodziec poprzedza punkt fiksacji pokazywany przez 300 ms. Natężenie bodźca ma przyjąć jedną z 4 wartości (manipulujemy jego przeźroczystością: 1, 0.7, 0.3 i 0.1, gdzie 1 oznacza brak przeźroczystości). Każda z intensywności bodźca ma pojawić się 100 razy podczas badania, bodźce podawane mają być w sposób losowy. Zadanie poprzedza krótka instrukcja, kończy podziękowanie. &lt;br /&gt;
&lt;br /&gt;
* Pomiar&lt;br /&gt;
**Zakładamy czepek i elektrody w systemie 10-20, dbamy o to by opory pomiędzy elektrodami były poniżej 10 k&amp;amp;Omega; i różnice pomiędzy oporami różnych elektrod nie przekraczały 20%. [[Plik:Glowka10-20 ERPy.svg|thumb|600px|right]]&lt;br /&gt;
** Elektrodę GND mocujemy w otworze czepka odpowiadającym pozycji AFz (na linii centralnej 10% w stronę nosa od elektrody Fz) &lt;br /&gt;
** Montujemy także elektrody M1 i M2 i FCz.&lt;br /&gt;
&lt;br /&gt;
==== Analiza ====&lt;br /&gt;
# Filtrujemy sygnał w paśmie 1-20 Hz.&lt;br /&gt;
# Z ciągłego zapisu wycinamy fragmenty od &amp;amp;minus;300 ms do +800 ms (zero oznacza moment wystąpienia bodźca). W czasie wycinania badamy wycinane fragmenty pod względem zakresu amplitudy (wszystkie kanały powinny mieć amplitudę w granicach &amp;amp;plusmn;75 &amp;amp;mu;V) i zawartości artefaktów od mrugania (w tym celu trzeba oglądając sygnał w SVAROG-u ustalić próg na amplitudę sygnału w kanałach Fp1 i Fp2).&lt;br /&gt;
# Uśredniamy wycięte sygnały.&lt;br /&gt;
# Rysujemy średni potencjał we wszystkich kanałach.&lt;br /&gt;
# Pierwszy sposób: Identyfikujemy załamki P1 i N2. Mierzymy amplitudę P1 jako różnicę między ekstremalną wartością załamka N2 a ekstremalną wartością załamka N2. &lt;br /&gt;
# Drugi sposób: Identyfikujemy załamki P1 i N2. Mierzymy amplitudę P1 w stosunku do zera. &lt;br /&gt;
#porównujemy uzyskane amplitudy w 4 warunkach za pomocą odpowiedniego testu statystycznego (porównanie warunków ze skrajnymi wartościami amplitudy - zastosuj test permutacyjny (opisany poniżej) lub test t-Studenta/nieparametryczny odpowiednik). &lt;br /&gt;
&lt;br /&gt;
**Opis testu permutacyjnego &lt;br /&gt;
Pytanie: Czy intensywność bodźca wpływa na amplitudę potencjału P1?&lt;br /&gt;
Jak stwierdzić czy amplitudy załamków P1 istotnie różnią się pomiędzy seriami?&lt;br /&gt;
&lt;br /&gt;
Musimy przeprowadzić test statystyczny. Możemy skonstruować go np. tak:&lt;br /&gt;
Mamy dwa warunki I i II. Jako statystykę przyjmiemy różnicę pomiędzy amplitudą załamka zmierzoną w serii z dwoma diodami (P2&amp;lt;sub&amp;gt;II&amp;lt;/sub&amp;gt;) a amplitudą zmierzoną w serii z jedną diodą (P2&amp;lt;sub&amp;gt;I&amp;lt;/sub&amp;gt;):&lt;br /&gt;
: ''S'' = P2&amp;lt;sub&amp;gt;II&amp;lt;/sub&amp;gt; &amp;amp;minus; P2&amp;lt;sub&amp;gt;I&amp;lt;/sub&amp;gt;&lt;br /&gt;
Postawmy hipotezę zerową, że nie ma różnicy w amplitudzie pomiędzy warunkiem II a I oraz hipotezę alternatywną, że różnica taka występuje.&lt;br /&gt;
: H&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;: ''S'' = 0&lt;br /&gt;
: H&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;: ''S'' &amp;amp;ne; 0&lt;br /&gt;
Zgodnie z H&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; dla wartości ''S'' nie ma różnicy czy realizacja została zarejestrowana w warunkach I czy II, zatem można losowo poprzypisywać numery warunków do realizacji i w ten sposób uzyskać rozkład statystyki ''S'' pod warunkiem prawdziwości H&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;, czyli obliczyć średnie potencjały dla &amp;amp;bdquo;pomieszanych&amp;amp;rdquo; tagów, wyliczyć średnie potencjały dla sztucznie wygenerowaych grup, i wyliczyć różnicę amplitud dla tych średnich, czyli wartość statystyki dla hipotezy H&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Zaimplementuj test permutacyjny zgodny z powyższą koncepcją.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- ===Wersja 2: obserwacja habituacji / uśrednianie w blokach ===&lt;br /&gt;
==== Rejestracja ====&lt;br /&gt;
# Paradygmat: &lt;br /&gt;
#* z odległości około 40 cm badany obserwuje błyski diody. &lt;br /&gt;
#* Błyski powtarzają się co 0,5 sekundy. &lt;br /&gt;
#* Rejestrujemy 60 serii po 15 błysków.  &lt;br /&gt;
#* Pomiędzy seriami badany odpoczywa około 10 sekund.&lt;br /&gt;
# Zakładamy czepek i elektrody w systemie 10-20, dbamy o to by opory pomiędzy elektrodami były poniżej 5 k&amp;amp;Omega; i różnice pomiędzy oporami różnych elektrod nie przekraczały 20%.&lt;br /&gt;
#* Elektrodę GND mocujemy w otworze czepka odpowiadającym pozycji AFz (na linii centralnej 10% w stronę nosa od elektrody Fz) &lt;br /&gt;
#* Montujemy także elektrodę FCz (na linii centralnej pomiędzy Fz a Cz), będziemy jej używać w montażu i w czasie analizy jako referencji.&lt;br /&gt;
#* Częstość próbkowania 512 Hz.&lt;br /&gt;
&lt;br /&gt;
==== Analiza ====&lt;br /&gt;
# Filtrujemy sygnał w paśmie 0,1-20 Hz.&lt;br /&gt;
# Z ciągłego zapisu wycinamy fragmenty od &amp;amp;minus;300 ms do +600 ms (zero oznacza moment wystąpienia bodźca). W czasie wycinania badamy wycinane fragmenty pod względem zakresu amplitudy (wszystkie kanały powinny mieć amplitudę w granicach &amp;amp;plusmn;75 &amp;amp;mu;V) i zawartości artefaktów od mrugania (w tym celu trzeba oglądając sygnał w SVAROG-u ustalić próg na amplitudę sygnału w kanałach Fp1 i Fp2).&lt;br /&gt;
# Uśredniamy wycięte sygnały o tym samym numerze wewnątrz serii.&lt;br /&gt;
# Rysujemy serie 15 uśrednionych potencjałów dla tego kanału, który wykazywał najsilniejszy potencjał w pierwszej wersji eksperymentu. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Zadanie 3: rejestracja i analiza potencjału P3 ==&lt;br /&gt;
==== Rejestracja ====&lt;br /&gt;
# Paradygmat: &lt;br /&gt;
#* z odległości około 40 cm badany obserwuje błyski diody. &lt;br /&gt;
#* Błyski diody nr 1 powtarzają się co 1&amp;amp;plusmn;0,1 sekundy. &lt;br /&gt;
#* W losowych realizacjach zapalana jest także dioda nr 2. &lt;br /&gt;
#* Proporcja pomiędzy liczbą błysków pojedynczych i podwójnych powinna wynosić 10:2, przy czym błyski podwójne muszą być odseparowane co najmniej jednym błyskiem pojedynczym. &lt;br /&gt;
#* Czas zapalenia diod, tak jak w poprzednich eksperymentach, wynosi 20 ms. &lt;br /&gt;
#* Zadaniem badanego jest liczenie liczby błysków podwójnych.&lt;br /&gt;
#* Wykonujemy tyle realizacji aby zarejestrować 50 powtórzeń podwójnych błysków. &lt;br /&gt;
# Zakładamy czepek i elektrody w systemie 10-20, dbamy o to by opory pomiędzy elektrodami były poniżej 5 k&amp;amp;Omega; i różnice pomiędzy oporami różnych elektrod nie przekraczały 20%.&lt;br /&gt;
#* Elektrodę GND mocujemy w otworze czepka odpowiadającym pozycji AFz (na linii centralnej 10% w stronę nosa od elektrody Fz) &lt;br /&gt;
#* Montujemy także elektrody M1 i M2, będziemy ich używać w montażu i w czasie analizy jako referencji typu połączone uszy.&lt;br /&gt;
#* Częstość próbkowania 512 Hz.&lt;br /&gt;
&lt;br /&gt;
==== Analiza ====&lt;br /&gt;
# Filtrujemy sygnał w paśmie 0,1-20 Hz.&lt;br /&gt;
# Z ciągłego zapisu wycinamy fragmenty od &amp;amp;minus;300 ms do +600 ms (zero oznacza moment wystąpienia bodźca). W czasie wycinania badamy wycinane fragmenty pod względem zakresu amplitudy (wszystkie kanały powinny mieć amplitudę w granicach &amp;amp;plusmn;75 &amp;amp;mu;V) i zawartości artefaktów od mrugania (w tym celu trzeba oglądając sygnał w SVAROG-u ustalić próg na amplitudę sygnału w kanałach Fp1 i Fp2).&lt;br /&gt;
# Uśredniamy osobno realizacje błysków pojedynczych i błysków podwójnych.&lt;br /&gt;
# Nakładamy na siebie na rysunkach oba typy średnich.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Ćwiczenie dodatkowe: P300 BCI==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wykorzystujemy elektrody z systemu 10-10 umieszczone nad korą wzrokową: P07, O1, O2, PO8, PO3, PO4, Pz, Cz.&lt;br /&gt;
&lt;br /&gt;
Uruchamiamy &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
obci_gui --presets eeg_workshop&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
i z guzika &amp;amp;bdquo;select amplifier&amp;amp;rdquo; wybieramy właściwy wzmacniacz.&lt;br /&gt;
&lt;br /&gt;
Do kontroli jakości sygnału możemy uruchomić Svaroga.&lt;br /&gt;
&lt;br /&gt;
Dane z kalibracji zapisują się w pliku test1 w katalogu domowym użytkownika, z labiryntu w pliku test2.&lt;br /&gt;
&lt;br /&gt;
Po zakończeniu kalibracji pojawia się napis &amp;amp;bdquo;Trwają obliczenia&amp;amp;rdquo; lub podobny. Odczekujemy kilka minut, aż skończy się peer &amp;amp;bdquo;Calibration&amp;amp;rdquo; (widoczny w obci_gui) i zamykamy okienko klawiszami Alt-F4 lub zatrzymując scenariusz guzikiem &amp;amp;bdquo;Stop&amp;amp;rdquo;. W katalogu domowym pojawi się plik z wynikami kalibracji, co pozwala na uruchomienie scenariusza &amp;amp;bdquo;labirynt&amp;amp;rdquo;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Po zebraniu danych, przed wczytaniem ich do Svaroga należy w tym samym katalogu uruchomić skrypt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
#!/usr/bin/env python&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
&lt;br /&gt;
from obci.analysis.obci_signal_processing.tags import tags_file_writer&lt;br /&gt;
from obci.analysis.obci_signal_processing.read_manager import ReadManager&lt;br /&gt;
&lt;br /&gt;
def main(): &lt;br /&gt;
	file_name = 'test1'&lt;br /&gt;
	&lt;br /&gt;
	mgr = ReadManager(&lt;br /&gt;
		file_name + '.obci.xml',&lt;br /&gt;
		file_name + '.obci.raw',&lt;br /&gt;
		file_name + '.obci.tag')&lt;br /&gt;
	&lt;br /&gt;
	tags = mgr.get_tags()&lt;br /&gt;
	for i in xrange(0, len(tags)):&lt;br /&gt;
		if tags[i]['desc']['index'] == tags[i]['desc']['target']:&lt;br /&gt;
			tags[i]['name'] = 'blink_target'&lt;br /&gt;
		else:&lt;br /&gt;
			tags[i]['name'] = 'blink'&lt;br /&gt;
			&lt;br /&gt;
	tags_writer = tags_file_writer.TagsFileWriter(file_name + '.obci.tag')&lt;br /&gt;
	for tag in tags:&lt;br /&gt;
		tags_writer.tag_received(tag)		&lt;br /&gt;
	tags_writer.finish_saving(0)	&lt;br /&gt;
 &lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Aduszyk</name></author>
		
	</entry>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=Pracownia_EEG/Potencja%C5%82y_wywo%C5%82ane&amp;diff=8970</id>
		<title>Pracownia EEG/Potencjały wywołane</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=Pracownia_EEG/Potencja%C5%82y_wywo%C5%82ane&amp;diff=8970"/>
		<updated>2022-11-08T10:35:15Z</updated>

		<summary type="html">&lt;p&gt;Aduszyk: /* Wersja 1: obserwacja błyskającej diody */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Pracownia EEG|Pracownia EEG]] / Potencjały wywołane&lt;br /&gt;
&lt;br /&gt;
=Wstęp=&lt;br /&gt;
==Potencjały wywołane==&lt;br /&gt;
=== Wstęp ===&lt;br /&gt;
Potencjały wywołane EEG (ang. ''evoked potentials'', EP) są śladami odpowiedzi mózgu na bodźce. W przypadku MEG poprawnie mówi się o polach wywołanych (ang. ''evoked fields'', EF).&lt;br /&gt;
Zwykle reakcja ta jest mała (wyjątek stanowią [[Elektroencefalografia/Metody_analizy_sygnałów_EEG_-_analiza_w_dziedzinie_czasu |kompleksy K]]) i w zapisie pojedynczej realizacji reakcji na bodziec najczęściej niewidoczna wśród czynności pochodzącej od wielu innych procesów zachodzących w tym samym czasie w mózgu. &lt;br /&gt;
Ich wyodrębnienie z tak zwanego tła EEG/MEG, czyli manifestacji elektrycznej innych, trwających w tym samym czasie w mózgu procesów (aktywny prąd niezależny), wymaga w dniu dzisiejszym zapisu odpowiedzi na szereg powtórzeń tego samego bodźca (&amp;lt;xr id=&amp;quot;fig:EP&amp;quot;&amp;gt;rys. %i&amp;lt;/xr&amp;gt;). Pierwsze potencjały wywołane pokazał pod koniec lat 40-tych Dawson (Dawson 1947) wykonując superpozycję pojedynczych realizacji na kliszy fotograficznej.&lt;br /&gt;
Z czasem skomplikowane urządzenia analogowe zastąpione zostały przez cyfrowe uśrednianie kolejnych fragmentów EEG, zsynchronizowanych według momentu wystąpienia bodźca, łatwo realizowane za pomocą komputera.&lt;br /&gt;
&lt;br /&gt;
[[Grafika:EP.png|thumb|640px|center|&amp;lt;figure id=&amp;quot;fig:EP&amp;quot;&amp;gt;&amp;lt;/figure&amp;gt;&lt;br /&gt;
Uśrednianie potencjałów wywołanych. a) ciągły zapis EEG z wyróżnionymi momentami wystąpienia bodźca (w tym przypadku słuchowego) b) kilkadziesiąt kolejnych odcinków, wyciętych jako sekunda EEG od momentu wystąpienia kolejnych bodźców, ustawione jeden pod drugim c) uśredniony potencjał wywołany &amp;amp;mdash; widać m. in. załamek P300 ok. 300 milisekund po bodźcu]]&lt;br /&gt;
&lt;br /&gt;
Techniki te opierają się na założeniu, że zawarta w EEG odpowiedź mózgu na każdy z kolejnych bodźców jest niezmienna, a EEG odzwierciedlające pozostałe procesy traktowane jest jak nieskorelowany z nią proces stochastyczny. Zależnie od rodzaju potencjałów wywołanych, założenia te są mniej lub bardziej nieuzasadnione; podważa je choćby powszechnie znany efekt habituacji, polegający na osłabieniu późnych potencjałów wywołanych kolejnymi powtórzeniami bodźca.&lt;br /&gt;
&lt;br /&gt;
Istota potencjałów wywołanych jest przedmiotem otwartej dyskusji i dziesiątków prac, dotykających od lat podstawowych w tej dziedzinie pytań: czym jest potencjał wywołany, który widzimy w uśrednionym przebiegu? Czy naprawdę wynika z deterministycznie powtarzanej, jednakowej odpowiedzi pojawiającej się po każdym powtórzeniu bodźca niezależnie od &amp;amp;bdquo;tła&amp;amp;rdquo;, czy może wynika z reorganizacji faz tego właśnie &amp;amp;bdquo;tła&amp;amp;rdquo; EEG, czy może kombinacji tych dwóch efektów? Jest to wspaniałe pole dla zastosowań zaawansowanych metod modelowania i analizy sygnałów. W ostatnich latach powstają dziesiątki prac na ten temat, a od czasu do czasu również krytyczne artykuły wykazujące, że dotychczasowe odkrycia są raczej artefaktami stosowanych metod a nie wynikają z własności analizowanych danych (Yeung et al., 2004). Jak widać jest tu wciąż bardzo wiele do zrobienia, gdyż zrozumienie tego mechanizmu stoi na drodze do &amp;amp;bdquo;świętego Graala&amp;amp;rdquo;, którym w tej dziedzinie jest wyodrębnienie pojedynczych potencjałów wywołanych.&lt;br /&gt;
&lt;br /&gt;
Niezależnie od tego, w neurofizjologii klinicznej nazwą potencjał wywołany określa się krzywą widoczną po uśrednieniu odpowiedzi na kilkanaście do kilku tysięcy bodźców (Szelenberger 2000). Gromadzona od dziesięcioleci wiedza o behawioralnych i klinicznych korelatach potencjałów wywołanych opiera się na rozpoznawaniu w przebiegach uśrednionych tak zwanych załamków, czyli przejściowych wzrostów lub spadków potencjału (na przykład na &amp;lt;xr id=&amp;quot;fig:EP&amp;quot;&amp;gt;rys. %i&amp;lt;/xr&amp;gt; widać załamek P300). Nazwy załamków składają się zwykle z litery &amp;amp;bdquo;P&amp;amp;rdquo; (od ang. ''positive''), jeśli wychylenie jest dodatnie, lub &amp;amp;bdquo;N&amp;amp;rdquo; (od ang. ''negative''), jeśli wychylenie jest ujemne, oraz liczby. Uwaga: &lt;br /&gt;
* Nie ma niestety jednej ustalonej konwencji prezentacji potencjałów koniecznie trzeba więc zwracać uwagę na orientację wykresu, a wykonując wykres samemu - zamieszczać informację o orientacji kierunku dodatniego,gdyż kierunek dodatni może być wykresie skierowany do góry lub do dołu. &lt;br /&gt;
* Liczba następująca po N lub P określa przybliżoną liczbę milisekund od wystąpienia bodźca, czyli tak zwaną latencję. Nie można jednak ścisłego związku między tą liczbą a liczbą milisekund np. potencjał P300 w zależności od szczegółów paradygmatu doświadczalnego może wystąpić znacznie później. np. w eksperymentach językowych zdarza się że P300 występuje później niż N400 :-).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;xr id=&amp;quot;fig:zalamki&amp;quot;&amp;gt;Rys. %i&amp;lt;/xr&amp;gt; przedstawia schematycznie najważniejsze załamki rozpoznawane w potencjałach słuchowych, czyli wywoływanych bodźcem dźwiękowym. Dla potencjałów wzrokowych i somatosensorycznych istnieją podobne klasyfikacje.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Grafika:Zalamki.png|thumb|320px|right|&amp;lt;figure id=&amp;quot;fig:zalamki&amp;quot;&amp;gt;&amp;lt;/figure&amp;gt;&lt;br /&gt;
Orientacyjny schemat załamków rozpoznawanych w słuchowych potencjach wywołanych, na podstawie (Szelenberger 2000). Skala czasu logarytmiczna. Najszybsze (do 12 ms) składowe egzogenne to potencjały pniowe (BAEP), oznaczane jako fale I-VII. Litery &amp;amp;bdquo;P&amp;amp;rdquo; i &amp;amp;bdquo;N&amp;amp;rdquo; oznaczają dodatnie i ujemne wychylenia związane z dalszymi załamkami]]&lt;br /&gt;
&lt;br /&gt;
Najszybsze (czyli o najmniejszej latencji) składowe to potencjały egzogenne, odzwierciedlające wstępne fazy przekazu informacji. W potencjałach słuchowych są to potencjały pnia (ang. ''brainstem auditory evoked potentials'', BAEP), składające się z siedmiu fal występujących pomiędzy 1 a 12 ms od bodźca. Są one generowane np. w nerwie słuchowym czy pniu mózgu, i wykorzystywane w klinicznej diagnostyce integralności dróg słuchowych. Podobnie jak inne wczesne potencjały o latencjach poniżej 100 ms, są praktycznie niezależne od stanu uwagi.&lt;br /&gt;
&lt;br /&gt;
Po potencjałach o średniej latencji (między 12 a 50 ms) zaczynają się późne potencjały słuchowe (od 100 ms od podania bodźca), odzwierciedlające bardziej złożone reakcje na bodziec. Potencjały ok. 100 ms obserwowane w okolicach sensorycznych odzwierciedlają odpowiedź tejże kory na bodziec. Ich amplituda zależy od parametrów fizycznych bodźca oraz od uwagi, np. amplituda załamka N100 wzrasta w stanie skupienia uwagi czy pobudzenia emocjonalnego. Pierwszy i najpopularniejszy całkowicie endogenny załamek to P300, pojawiający się po rozpoznaniu bodźca oczekiwanego, na którym skupiamy uwagę: na przykład, jeśli w serii pojawiających się losowo liter mamy zliczać wystąpienia jednej z nich, to na średniej odpowiedzi na pojawienie się tej litery pojawi się załamek P300. Załamek ten występuje również w odpowiedzi na bodźce wyczekiwane, niespodziewane i ważne dla osoby (np. własne imię). &lt;br /&gt;
&lt;br /&gt;
=== Uśrednianie w dziedzinie czasu ===&lt;br /&gt;
Jak już było wspomniane powyżej podstawową techniką stosowaną do analizy potencjałów wywołanych jest uśrednianie wielu realizacji odpowiedzi na bodziec wyrównanych względem jakiegoś charakterystycznego zdarzenia, np. momentu podania bodźca albo momentu behawioralnej reakcji na bodziec (np. wciśnięcie przycisku). Podejście to bazuje na trzech założeniach:&lt;br /&gt;
* Reakcja jest czasowo związana z bodźcem. Tzn. w kolejnych realizacjach występuje ona zawsze z tym samym opóźnieniem.&lt;br /&gt;
* Reakcja na bodziec skutkuje zawsze pojawieniem się w sygnale składowej o stałym kształcie (mówimy o stałej morfologii).&lt;br /&gt;
* Spontaniczna czynność EEG &amp;amp;mdash; ta która nie dotyczy przetwarzania interesującego nas bodźca &amp;amp;mdash; jest niezależnym, stacjonarnym szumem o średniej zero.&lt;br /&gt;
&lt;br /&gt;
Zgodnie z powyższymi założeniami mierzony w ''i''-tej realizacji sygnał można wyrazić jako:&lt;br /&gt;
: &amp;lt;math&amp;gt;x_i(t) = s(t) + n_i(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
Uśrednianie po ''N'' realizacjach daje:&lt;br /&gt;
: &amp;lt;math&amp;gt;\bar x (t) = \frac{1}{N} \sum_{i=1}^N x_i(t) = \frac{1}{N} \left(N s(t) + \sum_{i=1}^N n_i(t) \right) &amp;lt;/math&amp;gt;&lt;br /&gt;
Wartość oczekiwana średniego sygnału wynosi:&lt;br /&gt;
: &amp;lt;math&amp;gt;\mathrm{E}\left[ \bar x(t) \right] = s(t) &amp;lt;/math&amp;gt;&lt;br /&gt;
gdyż dla szumu o średniej zero mamy:&lt;br /&gt;
: &amp;lt;math&amp;gt;\mathrm{E}\left[\frac{1}{N} \sum_{i=1}^N n_i(t)\right] = 0&amp;lt;/math&amp;gt;.&lt;br /&gt;
Wariancja &amp;lt;math&amp;gt;\bar x(t)&amp;lt;/math&amp;gt; wynosi:&lt;br /&gt;
: &amp;lt;math&amp;gt;\sigma^2_{\bar x(t)} = \mathrm{E} \left[  \left( \frac{1}{N} \sum_{i=1}^N n_i(t)\right)^2 \right] \approx \frac{1}{N} \sigma^2_{n(t)}&amp;lt;/math&amp;gt;&lt;br /&gt;
gdyż &amp;lt;math&amp;gt;s(t)&amp;lt;/math&amp;gt; jest deterministyczne. &lt;br /&gt;
&lt;br /&gt;
Dla potencjałów pojawiających się w pierwszych kilkudziesięciu milisekundach po bodźcu model ten można uznać za poprawny, gdyż wykazują one zależność głównie od parametrów fizycznych bodźca. Dla późniejszych składowych staje się on coraz bardziej wątpliwy ze względu na występujące korelacje ze stanem (np. uwagi) badanego.&lt;br /&gt;
&lt;br /&gt;
Dla późniejszych składowych można by postulować bardziej ogólną wersję modelu potencjału wywołanego:&lt;br /&gt;
: &amp;lt;math&amp;gt;x_i(t) = s_i(t) + n_i(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
Ten model uwidacznia, że do opisu potencjału wywołanego potrzebna jest nie tylko średnia, ale i wyższe momenty rozkładu (np. drugi moment centralny czyli wariancja).&lt;br /&gt;
&lt;br /&gt;
====Wariancja w przypadku szumu skorelowanego ====&lt;br /&gt;
W poprzednim paragrafie pokazaliśmy, że w przypadku niezależnego szumu wariancja uśrednionego sygnału (w danej chwili czasu) maleje jak  &amp;lt;math&amp;gt;\frac{1}{N}&amp;lt;/math&amp;gt;. Jednak w przypadku gdy kolejne próbki szumu są skorelowane (np. występuje silna aktywność rytmiczna alfa) sytuacja się komplikuje. Intuicyjnie łatwo możemy to sobie wyobrazić w granicznym przypadku. Załóżmy, że tło dla  potencjałów o stałej morfologii   stanowi sinusoida. Jeśli będziemy podawać bodźce w odstępach będących wielokrotnością okresu tej sinusoidy to w uśrednianych fragmentach sygnału owa sinusoida jest tak samo powtarzalna jak badany potencjał i uśrednianie nie prowadzi do poprawy stosunku amplitudy sygnału do amplitudy tła. &lt;br /&gt;
&lt;br /&gt;
Stopień zależności pomiędzy próbkami można zmierzyć przy pomocy funkcji autokorelacji. &lt;br /&gt;
Jeśli funkcję autokorelacji przybliżymy przez:&lt;br /&gt;
: &amp;lt;math&amp;gt;R_{xx}(\tau) = \sigma^2 \exp(-\beta |\tau|) \cos(2 \pi f_0 \tau)&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\sigma^2&amp;lt;/math&amp;gt; jest wariancją szumu, &amp;lt;math&amp;gt;f_0&amp;lt;/math&amp;gt; jest średnią częstością aktywności rytmicznej, &amp;lt;math&amp;gt;\beta/ \pi&amp;lt;/math&amp;gt; jest szerokością pasma tej czynności, zaś &amp;lt;math&amp;gt;\tau&amp;lt;/math&amp;gt; opóźnieniem, to wariancję potencjału wywołanego można wyrazić jako&amp;lt;!-- \cite{Spekreijse_1976}--&amp;gt;:&lt;br /&gt;
: &amp;lt;math&amp;gt;\sigma^2_{\bar x(t)} = \frac{\sigma^2}{N} \left[ \frac{1-\exp(-2 \beta T)}{1 - 2 \exp(- \beta T) \cos(2 \pi f_0 T) +\exp(-2 \beta T)} \right]&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; jest odstępem między bodźcami. &lt;br /&gt;
Widać stąd, że obecność czynności rytmicznej w tle wpływa na stosunek sygnału do szumu. Z powyższego równania widać, że stosunek wariancji dąży do &amp;lt;math&amp;gt;\frac{\sigma^2}{N}&amp;lt;/math&amp;gt; gdy &amp;lt;math&amp;gt;\beta T&amp;lt;/math&amp;gt; staje się duże.  &lt;br /&gt;
&lt;br /&gt;
Periodyczna stymulacja może ponadto prowadzić do wzbudzenia czynności rytmicznej o częstości równej częstości pobudzania bądź jej harmonicznej.&lt;br /&gt;
&lt;br /&gt;
===Wariancja latencji===&lt;br /&gt;
&lt;br /&gt;
Jedną z form zmienności potencjału wywołanego w pojedynczych realizacjach jest wariancja latencji. &lt;br /&gt;
[[Grafika:Wariancja_latencji.png|thumb|500px|right|&lt;br /&gt;
Czerwona linia: Uśrednianie 100 potencjałów wywołanych o latncjach z rozkładu normalnego N(300,30 ), Niebieskie linie: przykładowe pojedyncze realizacje wzięte do średniej]]&amp;lt;!--# -*- coding: utf-8 -*-&lt;br /&gt;
from __future__ import division&lt;br /&gt;
import numpy as np&lt;br /&gt;
from matplotlib.pyplot import plot, show ,subplot, figure, title, xlabel, ylabel, ylim&lt;br /&gt;
 &lt;br /&gt;
def fun(t,lat=100):&lt;br /&gt;
    return np.exp(-(t-lat)**2/(2*30**2))&lt;br /&gt;
Fs = 1&lt;br /&gt;
N = 100&lt;br /&gt;
t = np.arange(0,700)&lt;br /&gt;
f = np.zeros((N,700))&lt;br /&gt;
f_sr = np.zeros(t.shape)&lt;br /&gt;
for i in range(N):&lt;br /&gt;
    f[i,:] = fun(t,lat = 300 + 30* np.random.randn())&lt;br /&gt;
for i in range(3):&lt;br /&gt;
    plot(t,f[i,:], 'b')&lt;br /&gt;
plot(t,f.mean(0),'r')&lt;br /&gt;
show()--&amp;gt;&lt;br /&gt;
Zmienność latencji prowadzi do:&lt;br /&gt;
* zmniejszenia amplitudy &amp;lt;math&amp;gt;\bar x&amp;lt;/math&amp;gt;&lt;br /&gt;
* wzrostu rozciągłości czasowej załamka&lt;br /&gt;
&lt;br /&gt;
O tych konsekwencjach zmienności latencji należy w szczególności pamiętać porównując średnie potencjały uzyskane w różnych warunkach eksperymentalnych. Gdy zauważymy, że średnie potencjały różnią się amplitudą należy rozważyć możliwość, że w istocie warunki eksperymentalne wpływają na różnice w wariancji latencji. &lt;br /&gt;
&lt;br /&gt;
Naturalne jest, że zmienność latencji jest bardziej widoczna w przypadku załamków trwających krótko niż w przypadku załamków trwających długo. Wariancja latencji rożnie wraz z jej wartością, stąd wśród późnych składowych potencjałów wywołanych nie obserwuje się komponentów krótkotrwałych.&lt;br /&gt;
&amp;lt;!--====Uśrednianie metodą Woody'ego ====&lt;br /&gt;
&lt;br /&gt;
Model potencjału ze zmienną latencją i sposób na jego efektywniejsze uśrednianie zaproponował Woody (1967). Model ten zakłada, że w każdej realizacji występuje komponent addytywny &amp;lt;math&amp;gt;s_i(t)\;&amp;lt;/math&amp;gt;, który co do kształtu jest stały, a pomiędzy realizacjami różni się tylko latencją:&lt;br /&gt;
: &amp;lt;math&amp;gt; s_i(t) = s(t +\Delta t_i)\;&amp;lt;/math&amp;gt;&lt;br /&gt;
Woody zaproponował aby &amp;lt;math&amp;gt;\Delta t_i\;&amp;lt;/math&amp;gt; szacować na podstawie maksimum funkcji korelacji wzajemnej pomiędzy ''i''-tą realizacją a wzorcem. W pierwszym kroku wzorcem jest średni potencjał uzyskany przez proste uśrednienie realizacji.  Następnie w sposób iteracyjny dokonuje się:&lt;br /&gt;
* poprawek w wyrównaniu poszczególnych realizacji,&lt;br /&gt;
* obliczenia nowego wzorca poprzez uśrednienie realizacji po korekcie wyrównania,&lt;br /&gt;
* obliczenia nowych poprawek do wyrównania realizacji.--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Habituacja ===&lt;br /&gt;
Zmienność w odpowiedziach na kolejno występujące po sobie bodźce można podzielić na komponent stochastyczny i deterministyczny. Komponent deterministyczny odzwierciedla zmianę czułości  układu nerwowego  na kolejne bodźce. Nowy bodziec często wywołuje reakcje pobudzenia widoczną w wielu parametrach takich jak przewodnictwo skóry, rytm serca i reaktywność kory mózgowej. Powszechnie obserwowanym zjawiskiem jest spadek reaktywności na powtarzające się bodźce zwany habituacją. Niekiedy obserwuje się także zjawisko przeciwne &amp;amp;mdash; wzrost reaktywności na bodziec &amp;amp;mdash; zwane sensytyzacją. &lt;br /&gt;
&lt;br /&gt;
Klasycznym sposobem na badanie tych zjawisk w potencjałach wywołanych jest uśrednianie w podzbiorach lub  uśrednianie blokowe. Wymaga ono  zmiany paradygmatu rejestracji danych. Załóżmy, że interesującym nas bodźcem jest błysk światła. Chcemy zaobserwować ewentualne zmiany amplitudy i latencji w ciągu 100 potencjałów będących reakcją na błysk powtarzający się co 500 ms.&lt;br /&gt;
====Uśrednianie w podzbiorach ====&lt;br /&gt;
W metodzie tej musimy założyć, że proces habituacji jest powolny, tzn. zmiany pomiędzy kolejnymi reakcjami są bardzo małe. W takim przypadku możemy podzielić długą serię bodźców na ciąg pod-serii i uśrednienie przeprowadzić dla każdej pod-serii osobno.&lt;br /&gt;
[[Plik:Usrednianie_podzbiory.svg‎|640px|thumb|center|Ilustracja uśredniania w podzbiorach]]&lt;br /&gt;
&lt;br /&gt;
====Uśrednianie blokowe====&lt;br /&gt;
W tym celu eksperyment wykonujemy w wielu seriach. Jedna seria składa się ze 100 błysków powtarzanych co 500 ms.  Po serii następuje przerwa trwająca np. 5 s (długość przerwy wyraża nasze oszacowanie czasu potrzebnego na zanik habituacji). Po przerwie seria jest powtarzana. Powtórzeń serii wykonujemy ''N''.&lt;br /&gt;
Następnie uśredniamy fragmenty sygnałów odpowiadające sobie w kolejnych seriach. &lt;br /&gt;
&lt;br /&gt;
W tym paradygmacie zakładamy, że każda seria rejestrowana jest w tych samych warunkach. Zaniedbujemy efekty związane ze zmęczeniem i zmianami w np. stopniu koncentracji badanego.&lt;br /&gt;
[[Plik:Usrednianie blokowe.svg|Usrednianie blokowe.svg|640px|thumb|center|Ilustracja uśredniania w blokach]]&lt;br /&gt;
&lt;br /&gt;
===Załamki w krzywej potencjału wywołanego vs ukryte komponenty===&lt;br /&gt;
Komponenta potencjału wywołanego to bardzo ważne ale jednocześnie źle określone pojęcie. Krzywa otrzymana w wyniku uśredniania potencjałów wywołanych przedstawia serię załamków dodatnich i ujemnych, ale trzeba być świadomym, że ten przebieg napięcia rejestrowany przez elektrody przedstawia tak naprawdę sumę potencjałów pochodzących od wielu dość niezależnie działających źródeł w mózgu. Przyczynek pochodzący od jednego funkcjonalnego źródła będziemy określać jako komponentę. &lt;br /&gt;
&lt;br /&gt;
Komentarza wymaga też pojęcie źródła funkcjonalnego. Czynność elektryczną synchronicznie działających neuronów piramidalnych w określonym fragmencie kory mózgowej z pewnej odległości można przybliżyć potencjałem dipola prądowego. Taki aktywny fragment kory stanowi źródło dające przyczynek do mierzonego na powierzchni głowy potencjału. W najprostszej sytuacji taki przyczynek może być obserwowany jako komponenta. Mózg jest jednak obiektem niezwykle złożonym i gęsto połączonym. Wiele obszarów korowych może być funkcjonalnie połączonych i aktywowanych synchronicznie w celu realizacji określonego zadania &amp;amp;mdash; o takim funkcjonalnym zespole też możemy myśleć jako o pojedynczym źródle, choć może ono mieć złożoną strukturę przestrzenną. Często zatem myślimy o komponentach ukrytych potencjału wywołanego jako o aktywności takich funkcjonalnych zespołów. &lt;br /&gt;
&lt;br /&gt;
Po tym wstępie widać już chyba, że do zrozumienia co dzieje się w czasie reakcji na bodziec, którą obserwujemy w potencjale wywołanym, bardziej pożądane byłoby badanie komponent ukrytych niż poszczególnych załamków krzywej potencjału wywołanego, która stanowi ważoną sumę owych komponentów. Zanim przejdziemy do omówienia technik służących &amp;amp;bdquo;wyłuskiwaniu&amp;amp;rdquo; komponent prześledźmy kilka symulacji i wnioski z nich płynące.&lt;br /&gt;
&lt;br /&gt;
==== Załamki i komponenty nie są tym samym.====&lt;br /&gt;
Tę samą krzywą można otrzymać na nieskończenie wiele sposobów  przez sumowanie rożnych kombinacji domniemanych komponentów. Przykładowy rysunek pokazuje, jak tę samą krzywą można złożyć z dwóch rożnych zestawów komponentów (kod wytwarzający przykładową symulację pokazany jest poniżej).&lt;br /&gt;
[[Plik:Sumowanie_komponentow1.png|center|thumb|600px| Panel a) przedstawia hipotetyczną krzywą ERP, panel b) jedna z możliwych dekompozycji sygnału w panelu a), panel c) inna możliwa dekompozycja sygnału z panelu a) ]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
from __future__ import division&lt;br /&gt;
import numpy as np&lt;br /&gt;
from matplotlib.pyplot import plot, show ,subplot, figure, title, xlabel, ylabel, ylim&lt;br /&gt;
&lt;br /&gt;
Fs = 1&lt;br /&gt;
t = np.arange(0,700)&lt;br /&gt;
&lt;br /&gt;
C1 = np.exp(-(t-100)**2/(2*30**2))&lt;br /&gt;
C2 = np.exp(-(t-200)**2/(2*50**2))&lt;br /&gt;
C3 = np.exp(-(t-350)**2/(2*100**2))&lt;br /&gt;
ERP = 0.5*C1-C2+C3&lt;br /&gt;
&lt;br /&gt;
C2p = np.concatenate((C2[0:200], np.ones(30), C2[200:700-30] ))&lt;br /&gt;
C3p = ERP - 0.5*C1 + C2p&lt;br /&gt;
ERP_v2 = 0.5*C1-C2p+C3p&lt;br /&gt;
&lt;br /&gt;
subplot(3,1,1)&lt;br /&gt;
plot(t,ERP, t[::10],ERP_v2[::10],'g.')&lt;br /&gt;
ylabel('a)',rotation='horizontal')&lt;br /&gt;
ylim([-1, 1.5])&lt;br /&gt;
&lt;br /&gt;
subplot(3,1,2)&lt;br /&gt;
plot(t,0.5*C1,t,-C2,t,C3)&lt;br /&gt;
ylabel('b)',rotation='horizontal')&lt;br /&gt;
ylim([-1, 1.5])&lt;br /&gt;
&lt;br /&gt;
subplot(3,1,3)&lt;br /&gt;
plot(t,0.5*C1,t,-C2p,t,C3p)&lt;br /&gt;
ylabel('c)',rotation='horizontal')&lt;br /&gt;
ylim([-1, 1.5])&lt;br /&gt;
&lt;br /&gt;
show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Zmiana jednej komponenty może powodować zmiany w amplitudzie i latencji więcej niż jednego załamka.====&lt;br /&gt;
Poniższy rysunek przedstawia sytuację gdy zmiana amplitudy jednego komponentu może znacząco wpływać na amplitudę i latencję innych załamków.&lt;br /&gt;
&lt;br /&gt;
[[Plik:Sumowanie_komponentow2.png|center|thumb|768px| Panel a) przedstawia dwie hipotetyczne krzywe ERP, panel b) panel b i c komponenty z których powstały owe krzywe. Zmiana amplitudy komponentu oznaczonego kolorem powoduje zmianę amplitudy oznaczonych załamków ale także zmianę latencji wcześniejszego załamka. ]]&lt;br /&gt;
Poniżej kod odtwarzający powyższy przykład:&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
from __future__ import division&lt;br /&gt;
import numpy as np&lt;br /&gt;
from matplotlib.pyplot import plot, show, subplot, figure, title, xlabel, ylabel, ylim&lt;br /&gt;
&lt;br /&gt;
Fs = 1&lt;br /&gt;
t = np.arange(0,700)&lt;br /&gt;
&lt;br /&gt;
C1 = np.exp(-(t-100)**2/(2*30**2))&lt;br /&gt;
C2 = np.exp(-(t-200)**2/(2*50**2))&lt;br /&gt;
C3 = np.exp(-(t-350)**2/(2*100**2))&lt;br /&gt;
ERP1 = 0.5*C1-C2+C3&lt;br /&gt;
ERP2 = 0.5*C1-C2+1.5*C3&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
subplot(3,1,1)&lt;br /&gt;
plot(t,ERP1,'b', t,ERP2,'g')&lt;br /&gt;
plot(t[np.argmin(ERP1)],np.min(ERP1),'r.' )&lt;br /&gt;
plot(t[np.argmax(ERP1)],np.max(ERP1),'m.' )&lt;br /&gt;
plot(t[np.argmin(ERP2)],np.min(ERP2),'r.' )&lt;br /&gt;
plot(t[np.argmax(ERP2)],np.max(ERP2),'m.' )&lt;br /&gt;
&lt;br /&gt;
ylabel('a)',rotation='horizontal')&lt;br /&gt;
ylim([-1, 1.6])&lt;br /&gt;
&lt;br /&gt;
subplot(3,1,2)&lt;br /&gt;
plot(t,0.5*C1,'k',t,-C2,'k',t,C3,'b')&lt;br /&gt;
ylabel('b)',rotation='horizontal')&lt;br /&gt;
ylim([-1, 1.6])&lt;br /&gt;
&lt;br /&gt;
subplot(3,1,3)&lt;br /&gt;
plot(t,0.5*C1,'k',t,-C2,'k',t,1.5*C3,'g')&lt;br /&gt;
ylabel('c)',rotation='horizontal')&lt;br /&gt;
ylim([-1, 1.6])&lt;br /&gt;
&lt;br /&gt;
show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Instrukcje do ćwiczeń =&lt;br /&gt;
&lt;br /&gt;
==Zadanie 1: uśrednianie symulowanych sygnałów==&lt;br /&gt;
w tym ćwiczeniu chcemy pokazać efekty:&lt;br /&gt;
# uśredniania sygnałów związanych fazowo z bodźcem i nieskorelowanych z bodźcem / wpływ liczby realizacji,&lt;br /&gt;
# uśredniania sygnałów z fluktuacją latencji,&lt;br /&gt;
# wpływ filtrów o różnych funkcjach odpowiedzi impulsowej na morfologię uśrednionego potencjału.&lt;br /&gt;
&lt;br /&gt;
===Sygnały testowe===&lt;br /&gt;
Proszę zaimplementować funkcje generujące następujące przebiegi czasowe (oznaczenia: ''F&amp;lt;sub&amp;gt;s&amp;lt;/sub&amp;gt;'' &amp;amp;mdash; częstość próbkowania, ''T'' &amp;amp;mdash; czas trwania w sekundach, [[%C4%86wiczenia_1#Sygna.C5.82y_testowe|analogicznie do tego]]):&lt;br /&gt;
* sinusoida o zadanej częstości ''f'' i fazie &amp;lt;math&amp;gt;\phi&amp;lt;/math&amp;gt;: &amp;lt;tt&amp;gt;y = sin(f, phi, Fs, T)&amp;lt;/tt&amp;gt;,&lt;br /&gt;
* funkcja Gaussa o zadanym położeniu i szerokości &amp;lt;tt&amp;gt;y = g_1(t0, sigma, Fs, T) &amp;lt;/tt&amp;gt;&lt;br /&gt;
: &amp;lt;math&amp;gt;g_1(t) = \exp\left(-\frac{(t-t_0)^2}{2 \sigma^2}\right)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* pochodną funkcji Gaussa o zadanym położeniu i szerokości &amp;lt;tt&amp;gt;y = g_2(t0, sigma, Fs, T)&amp;lt;/tt&amp;gt;,&lt;br /&gt;
* połowę funkcji Gaussa o zadanym położeniu i szerokości &amp;lt;tt&amp;gt;y = g_3(t0, sigma, Fs, T)&amp;lt;/tt&amp;gt;,&lt;br /&gt;
: &amp;lt;math&amp;gt;g_{3}(t) = \left\{ &lt;br /&gt;
\begin{array}{lll}&lt;br /&gt;
0 &amp;amp; \mathrm{dla}&amp;amp; t&amp;lt;t_0 \\&lt;br /&gt;
\exp\left(-\frac{(t-t_0)^2}{2 \sigma^2}\right)&amp;amp; \mathrm{dla}&amp;amp; t \ge t_0  &lt;br /&gt;
\end{array}&lt;br /&gt;
\right. &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
W dalszych zadaniach tej sekcji przyjmiemy:&lt;br /&gt;
* ''T'' = 1 s,&lt;br /&gt;
* ''F&amp;lt;sub&amp;gt;s&amp;lt;/sub&amp;gt;'' = 128 Hz,&lt;br /&gt;
* ''t''&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; = 0,3 s,&lt;br /&gt;
* &amp;amp;sigma; = 0,02 s.&lt;br /&gt;
&lt;br /&gt;
===Uśrednianie w modelu addytywnym: sygnał + szum===&lt;br /&gt;
Dla funkcji &amp;lt;math&amp;gt;g_1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;g_2&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;g_3&amp;lt;/math&amp;gt;  wykonaj ''N'' symulacji sygnału opisanego daną funkcją z dodanym szumem gaussowskim (&amp;lt;tt&amp;gt;numpy.random.randn&amp;lt;/tt&amp;gt;). Zaobserwuj zmianę wariancji uśrednianego sygnału wraz z ''N''.&lt;br /&gt;
&lt;br /&gt;
===Uśrednianie w modelu addytywnym: sygnał + szum + niezależna czynność rytmiczna===&lt;br /&gt;
Powtórz poprzednie symulacje dokładając w każdej realizacji sinusoidę o losowo wybranej fazie. Symulacje wykonaj dla różnych częstości sinusoidy, takich których połówka okresu zbliżona jest do szerokości funkcji Gaussa, oraz znacząco od niej różnych.&lt;br /&gt;
&lt;br /&gt;
===Uśrednianie w modelu z resetem fazy===&lt;br /&gt;
Zbuduj sygnał składający się z dwóch fragmentów sinusoidy o częstości ''f'': &lt;br /&gt;
* pierwszy fragment ma losową fazę,&lt;br /&gt;
* drugi fragment ma fazę równą 0.&lt;br /&gt;
Wykonaj ''N'' realizacji takiego sygnału, przy czym każda realizacja ma częstość losowaną z rozkładu Gaussa o średniej 10 i pewnej wariancji (czyli &amp;lt;math&amp;gt;f \in \mathrm{N}(10,\sigma)&amp;lt;/math&amp;gt;). &lt;br /&gt;
Uśrednij otrzymane realizacje. Zaobserwuj zależność średniej od liczby uśrednianych realizacji i od wariancji częstości.&lt;br /&gt;
&lt;br /&gt;
===Uśrednianie potencjału z fluktuacją latencji===&lt;br /&gt;
Wygeneruj sygnały składające się z funkcji &amp;lt;math&amp;gt;g_1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;g_2&amp;lt;/math&amp;gt; albo &amp;lt;math&amp;gt;g_3&amp;lt;/math&amp;gt; z fluktuującą latencją, tzn. z wartością &amp;lt;math&amp;gt;t_0&amp;lt;/math&amp;gt; pochodzącą z jakiegoś rozkładu prawdopodobieństwa. U nas dla ustalenia uwagi niech będzie to rozkład Gaussa. Wykonaj zestaw symulacji obrazujący zależność od liczby realizacji i od wielkości fluktuacji, mierzonej przez wariancję rozkładu. Czy jest związek pomiędzy wariancją fluktuacji &amp;lt;math&amp;gt;t_0&amp;lt;/math&amp;gt; a szerokością załamków?&lt;br /&gt;
&lt;br /&gt;
===Wpływ filtrów===&lt;br /&gt;
# Zaprojektuj następujące filtry (przyjmij częstość próbkowania 128 Hz):&lt;br /&gt;
#* dolnoprzepustowy: Butterwortha z częstością odcięcia: 30, 40, 50 Hz, i rzędach od 1 do 5 (funkcja butter w module scipy.signal),&lt;br /&gt;
#* górnoprzepustowy: Butterwortha z częstością odcięcia: 0,1, 0,5, 2 i 5 Hz, i rzędach od 1 do 5,&lt;br /&gt;
#* notch: Czybyszewa II rodzaju z pasmem zaporowym ustawionym na 50 Hz, i rzędach od 1 do 3 (funkcja cheby2),&lt;br /&gt;
# Zbadaj funkcję odpowiedzi impulsowej i funkcję przenoszenia tych filtrów (w skali dB). Zaobserwuj jak długa jest odpowiedź impulsowa i jak daleko od częstości odcięcia zaburzone jest pasmo przenoszenia.&lt;br /&gt;
# Zastosuj powyższe filtry do funkcji &amp;lt;math&amp;gt;g_1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;g_2&amp;lt;/math&amp;gt; albo &amp;lt;math&amp;gt;g_3&amp;lt;/math&amp;gt;. Filtrowanie przeprowadź w jedną (lfilter) oraz w dwie strony (filtfilt). Zaobserwuj związek między zniekształceniem wprowadzanym przez filtr a funkcją odpowiedzi impulsowej filtru.&lt;br /&gt;
# W ćwiczeniu tym posłuż się symulowanymi sygnałami uzyskanymi z modelu addytywnego: &amp;amp;bdquo;sygnał+szum&amp;amp;rdquo;. Dla funkcji &amp;lt;math&amp;gt;g_1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;g_2&amp;lt;/math&amp;gt; albo &amp;lt;math&amp;gt;g_3&amp;lt;/math&amp;gt;  wykonaj ''N'' = 60 realizacji sygnału opisanego daną funkcją z dodanym szumem gaussowskim (&amp;lt;tt&amp;gt;numpy.random.randn&amp;lt;/tt&amp;gt;). Każdą z realizacji przefiltruj, a następnie uśrednij uzyskane sygnały.&lt;br /&gt;
&lt;br /&gt;
==Zadanie 2: rejestracje i analiza potencjałów wzrokowych==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;! -- ===Synchronizacja występowania bodźców z sygnałem EEG===&lt;br /&gt;
&lt;br /&gt;
Rejestracja potencjałów wywołanych jest przykładem pomiaru czynności elektrycznej mózgu w odpowiedzi na określony bodziec. W przypadku tego rodzaju pomiarów konieczna jest synchronizacja momentu wystąpienia bodźca z sygnałem EEG. Wzmacniacze do pomiaru czynności elektrycznej mózgu wyposażone są w specjalne wejścia, na które można podawać sygnał odpowiadający pojawianiu się bodźca. Jak pamiętamy z zeszłego semestru, wejście to (jak i podawany na nie sygnał) nazywamy trigerem (ang. ''trigger'' &amp;amp;mdash; spust, cyngiel, wyzwalacz). W najprostszym przypadku, bodziec moglibyśmy wyświetlać na monitorze komputerowym, a sygnał związany z jego wystąpieniem wysyłać przez któryś z portów komputera (LPT, COM) na wzmacniacz EEG. Niestety, obecnie dostępne i popularne systemy operacyjne, takie jak Windows czy Linux nie są systemami czasu rzeczywistego (http://pl.wikipedia.org/wiki/System_operacyjny_czasu_rzeczywistego). Od momentu wyświetlania bodźca na ekranie, do pojawiania się sygnału odpowiednim porcie komputerowym może upłynąć kilkadziesiąt milisekund i co gorsza czas ten zwykle jest losowy. W przypadku gdy wzmacniacz próbkuje sygnał z częstością 1000 Hz, moment wystąpienia bodźca możemy określić z dokładnością 1 ms, jednakże wspomniane opóźnienia w systemie operacyjnym uniemożliwiają to. Ponadto, jak dowiedzieliśmy się w rozdziale wstępnym [http://brain.fuw.edu.pl/edu-wiki/action/edit/EEG:Potencja%C5%82y_wywo%C5%82ane?section=T-1], pierwsze załamki związane z potencjałami wywołanymi pojawiają się już 10 ms po wystąpieniu bodźca. W związku z tym, losowe, rzędu kilkudziesięciu milisekund opóźnienia sygnału określającego moment pojawienia się bodźca względem jego rzeczywistego wystąpienia są niedopuszczalne.&lt;br /&gt;
Istnieją pewne techniki programowania, dzięki którym opisywane opóźnienia można zmniejszyć, jednakże są one bardzo trudne  do realizacji. Ponadto, standardowe porty komputera, takie jak LPT, czy COM zostały zaprojektowane przede wszystkim do sterowania urządzeniami zewnętrznymi, a nie ich zasilania. Przykładowo, jedna linia portu drukarkowego (LPT) może być obciążona prądem nie większym niż 5 mA, podczas gdy do zapalenie zwykłej diody LED potrzeba około 10 mA. Taki pobór prądu możliwy jest do uzyskania z portu USB, jednakże  jest on  wyjątkowo trudny do oprogramowania.  &lt;br /&gt;
W celu ominięcia powyższych niedogodności w Zakładzie Fizyki Biomedycznej UW w przeprowadzanych eksperymentach wykorzystywane są  mikrokontrolery [http://pl.wikipedia.org/wiki/Mikrokontroler], w szczególności ATmega16 i ATmega32.  Mikrokontrolery te wyposażone są w procesory o architekturze RISC [http://pl.wikipedia.org/wiki/RISC] i mocy obliczeniowej porównywalnej z szeroko stosowanym kiedyś w komputerach ZX Spectrum, Commodore, Amiga i Atari procesorem Z80. Oprócz jednostki centralnej mikrokontrolery zawierają   stałą pamięć FLASH przeznaczoną do przechowywania kodu programu, pamięć  RAM i pamięć EEPROM, liczniki 8- i 16-bitowe, komparatory, przetworniki analogowo-cyfrowe, porty wejścia/wyjścia, łącze RS232 (popularnie nazywane portem szeregowym) i układy przerwań.&lt;br /&gt;
&lt;br /&gt;
Mikrokontrolery wchodzące w skład zestawów pomiarowych na Pracowni EEG zawierają program, który umożliwia komunikację z nimi poprzez port szeregowy. Obecnie, komputery są coraz rzadziej wyposażane w porty szeregowe. Standard komunikacji RS-232, opracowany w 1962 roku  nadal jest jednak popularny i często wykorzystywany do komunikacji miedzy urządzeniami.  W celu połączenia komputera posiadającego tylko porty USB z mikrokontrolerem zastosowano przejściówkę USB/RS-232. &lt;br /&gt;
&lt;br /&gt;
Jak każde urządzenie w systemie Linuks, przejściówka USB/RS-232 widoczna jest jako plik, znajdujący się w katalogu &amp;lt;tt&amp;gt;/dev&amp;lt;/tt&amp;gt;. Nazwy plików obsługujących urządzenia szeregowe to &amp;lt;tt&amp;gt;ttyXY&amp;lt;/tt&amp;gt;, gdzie &amp;lt;tt&amp;gt;XY&amp;lt;/tt&amp;gt; to kolejny numer przydzielony do urządzenia szeregowego.&lt;br /&gt;
Do komunikacji komputera z mikroknotrolerem  w Zakładzie Fizyki Biomedycznej UW została napisana prosta biblioteka.  Jej użycie jest następujące:&lt;br /&gt;
* Po podłączeniu przejściówki USB/RS232 do komputera mikrokontrolera sprawdź jaki plik w katalogu &amp;lt;tt&amp;gt;/dev&amp;lt;/tt&amp;gt; został utworzony i przydzielony do urządzenia. &lt;br /&gt;
* Zaimportuj bibliotekę do komunikacji z mikrokontrolerem: &lt;br /&gt;
: &amp;lt;tt&amp;gt;import SerialPort as SP&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Otwórz plik powiązany z urządzeniem zewnętrznym:&lt;br /&gt;
: &amp;lt;tt&amp;gt;sp = SP.SerialPort(nazwa_pliku) &amp;lt;/tt&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
: &amp;lt;tt&amp;gt;sp.open()&amp;lt;/tt&amp;gt;&lt;br /&gt;
W naszym przypadku prawidłowa nazwa pliku to &amp;lt;tt&amp;gt;/dev/ttyUSB0&amp;lt;/tt&amp;gt;.&lt;br /&gt;
* Po włączeniu zasilania mikrokontrolera, diody podłączone do niego i wykorzystywane w eksperymencie z potencjałami wywołanymi będą zapalone. Następujące polecenie zgasi obydwie diody:&lt;br /&gt;
: &amp;lt;tt&amp;gt;sp.blinkP300([0, 0])&amp;lt;/tt&amp;gt;&lt;br /&gt;
* Wydanie poniższego polecenia spowoduje, iż mikrokontroler zapali podłączoną do niego diodę numer 1 na czas 100 ms, zaś diodę numer 2 na 200 ms. Jednocześnie, w momencie włączenia jak i wyłączenia diody, sygnał z mikrokontrolera zostanie wysłany na 5-stykowe wejście AUX mikrokontrolera:&lt;br /&gt;
: &amp;lt;tt&amp;gt;sp.blinkP300([100, 200])&amp;lt;/tt&amp;gt;&lt;br /&gt;
* Jeśli chcemy zapalić tylko diodę numer dwa, np. na czas 500 ms w programie podajemy następującą instrukcję:&lt;br /&gt;
: &amp;lt;tt&amp;gt;sp.blinkP300([0, 500])&amp;lt;/tt&amp;gt;&lt;br /&gt;
* Jeśli chcemy zakończyć komunikację z mikrokontrolerem piszemy:&lt;br /&gt;
: &amp;lt;tt&amp;gt;sp.close()&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Kod biblioteki do komunikacji z mikrokontrolerem:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;!--  Kod w Pythonie 2&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# -*- coding: cp1250 -*-&lt;br /&gt;
import serial&lt;br /&gt;
import logging&lt;br /&gt;
import sys&lt;br /&gt;
import os&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def to_hex_word(a):&lt;br /&gt;
    '''encodes a decimal number hexadecimally on two bytes'''&lt;br /&gt;
    return chr(a%256) + chr(a/256)&lt;br /&gt;
&lt;br /&gt;
class SerialPort(object):&lt;br /&gt;
    def __init__(self, port_name):&lt;br /&gt;
        import serial&lt;br /&gt;
        try:&lt;br /&gt;
            self.port = serial.Serial(&lt;br /&gt;
                port=port_name,&lt;br /&gt;
                baudrate=9600,&lt;br /&gt;
                bytesize=serial.EIGHTBITS,&lt;br /&gt;
                parity=serial.PARITY_NONE,&lt;br /&gt;
                stopbits=serial.STOPBITS_ONE,&lt;br /&gt;
                xonxoff=False&lt;br /&gt;
                )&lt;br /&gt;
        except serial.SerialException as e:&lt;br /&gt;
            print(&amp;quot;Nieprawidłowa nazwa portu lub port zajęty.&amp;quot;)&lt;br /&gt;
            raise e&lt;br /&gt;
        self.close()&lt;br /&gt;
        &lt;br /&gt;
    def open(self):&lt;br /&gt;
        self.port.open()&lt;br /&gt;
&lt;br /&gt;
    def close(self):&lt;br /&gt;
        self.port.close()&lt;br /&gt;
&lt;br /&gt;
    def send(self, value):&lt;br /&gt;
        self.port.write(value)&lt;br /&gt;
                           &lt;br /&gt;
    def blinkSSVEP(self,d, p1, p2):&lt;br /&gt;
        '''&lt;br /&gt;
        d = list of frequencies;&lt;br /&gt;
        p1:p2 = ratio LED_on_time/LED_off_time&lt;br /&gt;
        if you want i-th LED to be OFF all the time send  d[i] = 0&lt;br /&gt;
        if you want i-th LED to be ON all the time send  d[i] = -1&lt;br /&gt;
        in these two cases p1 and p2 do not matter&lt;br /&gt;
        '''&lt;br /&gt;
        clock  = 62500&lt;br /&gt;
        factor = float(p1) / float(p1 + p2)&lt;br /&gt;
    &lt;br /&gt;
        str = chr(3) # 'SSVEP_RUN'&lt;br /&gt;
&lt;br /&gt;
        for i in range(len(d)):&lt;br /&gt;
            # i-th LED OFF&lt;br /&gt;
            if d[i] == 0:                       &lt;br /&gt;
                str += to_hex_word(0) + to_hex_word(255) &lt;br /&gt;
            # i-th LED ON&lt;br /&gt;
            elif d[i] == -1:&lt;br /&gt;
                str += to_hex_word(255) + to_hex_word(0)&lt;br /&gt;
                #str = 'S'&lt;br /&gt;
                # i-th LED blinks d[i] times per second&lt;br /&gt;
                # p1:p2 = on_time:off_time in one blink&lt;br /&gt;
            else:&lt;br /&gt;
                period = clock/d[i]&lt;br /&gt;
                bright = int((clock/d[i]) * factor)&lt;br /&gt;
                dark = period - bright&lt;br /&gt;
                str += to_hex_word(bright) + to_hex_word(dark)&lt;br /&gt;
&lt;br /&gt;
        self.send(str)&lt;br /&gt;
&lt;br /&gt;
    def blinkP300(self,d):&lt;br /&gt;
        clock  = 62500&lt;br /&gt;
        str = chr(4) # 'P300_RUN'&lt;br /&gt;
&lt;br /&gt;
        for i in range(len(d)):&lt;br /&gt;
            period = int(clock*d[i]/1000.0)&lt;br /&gt;
            str += to_hex_word(period)&lt;br /&gt;
            print(period)&lt;br /&gt;
&lt;br /&gt;
        self.send(str)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
--&amp;gt; &amp;lt;!-- Kod w Pythonie 3 --&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# -*- coding: cp1250 -*-&lt;br /&gt;
import serial&lt;br /&gt;
import logging&lt;br /&gt;
import sys&lt;br /&gt;
import os&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
def to_hex_word(a):&lt;br /&gt;
    '''encodes a decimal number hexadecimally on two bytes'''&lt;br /&gt;
    return a.to_bytes(2,byteorder=sys.byteorder)&lt;br /&gt;
 &lt;br /&gt;
class SerialPort(object):&lt;br /&gt;
    def __init__(self, port_name):&lt;br /&gt;
        import serial&lt;br /&gt;
        try:&lt;br /&gt;
            self.port = serial.Serial(&lt;br /&gt;
                port=port_name,&lt;br /&gt;
                baudrate=9600,&lt;br /&gt;
                bytesize=serial.EIGHTBITS,&lt;br /&gt;
                parity=serial.PARITY_NONE,&lt;br /&gt;
                stopbits=serial.STOPBITS_ONE,&lt;br /&gt;
                xonxoff=False&lt;br /&gt;
                )&lt;br /&gt;
        except serial.SerialException as e:&lt;br /&gt;
            print(&amp;quot;Nieprawidłowa nazwa portu lub port zajęty.&amp;quot;)&lt;br /&gt;
            raise e&lt;br /&gt;
        self.close()&lt;br /&gt;
 &lt;br /&gt;
    def open(self):&lt;br /&gt;
        self.port.open()&lt;br /&gt;
 &lt;br /&gt;
    def close(self):&lt;br /&gt;
        self.port.close()&lt;br /&gt;
 &lt;br /&gt;
    def send(self, value):&lt;br /&gt;
        self.port.write(value)&lt;br /&gt;
 &lt;br /&gt;
    def blinkSSVEP(self,d, p1, p2):&lt;br /&gt;
        '''&lt;br /&gt;
        d = list of frequencies;&lt;br /&gt;
        p1:p2 = ratio LED_on_time/LED_off_time&lt;br /&gt;
        if you want i-th LED to be OFF all the time send  d[i] = 0&lt;br /&gt;
        if you want i-th LED to be ON all the time send  d[i] = -1&lt;br /&gt;
        in these two cases p1 and p2 do not matter&lt;br /&gt;
        '''&lt;br /&gt;
        clock  = 62500&lt;br /&gt;
        factor = float(p1) / float(p1 + p2)&lt;br /&gt;
 &lt;br /&gt;
        str = (3).to_bytes(1,byteorder=sys.byteorder) # 'SSVEP_RUN'&lt;br /&gt;
 &lt;br /&gt;
        for i in range(len(d)):&lt;br /&gt;
            # i-th LED OFF&lt;br /&gt;
            if d[i] == 0:                       &lt;br /&gt;
                str += to_hex_word(0) + to_hex_word(255) &lt;br /&gt;
            # i-th LED ON&lt;br /&gt;
            elif d[i] == -1:&lt;br /&gt;
                str += to_hex_word(255) + to_hex_word(0)&lt;br /&gt;
                #str = 'S'&lt;br /&gt;
                # i-th LED blinks d[i] times per second&lt;br /&gt;
                # p1:p2 = on_time:off_time in one blink&lt;br /&gt;
            else:&lt;br /&gt;
                period = clock/d[i]&lt;br /&gt;
                bright = int((clock/d[i]) * factor)&lt;br /&gt;
                dark = int(period - bright)&lt;br /&gt;
                str += to_hex_word(bright) + to_hex_word(dark)&lt;br /&gt;
 &lt;br /&gt;
        self.send(str)&lt;br /&gt;
 &lt;br /&gt;
    def blinkP300(self,d):&lt;br /&gt;
        clock  = 62500&lt;br /&gt;
        str = (4).to_bytes(1,byteorder=sys.byteorder) # 'P300_RUN'&lt;br /&gt;
 &lt;br /&gt;
        for i in range(len(d)):&lt;br /&gt;
            period = int(clock*d[i]/1000.0)&lt;br /&gt;
            str += to_hex_word(period)&lt;br /&gt;
 &lt;br /&gt;
        self.send(str)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
--&amp;gt; &lt;br /&gt;
&lt;br /&gt;
===Zestaw eksperymentalny===&lt;br /&gt;
Zestaw składa się ze:&lt;br /&gt;
* wzmacniacza,&lt;br /&gt;
* stymulatora   &lt;br /&gt;
&amp;lt;!--* izolowanego galwanicznie układu generującego impulsy odpowiadające gaszeniu i zapalaniu diody,  o wartościach dopasowanych do akceptowalnych przez wejścia AUX wzmacniacza,--&amp;gt;&lt;br /&gt;
* komputera: w tym eksperymencie komputer będzie służył do zaprogramowania stymulatora i do rejestracji sygnałów.&lt;br /&gt;
&lt;br /&gt;
===Wersja 1: obserwacja błyskającej diody  ===&lt;br /&gt;
&amp;lt;!--Proszę zapoznać się ze standardami rejestracji wzrokowych potencjałów wywołanych [http://www.gcu.ac.uk/media/gcalwebv2/theuniversity/academicschools/sls/psytimetables/SLS%20-%20VEP_Standard_2010.pdf] --&amp;gt;&lt;br /&gt;
Proszę zapoznać się z typowym wyglądem załamków w przypadku potencjałów wzrokowych, jaki jest przedstawiony na [https://link.springer.com/article/10.1007/s10633-009-9195-4/figures/2 rysunku] (cały artykuł jest dostępny [http://link.springer.com/article/10.1007%2Fs10633-009-9195-4 tu]).&lt;br /&gt;
&amp;lt;!--[[Plik:Fig 4 VEP.jpg|thumb|320px|right|&amp;lt;figure id=&amp;quot;fig:zalamki_VEP&amp;quot;&amp;gt;&amp;lt;/figure&amp;gt;&lt;br /&gt;
&amp;lt;xr id=&amp;quot;fig:zalamki_VEP&amp;quot;&amp;gt;Rys. %i.&amp;lt;/xr&amp;gt; Schemat załamków rozpoznawanych we wzrokowych potencjach wywołanych (z pracy: J. V. Odom i in. &amp;amp;bdquo;ISCEV standard for clinical visual evoked potentials&lt;br /&gt;
(2009 update)&amp;amp;rdquo;, Doc Ophthalmol (2010), 120:111–119).]]&lt;br /&gt;
--&amp;gt; &lt;br /&gt;
&lt;br /&gt;
==== Rejestracja ====&lt;br /&gt;
* Paradygmat: z odległości około 40 cm badany obserwuje wyświetalny na ekranie biały kwadrat. Bodźce trwają 300 ms i  powtarzają się co 0.5 sekundy. Bodziec poprzedza punkt fiksacji pokazywany przez 300 ms. Natężenie bodźca ma przyjąć jedną z 4 wartości (manipulujemy jego przeźroczystością: 1, 0.7, 0.3 i 0.1, gdzie 1 oznacza brak przeźroczystości). Każda z intensywności bodźca ma pojawić się 100 razy podczas badania, bodźce podawane mają być w sposób losowy. Zadanie poprzedza krótka instrukcja, kończy podziękowanie. &lt;br /&gt;
&lt;br /&gt;
* Pomiar&lt;br /&gt;
**Zakładamy czepek i elektrody w systemie 10-20, dbamy o to by opory pomiędzy elektrodami były poniżej 1- k&amp;amp;Omega; i różnice pomiędzy oporami różnych elektrod nie przekraczały 20%. [[Plik:Glowka10-20 ERPy.svg|thumb|600px|right]]&lt;br /&gt;
** Elektrodę GND mocujemy w otworze czepka odpowiadającym pozycji AFz (na linii centralnej 10% w stronę nosa od elektrody Fz) &lt;br /&gt;
** Montujemy także elektrody M1 i M2 i FCz. &lt;br /&gt;
&lt;br /&gt;
==== Analiza ====&lt;br /&gt;
# Filtrujemy sygnał w paśmie 1-20 Hz.&lt;br /&gt;
# Z ciągłego zapisu wycinamy fragmenty od &amp;amp;minus;300 ms do +800 ms (zero oznacza moment wystąpienia bodźca). W czasie wycinania badamy wycinane fragmenty pod względem zakresu amplitudy (wszystkie kanały powinny mieć amplitudę w granicach &amp;amp;plusmn;75 &amp;amp;mu;V) i zawartości artefaktów od mrugania (w tym celu trzeba oglądając sygnał w SVAROG-u ustalić próg na amplitudę sygnału w kanałach Fp1 i Fp2).&lt;br /&gt;
# Uśredniamy wycięte sygnały.&lt;br /&gt;
# Rysujemy średni potencjał we wszystkich kanałach.&lt;br /&gt;
# Pierwszy sposób: Identyfikujemy załamki P1 i N2. Mierzymy amplitudę P1 jako różnicę między ekstremalną wartością załamka N2 a ekstremalną wartością załamka N2. &lt;br /&gt;
# Drugi sposób: Identyfikujemy załamki P1 i N2. Mierzymy amplitudę P1 w stosunku do zera. &lt;br /&gt;
#porównujemy uzyskane amplitudy w 4 warunkach za pomocą odpowiedniego testu statystycznego (porównanie warunków ze skrajnymi wartościami amplitudy - zastosuj test permutacyjny (opisany poniżej) lub test t-Studenta/nieparametryczny odpowiednik). &lt;br /&gt;
&lt;br /&gt;
**Opis testu permutacyjnego &lt;br /&gt;
Pytanie: Czy intensywność bodźca wpływa na amplitudę potencjału P1?&lt;br /&gt;
Jak stwierdzić czy amplitudy załamków P1 istotnie różnią się pomiędzy seriami?&lt;br /&gt;
&lt;br /&gt;
Musimy przeprowadzić test statystyczny. Możemy skonstruować go np. tak:&lt;br /&gt;
Mamy dwa warunki I i II. Jako statystykę przyjmiemy różnicę pomiędzy amplitudą załamka zmierzoną w serii z dwoma diodami (P2&amp;lt;sub&amp;gt;II&amp;lt;/sub&amp;gt;) a amplitudą zmierzoną w serii z jedną diodą (P2&amp;lt;sub&amp;gt;I&amp;lt;/sub&amp;gt;):&lt;br /&gt;
: ''S'' = P2&amp;lt;sub&amp;gt;II&amp;lt;/sub&amp;gt; &amp;amp;minus; P2&amp;lt;sub&amp;gt;I&amp;lt;/sub&amp;gt;&lt;br /&gt;
Postawmy hipotezę zerową, że nie ma różnicy w amplitudzie pomiędzy warunkiem II a I oraz hipotezę alternatywną, że różnica taka występuje.&lt;br /&gt;
: H&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;: ''S'' = 0&lt;br /&gt;
: H&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;: ''S'' &amp;amp;ne; 0&lt;br /&gt;
Zgodnie z H&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; dla wartości ''S'' nie ma różnicy czy realizacja została zarejestrowana w warunkach I czy II, zatem można losowo poprzypisywać numery warunków do realizacji i w ten sposób uzyskać rozkład statystyki ''S'' pod warunkiem prawdziwości H&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;, czyli obliczyć średnie potencjały dla &amp;amp;bdquo;pomieszanych&amp;amp;rdquo; tagów, wyliczyć średnie potencjały dla sztucznie wygenerowaych grup, i wyliczyć różnicę amplitud dla tych średnich, czyli wartość statystyki dla hipotezy H&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Zaimplementuj test permutacyjny zgodny z powyższą koncepcją.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- ===Wersja 2: obserwacja habituacji / uśrednianie w blokach ===&lt;br /&gt;
==== Rejestracja ====&lt;br /&gt;
# Paradygmat: &lt;br /&gt;
#* z odległości około 40 cm badany obserwuje błyski diody. &lt;br /&gt;
#* Błyski powtarzają się co 0,5 sekundy. &lt;br /&gt;
#* Rejestrujemy 60 serii po 15 błysków.  &lt;br /&gt;
#* Pomiędzy seriami badany odpoczywa około 10 sekund.&lt;br /&gt;
# Zakładamy czepek i elektrody w systemie 10-20, dbamy o to by opory pomiędzy elektrodami były poniżej 5 k&amp;amp;Omega; i różnice pomiędzy oporami różnych elektrod nie przekraczały 20%.&lt;br /&gt;
#* Elektrodę GND mocujemy w otworze czepka odpowiadającym pozycji AFz (na linii centralnej 10% w stronę nosa od elektrody Fz) &lt;br /&gt;
#* Montujemy także elektrodę FCz (na linii centralnej pomiędzy Fz a Cz), będziemy jej używać w montażu i w czasie analizy jako referencji.&lt;br /&gt;
#* Częstość próbkowania 512 Hz.&lt;br /&gt;
&lt;br /&gt;
==== Analiza ====&lt;br /&gt;
# Filtrujemy sygnał w paśmie 0,1-20 Hz.&lt;br /&gt;
# Z ciągłego zapisu wycinamy fragmenty od &amp;amp;minus;300 ms do +600 ms (zero oznacza moment wystąpienia bodźca). W czasie wycinania badamy wycinane fragmenty pod względem zakresu amplitudy (wszystkie kanały powinny mieć amplitudę w granicach &amp;amp;plusmn;75 &amp;amp;mu;V) i zawartości artefaktów od mrugania (w tym celu trzeba oglądając sygnał w SVAROG-u ustalić próg na amplitudę sygnału w kanałach Fp1 i Fp2).&lt;br /&gt;
# Uśredniamy wycięte sygnały o tym samym numerze wewnątrz serii.&lt;br /&gt;
# Rysujemy serie 15 uśrednionych potencjałów dla tego kanału, który wykazywał najsilniejszy potencjał w pierwszej wersji eksperymentu. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Zadanie 3: rejestracja i analiza potencjału P3 ==&lt;br /&gt;
==== Rejestracja ====&lt;br /&gt;
# Paradygmat: &lt;br /&gt;
#* z odległości około 40 cm badany obserwuje błyski diody. &lt;br /&gt;
#* Błyski diody nr 1 powtarzają się co 1&amp;amp;plusmn;0,1 sekundy. &lt;br /&gt;
#* W losowych realizacjach zapalana jest także dioda nr 2. &lt;br /&gt;
#* Proporcja pomiędzy liczbą błysków pojedynczych i podwójnych powinna wynosić 10:2, przy czym błyski podwójne muszą być odseparowane co najmniej jednym błyskiem pojedynczym. &lt;br /&gt;
#* Czas zapalenia diod, tak jak w poprzednich eksperymentach, wynosi 20 ms. &lt;br /&gt;
#* Zadaniem badanego jest liczenie liczby błysków podwójnych.&lt;br /&gt;
#* Wykonujemy tyle realizacji aby zarejestrować 50 powtórzeń podwójnych błysków. &lt;br /&gt;
# Zakładamy czepek i elektrody w systemie 10-20, dbamy o to by opory pomiędzy elektrodami były poniżej 5 k&amp;amp;Omega; i różnice pomiędzy oporami różnych elektrod nie przekraczały 20%.&lt;br /&gt;
#* Elektrodę GND mocujemy w otworze czepka odpowiadającym pozycji AFz (na linii centralnej 10% w stronę nosa od elektrody Fz) &lt;br /&gt;
#* Montujemy także elektrody M1 i M2, będziemy ich używać w montażu i w czasie analizy jako referencji typu połączone uszy.&lt;br /&gt;
#* Częstość próbkowania 512 Hz.&lt;br /&gt;
&lt;br /&gt;
==== Analiza ====&lt;br /&gt;
# Filtrujemy sygnał w paśmie 0,1-20 Hz.&lt;br /&gt;
# Z ciągłego zapisu wycinamy fragmenty od &amp;amp;minus;300 ms do +600 ms (zero oznacza moment wystąpienia bodźca). W czasie wycinania badamy wycinane fragmenty pod względem zakresu amplitudy (wszystkie kanały powinny mieć amplitudę w granicach &amp;amp;plusmn;75 &amp;amp;mu;V) i zawartości artefaktów od mrugania (w tym celu trzeba oglądając sygnał w SVAROG-u ustalić próg na amplitudę sygnału w kanałach Fp1 i Fp2).&lt;br /&gt;
# Uśredniamy osobno realizacje błysków pojedynczych i błysków podwójnych.&lt;br /&gt;
# Nakładamy na siebie na rysunkach oba typy średnich.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Ćwiczenie dodatkowe: P300 BCI==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wykorzystujemy elektrody z systemu 10-10 umieszczone nad korą wzrokową: P07, O1, O2, PO8, PO3, PO4, Pz, Cz.&lt;br /&gt;
&lt;br /&gt;
Uruchamiamy &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
obci_gui --presets eeg_workshop&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
i z guzika &amp;amp;bdquo;select amplifier&amp;amp;rdquo; wybieramy właściwy wzmacniacz.&lt;br /&gt;
&lt;br /&gt;
Do kontroli jakości sygnału możemy uruchomić Svaroga.&lt;br /&gt;
&lt;br /&gt;
Dane z kalibracji zapisują się w pliku test1 w katalogu domowym użytkownika, z labiryntu w pliku test2.&lt;br /&gt;
&lt;br /&gt;
Po zakończeniu kalibracji pojawia się napis &amp;amp;bdquo;Trwają obliczenia&amp;amp;rdquo; lub podobny. Odczekujemy kilka minut, aż skończy się peer &amp;amp;bdquo;Calibration&amp;amp;rdquo; (widoczny w obci_gui) i zamykamy okienko klawiszami Alt-F4 lub zatrzymując scenariusz guzikiem &amp;amp;bdquo;Stop&amp;amp;rdquo;. W katalogu domowym pojawi się plik z wynikami kalibracji, co pozwala na uruchomienie scenariusza &amp;amp;bdquo;labirynt&amp;amp;rdquo;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Po zebraniu danych, przed wczytaniem ich do Svaroga należy w tym samym katalogu uruchomić skrypt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
#!/usr/bin/env python&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
&lt;br /&gt;
from obci.analysis.obci_signal_processing.tags import tags_file_writer&lt;br /&gt;
from obci.analysis.obci_signal_processing.read_manager import ReadManager&lt;br /&gt;
&lt;br /&gt;
def main(): &lt;br /&gt;
	file_name = 'test1'&lt;br /&gt;
	&lt;br /&gt;
	mgr = ReadManager(&lt;br /&gt;
		file_name + '.obci.xml',&lt;br /&gt;
		file_name + '.obci.raw',&lt;br /&gt;
		file_name + '.obci.tag')&lt;br /&gt;
	&lt;br /&gt;
	tags = mgr.get_tags()&lt;br /&gt;
	for i in xrange(0, len(tags)):&lt;br /&gt;
		if tags[i]['desc']['index'] == tags[i]['desc']['target']:&lt;br /&gt;
			tags[i]['name'] = 'blink_target'&lt;br /&gt;
		else:&lt;br /&gt;
			tags[i]['name'] = 'blink'&lt;br /&gt;
			&lt;br /&gt;
	tags_writer = tags_file_writer.TagsFileWriter(file_name + '.obci.tag')&lt;br /&gt;
	for tag in tags:&lt;br /&gt;
		tags_writer.tag_received(tag)		&lt;br /&gt;
	tags_writer.finish_saving(0)	&lt;br /&gt;
 &lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Aduszyk</name></author>
		
	</entry>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=Pracownia_EEG/Potencja%C5%82y_wywo%C5%82ane&amp;diff=8969</id>
		<title>Pracownia EEG/Potencjały wywołane</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=Pracownia_EEG/Potencja%C5%82y_wywo%C5%82ane&amp;diff=8969"/>
		<updated>2022-11-08T10:16:17Z</updated>

		<summary type="html">&lt;p&gt;Aduszyk: /* Wersja 2: obserwacja habituacji / uśrednianie w blokach */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Pracownia EEG|Pracownia EEG]] / Potencjały wywołane&lt;br /&gt;
&lt;br /&gt;
=Wstęp=&lt;br /&gt;
==Potencjały wywołane==&lt;br /&gt;
=== Wstęp ===&lt;br /&gt;
Potencjały wywołane EEG (ang. ''evoked potentials'', EP) są śladami odpowiedzi mózgu na bodźce. W przypadku MEG poprawnie mówi się o polach wywołanych (ang. ''evoked fields'', EF).&lt;br /&gt;
Zwykle reakcja ta jest mała (wyjątek stanowią [[Elektroencefalografia/Metody_analizy_sygnałów_EEG_-_analiza_w_dziedzinie_czasu |kompleksy K]]) i w zapisie pojedynczej realizacji reakcji na bodziec najczęściej niewidoczna wśród czynności pochodzącej od wielu innych procesów zachodzących w tym samym czasie w mózgu. &lt;br /&gt;
Ich wyodrębnienie z tak zwanego tła EEG/MEG, czyli manifestacji elektrycznej innych, trwających w tym samym czasie w mózgu procesów (aktywny prąd niezależny), wymaga w dniu dzisiejszym zapisu odpowiedzi na szereg powtórzeń tego samego bodźca (&amp;lt;xr id=&amp;quot;fig:EP&amp;quot;&amp;gt;rys. %i&amp;lt;/xr&amp;gt;). Pierwsze potencjały wywołane pokazał pod koniec lat 40-tych Dawson (Dawson 1947) wykonując superpozycję pojedynczych realizacji na kliszy fotograficznej.&lt;br /&gt;
Z czasem skomplikowane urządzenia analogowe zastąpione zostały przez cyfrowe uśrednianie kolejnych fragmentów EEG, zsynchronizowanych według momentu wystąpienia bodźca, łatwo realizowane za pomocą komputera.&lt;br /&gt;
&lt;br /&gt;
[[Grafika:EP.png|thumb|640px|center|&amp;lt;figure id=&amp;quot;fig:EP&amp;quot;&amp;gt;&amp;lt;/figure&amp;gt;&lt;br /&gt;
Uśrednianie potencjałów wywołanych. a) ciągły zapis EEG z wyróżnionymi momentami wystąpienia bodźca (w tym przypadku słuchowego) b) kilkadziesiąt kolejnych odcinków, wyciętych jako sekunda EEG od momentu wystąpienia kolejnych bodźców, ustawione jeden pod drugim c) uśredniony potencjał wywołany &amp;amp;mdash; widać m. in. załamek P300 ok. 300 milisekund po bodźcu]]&lt;br /&gt;
&lt;br /&gt;
Techniki te opierają się na założeniu, że zawarta w EEG odpowiedź mózgu na każdy z kolejnych bodźców jest niezmienna, a EEG odzwierciedlające pozostałe procesy traktowane jest jak nieskorelowany z nią proces stochastyczny. Zależnie od rodzaju potencjałów wywołanych, założenia te są mniej lub bardziej nieuzasadnione; podważa je choćby powszechnie znany efekt habituacji, polegający na osłabieniu późnych potencjałów wywołanych kolejnymi powtórzeniami bodźca.&lt;br /&gt;
&lt;br /&gt;
Istota potencjałów wywołanych jest przedmiotem otwartej dyskusji i dziesiątków prac, dotykających od lat podstawowych w tej dziedzinie pytań: czym jest potencjał wywołany, który widzimy w uśrednionym przebiegu? Czy naprawdę wynika z deterministycznie powtarzanej, jednakowej odpowiedzi pojawiającej się po każdym powtórzeniu bodźca niezależnie od &amp;amp;bdquo;tła&amp;amp;rdquo;, czy może wynika z reorganizacji faz tego właśnie &amp;amp;bdquo;tła&amp;amp;rdquo; EEG, czy może kombinacji tych dwóch efektów? Jest to wspaniałe pole dla zastosowań zaawansowanych metod modelowania i analizy sygnałów. W ostatnich latach powstają dziesiątki prac na ten temat, a od czasu do czasu również krytyczne artykuły wykazujące, że dotychczasowe odkrycia są raczej artefaktami stosowanych metod a nie wynikają z własności analizowanych danych (Yeung et al., 2004). Jak widać jest tu wciąż bardzo wiele do zrobienia, gdyż zrozumienie tego mechanizmu stoi na drodze do &amp;amp;bdquo;świętego Graala&amp;amp;rdquo;, którym w tej dziedzinie jest wyodrębnienie pojedynczych potencjałów wywołanych.&lt;br /&gt;
&lt;br /&gt;
Niezależnie od tego, w neurofizjologii klinicznej nazwą potencjał wywołany określa się krzywą widoczną po uśrednieniu odpowiedzi na kilkanaście do kilku tysięcy bodźców (Szelenberger 2000). Gromadzona od dziesięcioleci wiedza o behawioralnych i klinicznych korelatach potencjałów wywołanych opiera się na rozpoznawaniu w przebiegach uśrednionych tak zwanych załamków, czyli przejściowych wzrostów lub spadków potencjału (na przykład na &amp;lt;xr id=&amp;quot;fig:EP&amp;quot;&amp;gt;rys. %i&amp;lt;/xr&amp;gt; widać załamek P300). Nazwy załamków składają się zwykle z litery &amp;amp;bdquo;P&amp;amp;rdquo; (od ang. ''positive''), jeśli wychylenie jest dodatnie, lub &amp;amp;bdquo;N&amp;amp;rdquo; (od ang. ''negative''), jeśli wychylenie jest ujemne, oraz liczby. Uwaga: &lt;br /&gt;
* Nie ma niestety jednej ustalonej konwencji prezentacji potencjałów koniecznie trzeba więc zwracać uwagę na orientację wykresu, a wykonując wykres samemu - zamieszczać informację o orientacji kierunku dodatniego,gdyż kierunek dodatni może być wykresie skierowany do góry lub do dołu. &lt;br /&gt;
* Liczba następująca po N lub P określa przybliżoną liczbę milisekund od wystąpienia bodźca, czyli tak zwaną latencję. Nie można jednak ścisłego związku między tą liczbą a liczbą milisekund np. potencjał P300 w zależności od szczegółów paradygmatu doświadczalnego może wystąpić znacznie później. np. w eksperymentach językowych zdarza się że P300 występuje później niż N400 :-).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;xr id=&amp;quot;fig:zalamki&amp;quot;&amp;gt;Rys. %i&amp;lt;/xr&amp;gt; przedstawia schematycznie najważniejsze załamki rozpoznawane w potencjałach słuchowych, czyli wywoływanych bodźcem dźwiękowym. Dla potencjałów wzrokowych i somatosensorycznych istnieją podobne klasyfikacje.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Grafika:Zalamki.png|thumb|320px|right|&amp;lt;figure id=&amp;quot;fig:zalamki&amp;quot;&amp;gt;&amp;lt;/figure&amp;gt;&lt;br /&gt;
Orientacyjny schemat załamków rozpoznawanych w słuchowych potencjach wywołanych, na podstawie (Szelenberger 2000). Skala czasu logarytmiczna. Najszybsze (do 12 ms) składowe egzogenne to potencjały pniowe (BAEP), oznaczane jako fale I-VII. Litery &amp;amp;bdquo;P&amp;amp;rdquo; i &amp;amp;bdquo;N&amp;amp;rdquo; oznaczają dodatnie i ujemne wychylenia związane z dalszymi załamkami]]&lt;br /&gt;
&lt;br /&gt;
Najszybsze (czyli o najmniejszej latencji) składowe to potencjały egzogenne, odzwierciedlające wstępne fazy przekazu informacji. W potencjałach słuchowych są to potencjały pnia (ang. ''brainstem auditory evoked potentials'', BAEP), składające się z siedmiu fal występujących pomiędzy 1 a 12 ms od bodźca. Są one generowane np. w nerwie słuchowym czy pniu mózgu, i wykorzystywane w klinicznej diagnostyce integralności dróg słuchowych. Podobnie jak inne wczesne potencjały o latencjach poniżej 100 ms, są praktycznie niezależne od stanu uwagi.&lt;br /&gt;
&lt;br /&gt;
Po potencjałach o średniej latencji (między 12 a 50 ms) zaczynają się późne potencjały słuchowe (od 100 ms od podania bodźca), odzwierciedlające bardziej złożone reakcje na bodziec. Potencjały ok. 100 ms obserwowane w okolicach sensorycznych odzwierciedlają odpowiedź tejże kory na bodziec. Ich amplituda zależy od parametrów fizycznych bodźca oraz od uwagi, np. amplituda załamka N100 wzrasta w stanie skupienia uwagi czy pobudzenia emocjonalnego. Pierwszy i najpopularniejszy całkowicie endogenny załamek to P300, pojawiający się po rozpoznaniu bodźca oczekiwanego, na którym skupiamy uwagę: na przykład, jeśli w serii pojawiających się losowo liter mamy zliczać wystąpienia jednej z nich, to na średniej odpowiedzi na pojawienie się tej litery pojawi się załamek P300. Załamek ten występuje również w odpowiedzi na bodźce wyczekiwane, niespodziewane i ważne dla osoby (np. własne imię). &lt;br /&gt;
&lt;br /&gt;
=== Uśrednianie w dziedzinie czasu ===&lt;br /&gt;
Jak już było wspomniane powyżej podstawową techniką stosowaną do analizy potencjałów wywołanych jest uśrednianie wielu realizacji odpowiedzi na bodziec wyrównanych względem jakiegoś charakterystycznego zdarzenia, np. momentu podania bodźca albo momentu behawioralnej reakcji na bodziec (np. wciśnięcie przycisku). Podejście to bazuje na trzech założeniach:&lt;br /&gt;
* Reakcja jest czasowo związana z bodźcem. Tzn. w kolejnych realizacjach występuje ona zawsze z tym samym opóźnieniem.&lt;br /&gt;
* Reakcja na bodziec skutkuje zawsze pojawieniem się w sygnale składowej o stałym kształcie (mówimy o stałej morfologii).&lt;br /&gt;
* Spontaniczna czynność EEG &amp;amp;mdash; ta która nie dotyczy przetwarzania interesującego nas bodźca &amp;amp;mdash; jest niezależnym, stacjonarnym szumem o średniej zero.&lt;br /&gt;
&lt;br /&gt;
Zgodnie z powyższymi założeniami mierzony w ''i''-tej realizacji sygnał można wyrazić jako:&lt;br /&gt;
: &amp;lt;math&amp;gt;x_i(t) = s(t) + n_i(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
Uśrednianie po ''N'' realizacjach daje:&lt;br /&gt;
: &amp;lt;math&amp;gt;\bar x (t) = \frac{1}{N} \sum_{i=1}^N x_i(t) = \frac{1}{N} \left(N s(t) + \sum_{i=1}^N n_i(t) \right) &amp;lt;/math&amp;gt;&lt;br /&gt;
Wartość oczekiwana średniego sygnału wynosi:&lt;br /&gt;
: &amp;lt;math&amp;gt;\mathrm{E}\left[ \bar x(t) \right] = s(t) &amp;lt;/math&amp;gt;&lt;br /&gt;
gdyż dla szumu o średniej zero mamy:&lt;br /&gt;
: &amp;lt;math&amp;gt;\mathrm{E}\left[\frac{1}{N} \sum_{i=1}^N n_i(t)\right] = 0&amp;lt;/math&amp;gt;.&lt;br /&gt;
Wariancja &amp;lt;math&amp;gt;\bar x(t)&amp;lt;/math&amp;gt; wynosi:&lt;br /&gt;
: &amp;lt;math&amp;gt;\sigma^2_{\bar x(t)} = \mathrm{E} \left[  \left( \frac{1}{N} \sum_{i=1}^N n_i(t)\right)^2 \right] \approx \frac{1}{N} \sigma^2_{n(t)}&amp;lt;/math&amp;gt;&lt;br /&gt;
gdyż &amp;lt;math&amp;gt;s(t)&amp;lt;/math&amp;gt; jest deterministyczne. &lt;br /&gt;
&lt;br /&gt;
Dla potencjałów pojawiających się w pierwszych kilkudziesięciu milisekundach po bodźcu model ten można uznać za poprawny, gdyż wykazują one zależność głównie od parametrów fizycznych bodźca. Dla późniejszych składowych staje się on coraz bardziej wątpliwy ze względu na występujące korelacje ze stanem (np. uwagi) badanego.&lt;br /&gt;
&lt;br /&gt;
Dla późniejszych składowych można by postulować bardziej ogólną wersję modelu potencjału wywołanego:&lt;br /&gt;
: &amp;lt;math&amp;gt;x_i(t) = s_i(t) + n_i(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
Ten model uwidacznia, że do opisu potencjału wywołanego potrzebna jest nie tylko średnia, ale i wyższe momenty rozkładu (np. drugi moment centralny czyli wariancja).&lt;br /&gt;
&lt;br /&gt;
====Wariancja w przypadku szumu skorelowanego ====&lt;br /&gt;
W poprzednim paragrafie pokazaliśmy, że w przypadku niezależnego szumu wariancja uśrednionego sygnału (w danej chwili czasu) maleje jak  &amp;lt;math&amp;gt;\frac{1}{N}&amp;lt;/math&amp;gt;. Jednak w przypadku gdy kolejne próbki szumu są skorelowane (np. występuje silna aktywność rytmiczna alfa) sytuacja się komplikuje. Intuicyjnie łatwo możemy to sobie wyobrazić w granicznym przypadku. Załóżmy, że tło dla  potencjałów o stałej morfologii   stanowi sinusoida. Jeśli będziemy podawać bodźce w odstępach będących wielokrotnością okresu tej sinusoidy to w uśrednianych fragmentach sygnału owa sinusoida jest tak samo powtarzalna jak badany potencjał i uśrednianie nie prowadzi do poprawy stosunku amplitudy sygnału do amplitudy tła. &lt;br /&gt;
&lt;br /&gt;
Stopień zależności pomiędzy próbkami można zmierzyć przy pomocy funkcji autokorelacji. &lt;br /&gt;
Jeśli funkcję autokorelacji przybliżymy przez:&lt;br /&gt;
: &amp;lt;math&amp;gt;R_{xx}(\tau) = \sigma^2 \exp(-\beta |\tau|) \cos(2 \pi f_0 \tau)&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\sigma^2&amp;lt;/math&amp;gt; jest wariancją szumu, &amp;lt;math&amp;gt;f_0&amp;lt;/math&amp;gt; jest średnią częstością aktywności rytmicznej, &amp;lt;math&amp;gt;\beta/ \pi&amp;lt;/math&amp;gt; jest szerokością pasma tej czynności, zaś &amp;lt;math&amp;gt;\tau&amp;lt;/math&amp;gt; opóźnieniem, to wariancję potencjału wywołanego można wyrazić jako&amp;lt;!-- \cite{Spekreijse_1976}--&amp;gt;:&lt;br /&gt;
: &amp;lt;math&amp;gt;\sigma^2_{\bar x(t)} = \frac{\sigma^2}{N} \left[ \frac{1-\exp(-2 \beta T)}{1 - 2 \exp(- \beta T) \cos(2 \pi f_0 T) +\exp(-2 \beta T)} \right]&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; jest odstępem między bodźcami. &lt;br /&gt;
Widać stąd, że obecność czynności rytmicznej w tle wpływa na stosunek sygnału do szumu. Z powyższego równania widać, że stosunek wariancji dąży do &amp;lt;math&amp;gt;\frac{\sigma^2}{N}&amp;lt;/math&amp;gt; gdy &amp;lt;math&amp;gt;\beta T&amp;lt;/math&amp;gt; staje się duże.  &lt;br /&gt;
&lt;br /&gt;
Periodyczna stymulacja może ponadto prowadzić do wzbudzenia czynności rytmicznej o częstości równej częstości pobudzania bądź jej harmonicznej.&lt;br /&gt;
&lt;br /&gt;
===Wariancja latencji===&lt;br /&gt;
&lt;br /&gt;
Jedną z form zmienności potencjału wywołanego w pojedynczych realizacjach jest wariancja latencji. &lt;br /&gt;
[[Grafika:Wariancja_latencji.png|thumb|500px|right|&lt;br /&gt;
Czerwona linia: Uśrednianie 100 potencjałów wywołanych o latncjach z rozkładu normalnego N(300,30 ), Niebieskie linie: przykładowe pojedyncze realizacje wzięte do średniej]]&amp;lt;!--# -*- coding: utf-8 -*-&lt;br /&gt;
from __future__ import division&lt;br /&gt;
import numpy as np&lt;br /&gt;
from matplotlib.pyplot import plot, show ,subplot, figure, title, xlabel, ylabel, ylim&lt;br /&gt;
 &lt;br /&gt;
def fun(t,lat=100):&lt;br /&gt;
    return np.exp(-(t-lat)**2/(2*30**2))&lt;br /&gt;
Fs = 1&lt;br /&gt;
N = 100&lt;br /&gt;
t = np.arange(0,700)&lt;br /&gt;
f = np.zeros((N,700))&lt;br /&gt;
f_sr = np.zeros(t.shape)&lt;br /&gt;
for i in range(N):&lt;br /&gt;
    f[i,:] = fun(t,lat = 300 + 30* np.random.randn())&lt;br /&gt;
for i in range(3):&lt;br /&gt;
    plot(t,f[i,:], 'b')&lt;br /&gt;
plot(t,f.mean(0),'r')&lt;br /&gt;
show()--&amp;gt;&lt;br /&gt;
Zmienność latencji prowadzi do:&lt;br /&gt;
* zmniejszenia amplitudy &amp;lt;math&amp;gt;\bar x&amp;lt;/math&amp;gt;&lt;br /&gt;
* wzrostu rozciągłości czasowej załamka&lt;br /&gt;
&lt;br /&gt;
O tych konsekwencjach zmienności latencji należy w szczególności pamiętać porównując średnie potencjały uzyskane w różnych warunkach eksperymentalnych. Gdy zauważymy, że średnie potencjały różnią się amplitudą należy rozważyć możliwość, że w istocie warunki eksperymentalne wpływają na różnice w wariancji latencji. &lt;br /&gt;
&lt;br /&gt;
Naturalne jest, że zmienność latencji jest bardziej widoczna w przypadku załamków trwających krótko niż w przypadku załamków trwających długo. Wariancja latencji rożnie wraz z jej wartością, stąd wśród późnych składowych potencjałów wywołanych nie obserwuje się komponentów krótkotrwałych.&lt;br /&gt;
&amp;lt;!--====Uśrednianie metodą Woody'ego ====&lt;br /&gt;
&lt;br /&gt;
Model potencjału ze zmienną latencją i sposób na jego efektywniejsze uśrednianie zaproponował Woody (1967). Model ten zakłada, że w każdej realizacji występuje komponent addytywny &amp;lt;math&amp;gt;s_i(t)\;&amp;lt;/math&amp;gt;, który co do kształtu jest stały, a pomiędzy realizacjami różni się tylko latencją:&lt;br /&gt;
: &amp;lt;math&amp;gt; s_i(t) = s(t +\Delta t_i)\;&amp;lt;/math&amp;gt;&lt;br /&gt;
Woody zaproponował aby &amp;lt;math&amp;gt;\Delta t_i\;&amp;lt;/math&amp;gt; szacować na podstawie maksimum funkcji korelacji wzajemnej pomiędzy ''i''-tą realizacją a wzorcem. W pierwszym kroku wzorcem jest średni potencjał uzyskany przez proste uśrednienie realizacji.  Następnie w sposób iteracyjny dokonuje się:&lt;br /&gt;
* poprawek w wyrównaniu poszczególnych realizacji,&lt;br /&gt;
* obliczenia nowego wzorca poprzez uśrednienie realizacji po korekcie wyrównania,&lt;br /&gt;
* obliczenia nowych poprawek do wyrównania realizacji.--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Habituacja ===&lt;br /&gt;
Zmienność w odpowiedziach na kolejno występujące po sobie bodźce można podzielić na komponent stochastyczny i deterministyczny. Komponent deterministyczny odzwierciedla zmianę czułości  układu nerwowego  na kolejne bodźce. Nowy bodziec często wywołuje reakcje pobudzenia widoczną w wielu parametrach takich jak przewodnictwo skóry, rytm serca i reaktywność kory mózgowej. Powszechnie obserwowanym zjawiskiem jest spadek reaktywności na powtarzające się bodźce zwany habituacją. Niekiedy obserwuje się także zjawisko przeciwne &amp;amp;mdash; wzrost reaktywności na bodziec &amp;amp;mdash; zwane sensytyzacją. &lt;br /&gt;
&lt;br /&gt;
Klasycznym sposobem na badanie tych zjawisk w potencjałach wywołanych jest uśrednianie w podzbiorach lub  uśrednianie blokowe. Wymaga ono  zmiany paradygmatu rejestracji danych. Załóżmy, że interesującym nas bodźcem jest błysk światła. Chcemy zaobserwować ewentualne zmiany amplitudy i latencji w ciągu 100 potencjałów będących reakcją na błysk powtarzający się co 500 ms.&lt;br /&gt;
====Uśrednianie w podzbiorach ====&lt;br /&gt;
W metodzie tej musimy założyć, że proces habituacji jest powolny, tzn. zmiany pomiędzy kolejnymi reakcjami są bardzo małe. W takim przypadku możemy podzielić długą serię bodźców na ciąg pod-serii i uśrednienie przeprowadzić dla każdej pod-serii osobno.&lt;br /&gt;
[[Plik:Usrednianie_podzbiory.svg‎|640px|thumb|center|Ilustracja uśredniania w podzbiorach]]&lt;br /&gt;
&lt;br /&gt;
====Uśrednianie blokowe====&lt;br /&gt;
W tym celu eksperyment wykonujemy w wielu seriach. Jedna seria składa się ze 100 błysków powtarzanych co 500 ms.  Po serii następuje przerwa trwająca np. 5 s (długość przerwy wyraża nasze oszacowanie czasu potrzebnego na zanik habituacji). Po przerwie seria jest powtarzana. Powtórzeń serii wykonujemy ''N''.&lt;br /&gt;
Następnie uśredniamy fragmenty sygnałów odpowiadające sobie w kolejnych seriach. &lt;br /&gt;
&lt;br /&gt;
W tym paradygmacie zakładamy, że każda seria rejestrowana jest w tych samych warunkach. Zaniedbujemy efekty związane ze zmęczeniem i zmianami w np. stopniu koncentracji badanego.&lt;br /&gt;
[[Plik:Usrednianie blokowe.svg|Usrednianie blokowe.svg|640px|thumb|center|Ilustracja uśredniania w blokach]]&lt;br /&gt;
&lt;br /&gt;
===Załamki w krzywej potencjału wywołanego vs ukryte komponenty===&lt;br /&gt;
Komponenta potencjału wywołanego to bardzo ważne ale jednocześnie źle określone pojęcie. Krzywa otrzymana w wyniku uśredniania potencjałów wywołanych przedstawia serię załamków dodatnich i ujemnych, ale trzeba być świadomym, że ten przebieg napięcia rejestrowany przez elektrody przedstawia tak naprawdę sumę potencjałów pochodzących od wielu dość niezależnie działających źródeł w mózgu. Przyczynek pochodzący od jednego funkcjonalnego źródła będziemy określać jako komponentę. &lt;br /&gt;
&lt;br /&gt;
Komentarza wymaga też pojęcie źródła funkcjonalnego. Czynność elektryczną synchronicznie działających neuronów piramidalnych w określonym fragmencie kory mózgowej z pewnej odległości można przybliżyć potencjałem dipola prądowego. Taki aktywny fragment kory stanowi źródło dające przyczynek do mierzonego na powierzchni głowy potencjału. W najprostszej sytuacji taki przyczynek może być obserwowany jako komponenta. Mózg jest jednak obiektem niezwykle złożonym i gęsto połączonym. Wiele obszarów korowych może być funkcjonalnie połączonych i aktywowanych synchronicznie w celu realizacji określonego zadania &amp;amp;mdash; o takim funkcjonalnym zespole też możemy myśleć jako o pojedynczym źródle, choć może ono mieć złożoną strukturę przestrzenną. Często zatem myślimy o komponentach ukrytych potencjału wywołanego jako o aktywności takich funkcjonalnych zespołów. &lt;br /&gt;
&lt;br /&gt;
Po tym wstępie widać już chyba, że do zrozumienia co dzieje się w czasie reakcji na bodziec, którą obserwujemy w potencjale wywołanym, bardziej pożądane byłoby badanie komponent ukrytych niż poszczególnych załamków krzywej potencjału wywołanego, która stanowi ważoną sumę owych komponentów. Zanim przejdziemy do omówienia technik służących &amp;amp;bdquo;wyłuskiwaniu&amp;amp;rdquo; komponent prześledźmy kilka symulacji i wnioski z nich płynące.&lt;br /&gt;
&lt;br /&gt;
==== Załamki i komponenty nie są tym samym.====&lt;br /&gt;
Tę samą krzywą można otrzymać na nieskończenie wiele sposobów  przez sumowanie rożnych kombinacji domniemanych komponentów. Przykładowy rysunek pokazuje, jak tę samą krzywą można złożyć z dwóch rożnych zestawów komponentów (kod wytwarzający przykładową symulację pokazany jest poniżej).&lt;br /&gt;
[[Plik:Sumowanie_komponentow1.png|center|thumb|600px| Panel a) przedstawia hipotetyczną krzywą ERP, panel b) jedna z możliwych dekompozycji sygnału w panelu a), panel c) inna możliwa dekompozycja sygnału z panelu a) ]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
from __future__ import division&lt;br /&gt;
import numpy as np&lt;br /&gt;
from matplotlib.pyplot import plot, show ,subplot, figure, title, xlabel, ylabel, ylim&lt;br /&gt;
&lt;br /&gt;
Fs = 1&lt;br /&gt;
t = np.arange(0,700)&lt;br /&gt;
&lt;br /&gt;
C1 = np.exp(-(t-100)**2/(2*30**2))&lt;br /&gt;
C2 = np.exp(-(t-200)**2/(2*50**2))&lt;br /&gt;
C3 = np.exp(-(t-350)**2/(2*100**2))&lt;br /&gt;
ERP = 0.5*C1-C2+C3&lt;br /&gt;
&lt;br /&gt;
C2p = np.concatenate((C2[0:200], np.ones(30), C2[200:700-30] ))&lt;br /&gt;
C3p = ERP - 0.5*C1 + C2p&lt;br /&gt;
ERP_v2 = 0.5*C1-C2p+C3p&lt;br /&gt;
&lt;br /&gt;
subplot(3,1,1)&lt;br /&gt;
plot(t,ERP, t[::10],ERP_v2[::10],'g.')&lt;br /&gt;
ylabel('a)',rotation='horizontal')&lt;br /&gt;
ylim([-1, 1.5])&lt;br /&gt;
&lt;br /&gt;
subplot(3,1,2)&lt;br /&gt;
plot(t,0.5*C1,t,-C2,t,C3)&lt;br /&gt;
ylabel('b)',rotation='horizontal')&lt;br /&gt;
ylim([-1, 1.5])&lt;br /&gt;
&lt;br /&gt;
subplot(3,1,3)&lt;br /&gt;
plot(t,0.5*C1,t,-C2p,t,C3p)&lt;br /&gt;
ylabel('c)',rotation='horizontal')&lt;br /&gt;
ylim([-1, 1.5])&lt;br /&gt;
&lt;br /&gt;
show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Zmiana jednej komponenty może powodować zmiany w amplitudzie i latencji więcej niż jednego załamka.====&lt;br /&gt;
Poniższy rysunek przedstawia sytuację gdy zmiana amplitudy jednego komponentu może znacząco wpływać na amplitudę i latencję innych załamków.&lt;br /&gt;
&lt;br /&gt;
[[Plik:Sumowanie_komponentow2.png|center|thumb|768px| Panel a) przedstawia dwie hipotetyczne krzywe ERP, panel b) panel b i c komponenty z których powstały owe krzywe. Zmiana amplitudy komponentu oznaczonego kolorem powoduje zmianę amplitudy oznaczonych załamków ale także zmianę latencji wcześniejszego załamka. ]]&lt;br /&gt;
Poniżej kod odtwarzający powyższy przykład:&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
from __future__ import division&lt;br /&gt;
import numpy as np&lt;br /&gt;
from matplotlib.pyplot import plot, show, subplot, figure, title, xlabel, ylabel, ylim&lt;br /&gt;
&lt;br /&gt;
Fs = 1&lt;br /&gt;
t = np.arange(0,700)&lt;br /&gt;
&lt;br /&gt;
C1 = np.exp(-(t-100)**2/(2*30**2))&lt;br /&gt;
C2 = np.exp(-(t-200)**2/(2*50**2))&lt;br /&gt;
C3 = np.exp(-(t-350)**2/(2*100**2))&lt;br /&gt;
ERP1 = 0.5*C1-C2+C3&lt;br /&gt;
ERP2 = 0.5*C1-C2+1.5*C3&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
subplot(3,1,1)&lt;br /&gt;
plot(t,ERP1,'b', t,ERP2,'g')&lt;br /&gt;
plot(t[np.argmin(ERP1)],np.min(ERP1),'r.' )&lt;br /&gt;
plot(t[np.argmax(ERP1)],np.max(ERP1),'m.' )&lt;br /&gt;
plot(t[np.argmin(ERP2)],np.min(ERP2),'r.' )&lt;br /&gt;
plot(t[np.argmax(ERP2)],np.max(ERP2),'m.' )&lt;br /&gt;
&lt;br /&gt;
ylabel('a)',rotation='horizontal')&lt;br /&gt;
ylim([-1, 1.6])&lt;br /&gt;
&lt;br /&gt;
subplot(3,1,2)&lt;br /&gt;
plot(t,0.5*C1,'k',t,-C2,'k',t,C3,'b')&lt;br /&gt;
ylabel('b)',rotation='horizontal')&lt;br /&gt;
ylim([-1, 1.6])&lt;br /&gt;
&lt;br /&gt;
subplot(3,1,3)&lt;br /&gt;
plot(t,0.5*C1,'k',t,-C2,'k',t,1.5*C3,'g')&lt;br /&gt;
ylabel('c)',rotation='horizontal')&lt;br /&gt;
ylim([-1, 1.6])&lt;br /&gt;
&lt;br /&gt;
show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Instrukcje do ćwiczeń =&lt;br /&gt;
&lt;br /&gt;
==Zadanie 1: uśrednianie symulowanych sygnałów==&lt;br /&gt;
w tym ćwiczeniu chcemy pokazać efekty:&lt;br /&gt;
# uśredniania sygnałów związanych fazowo z bodźcem i nieskorelowanych z bodźcem / wpływ liczby realizacji,&lt;br /&gt;
# uśredniania sygnałów z fluktuacją latencji,&lt;br /&gt;
# wpływ filtrów o różnych funkcjach odpowiedzi impulsowej na morfologię uśrednionego potencjału.&lt;br /&gt;
&lt;br /&gt;
===Sygnały testowe===&lt;br /&gt;
Proszę zaimplementować funkcje generujące następujące przebiegi czasowe (oznaczenia: ''F&amp;lt;sub&amp;gt;s&amp;lt;/sub&amp;gt;'' &amp;amp;mdash; częstość próbkowania, ''T'' &amp;amp;mdash; czas trwania w sekundach, [[%C4%86wiczenia_1#Sygna.C5.82y_testowe|analogicznie do tego]]):&lt;br /&gt;
* sinusoida o zadanej częstości ''f'' i fazie &amp;lt;math&amp;gt;\phi&amp;lt;/math&amp;gt;: &amp;lt;tt&amp;gt;y = sin(f, phi, Fs, T)&amp;lt;/tt&amp;gt;,&lt;br /&gt;
* funkcja Gaussa o zadanym położeniu i szerokości &amp;lt;tt&amp;gt;y = g_1(t0, sigma, Fs, T) &amp;lt;/tt&amp;gt;&lt;br /&gt;
: &amp;lt;math&amp;gt;g_1(t) = \exp\left(-\frac{(t-t_0)^2}{2 \sigma^2}\right)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* pochodną funkcji Gaussa o zadanym położeniu i szerokości &amp;lt;tt&amp;gt;y = g_2(t0, sigma, Fs, T)&amp;lt;/tt&amp;gt;,&lt;br /&gt;
* połowę funkcji Gaussa o zadanym położeniu i szerokości &amp;lt;tt&amp;gt;y = g_3(t0, sigma, Fs, T)&amp;lt;/tt&amp;gt;,&lt;br /&gt;
: &amp;lt;math&amp;gt;g_{3}(t) = \left\{ &lt;br /&gt;
\begin{array}{lll}&lt;br /&gt;
0 &amp;amp; \mathrm{dla}&amp;amp; t&amp;lt;t_0 \\&lt;br /&gt;
\exp\left(-\frac{(t-t_0)^2}{2 \sigma^2}\right)&amp;amp; \mathrm{dla}&amp;amp; t \ge t_0  &lt;br /&gt;
\end{array}&lt;br /&gt;
\right. &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
W dalszych zadaniach tej sekcji przyjmiemy:&lt;br /&gt;
* ''T'' = 1 s,&lt;br /&gt;
* ''F&amp;lt;sub&amp;gt;s&amp;lt;/sub&amp;gt;'' = 128 Hz,&lt;br /&gt;
* ''t''&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; = 0,3 s,&lt;br /&gt;
* &amp;amp;sigma; = 0,02 s.&lt;br /&gt;
&lt;br /&gt;
===Uśrednianie w modelu addytywnym: sygnał + szum===&lt;br /&gt;
Dla funkcji &amp;lt;math&amp;gt;g_1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;g_2&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;g_3&amp;lt;/math&amp;gt;  wykonaj ''N'' symulacji sygnału opisanego daną funkcją z dodanym szumem gaussowskim (&amp;lt;tt&amp;gt;numpy.random.randn&amp;lt;/tt&amp;gt;). Zaobserwuj zmianę wariancji uśrednianego sygnału wraz z ''N''.&lt;br /&gt;
&lt;br /&gt;
===Uśrednianie w modelu addytywnym: sygnał + szum + niezależna czynność rytmiczna===&lt;br /&gt;
Powtórz poprzednie symulacje dokładając w każdej realizacji sinusoidę o losowo wybranej fazie. Symulacje wykonaj dla różnych częstości sinusoidy, takich których połówka okresu zbliżona jest do szerokości funkcji Gaussa, oraz znacząco od niej różnych.&lt;br /&gt;
&lt;br /&gt;
===Uśrednianie w modelu z resetem fazy===&lt;br /&gt;
Zbuduj sygnał składający się z dwóch fragmentów sinusoidy o częstości ''f'': &lt;br /&gt;
* pierwszy fragment ma losową fazę,&lt;br /&gt;
* drugi fragment ma fazę równą 0.&lt;br /&gt;
Wykonaj ''N'' realizacji takiego sygnału, przy czym każda realizacja ma częstość losowaną z rozkładu Gaussa o średniej 10 i pewnej wariancji (czyli &amp;lt;math&amp;gt;f \in \mathrm{N}(10,\sigma)&amp;lt;/math&amp;gt;). &lt;br /&gt;
Uśrednij otrzymane realizacje. Zaobserwuj zależność średniej od liczby uśrednianych realizacji i od wariancji częstości.&lt;br /&gt;
&lt;br /&gt;
===Uśrednianie potencjału z fluktuacją latencji===&lt;br /&gt;
Wygeneruj sygnały składające się z funkcji &amp;lt;math&amp;gt;g_1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;g_2&amp;lt;/math&amp;gt; albo &amp;lt;math&amp;gt;g_3&amp;lt;/math&amp;gt; z fluktuującą latencją, tzn. z wartością &amp;lt;math&amp;gt;t_0&amp;lt;/math&amp;gt; pochodzącą z jakiegoś rozkładu prawdopodobieństwa. U nas dla ustalenia uwagi niech będzie to rozkład Gaussa. Wykonaj zestaw symulacji obrazujący zależność od liczby realizacji i od wielkości fluktuacji, mierzonej przez wariancję rozkładu. Czy jest związek pomiędzy wariancją fluktuacji &amp;lt;math&amp;gt;t_0&amp;lt;/math&amp;gt; a szerokością załamków?&lt;br /&gt;
&lt;br /&gt;
===Wpływ filtrów===&lt;br /&gt;
# Zaprojektuj następujące filtry (przyjmij częstość próbkowania 128 Hz):&lt;br /&gt;
#* dolnoprzepustowy: Butterwortha z częstością odcięcia: 30, 40, 50 Hz, i rzędach od 1 do 5 (funkcja butter w module scipy.signal),&lt;br /&gt;
#* górnoprzepustowy: Butterwortha z częstością odcięcia: 0,1, 0,5, 2 i 5 Hz, i rzędach od 1 do 5,&lt;br /&gt;
#* notch: Czybyszewa II rodzaju z pasmem zaporowym ustawionym na 50 Hz, i rzędach od 1 do 3 (funkcja cheby2),&lt;br /&gt;
# Zbadaj funkcję odpowiedzi impulsowej i funkcję przenoszenia tych filtrów (w skali dB). Zaobserwuj jak długa jest odpowiedź impulsowa i jak daleko od częstości odcięcia zaburzone jest pasmo przenoszenia.&lt;br /&gt;
# Zastosuj powyższe filtry do funkcji &amp;lt;math&amp;gt;g_1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;g_2&amp;lt;/math&amp;gt; albo &amp;lt;math&amp;gt;g_3&amp;lt;/math&amp;gt;. Filtrowanie przeprowadź w jedną (lfilter) oraz w dwie strony (filtfilt). Zaobserwuj związek między zniekształceniem wprowadzanym przez filtr a funkcją odpowiedzi impulsowej filtru.&lt;br /&gt;
# W ćwiczeniu tym posłuż się symulowanymi sygnałami uzyskanymi z modelu addytywnego: &amp;amp;bdquo;sygnał+szum&amp;amp;rdquo;. Dla funkcji &amp;lt;math&amp;gt;g_1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;g_2&amp;lt;/math&amp;gt; albo &amp;lt;math&amp;gt;g_3&amp;lt;/math&amp;gt;  wykonaj ''N'' = 60 realizacji sygnału opisanego daną funkcją z dodanym szumem gaussowskim (&amp;lt;tt&amp;gt;numpy.random.randn&amp;lt;/tt&amp;gt;). Każdą z realizacji przefiltruj, a następnie uśrednij uzyskane sygnały.&lt;br /&gt;
&lt;br /&gt;
==Zadanie 2: rejestracje i analiza potencjałów wzrokowych==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;! -- ===Synchronizacja występowania bodźców z sygnałem EEG===&lt;br /&gt;
&lt;br /&gt;
Rejestracja potencjałów wywołanych jest przykładem pomiaru czynności elektrycznej mózgu w odpowiedzi na określony bodziec. W przypadku tego rodzaju pomiarów konieczna jest synchronizacja momentu wystąpienia bodźca z sygnałem EEG. Wzmacniacze do pomiaru czynności elektrycznej mózgu wyposażone są w specjalne wejścia, na które można podawać sygnał odpowiadający pojawianiu się bodźca. Jak pamiętamy z zeszłego semestru, wejście to (jak i podawany na nie sygnał) nazywamy trigerem (ang. ''trigger'' &amp;amp;mdash; spust, cyngiel, wyzwalacz). W najprostszym przypadku, bodziec moglibyśmy wyświetlać na monitorze komputerowym, a sygnał związany z jego wystąpieniem wysyłać przez któryś z portów komputera (LPT, COM) na wzmacniacz EEG. Niestety, obecnie dostępne i popularne systemy operacyjne, takie jak Windows czy Linux nie są systemami czasu rzeczywistego (http://pl.wikipedia.org/wiki/System_operacyjny_czasu_rzeczywistego). Od momentu wyświetlania bodźca na ekranie, do pojawiania się sygnału odpowiednim porcie komputerowym może upłynąć kilkadziesiąt milisekund i co gorsza czas ten zwykle jest losowy. W przypadku gdy wzmacniacz próbkuje sygnał z częstością 1000 Hz, moment wystąpienia bodźca możemy określić z dokładnością 1 ms, jednakże wspomniane opóźnienia w systemie operacyjnym uniemożliwiają to. Ponadto, jak dowiedzieliśmy się w rozdziale wstępnym [http://brain.fuw.edu.pl/edu-wiki/action/edit/EEG:Potencja%C5%82y_wywo%C5%82ane?section=T-1], pierwsze załamki związane z potencjałami wywołanymi pojawiają się już 10 ms po wystąpieniu bodźca. W związku z tym, losowe, rzędu kilkudziesięciu milisekund opóźnienia sygnału określającego moment pojawienia się bodźca względem jego rzeczywistego wystąpienia są niedopuszczalne.&lt;br /&gt;
Istnieją pewne techniki programowania, dzięki którym opisywane opóźnienia można zmniejszyć, jednakże są one bardzo trudne  do realizacji. Ponadto, standardowe porty komputera, takie jak LPT, czy COM zostały zaprojektowane przede wszystkim do sterowania urządzeniami zewnętrznymi, a nie ich zasilania. Przykładowo, jedna linia portu drukarkowego (LPT) może być obciążona prądem nie większym niż 5 mA, podczas gdy do zapalenie zwykłej diody LED potrzeba około 10 mA. Taki pobór prądu możliwy jest do uzyskania z portu USB, jednakże  jest on  wyjątkowo trudny do oprogramowania.  &lt;br /&gt;
W celu ominięcia powyższych niedogodności w Zakładzie Fizyki Biomedycznej UW w przeprowadzanych eksperymentach wykorzystywane są  mikrokontrolery [http://pl.wikipedia.org/wiki/Mikrokontroler], w szczególności ATmega16 i ATmega32.  Mikrokontrolery te wyposażone są w procesory o architekturze RISC [http://pl.wikipedia.org/wiki/RISC] i mocy obliczeniowej porównywalnej z szeroko stosowanym kiedyś w komputerach ZX Spectrum, Commodore, Amiga i Atari procesorem Z80. Oprócz jednostki centralnej mikrokontrolery zawierają   stałą pamięć FLASH przeznaczoną do przechowywania kodu programu, pamięć  RAM i pamięć EEPROM, liczniki 8- i 16-bitowe, komparatory, przetworniki analogowo-cyfrowe, porty wejścia/wyjścia, łącze RS232 (popularnie nazywane portem szeregowym) i układy przerwań.&lt;br /&gt;
&lt;br /&gt;
Mikrokontrolery wchodzące w skład zestawów pomiarowych na Pracowni EEG zawierają program, który umożliwia komunikację z nimi poprzez port szeregowy. Obecnie, komputery są coraz rzadziej wyposażane w porty szeregowe. Standard komunikacji RS-232, opracowany w 1962 roku  nadal jest jednak popularny i często wykorzystywany do komunikacji miedzy urządzeniami.  W celu połączenia komputera posiadającego tylko porty USB z mikrokontrolerem zastosowano przejściówkę USB/RS-232. &lt;br /&gt;
&lt;br /&gt;
Jak każde urządzenie w systemie Linuks, przejściówka USB/RS-232 widoczna jest jako plik, znajdujący się w katalogu &amp;lt;tt&amp;gt;/dev&amp;lt;/tt&amp;gt;. Nazwy plików obsługujących urządzenia szeregowe to &amp;lt;tt&amp;gt;ttyXY&amp;lt;/tt&amp;gt;, gdzie &amp;lt;tt&amp;gt;XY&amp;lt;/tt&amp;gt; to kolejny numer przydzielony do urządzenia szeregowego.&lt;br /&gt;
Do komunikacji komputera z mikroknotrolerem  w Zakładzie Fizyki Biomedycznej UW została napisana prosta biblioteka.  Jej użycie jest następujące:&lt;br /&gt;
* Po podłączeniu przejściówki USB/RS232 do komputera mikrokontrolera sprawdź jaki plik w katalogu &amp;lt;tt&amp;gt;/dev&amp;lt;/tt&amp;gt; został utworzony i przydzielony do urządzenia. &lt;br /&gt;
* Zaimportuj bibliotekę do komunikacji z mikrokontrolerem: &lt;br /&gt;
: &amp;lt;tt&amp;gt;import SerialPort as SP&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Otwórz plik powiązany z urządzeniem zewnętrznym:&lt;br /&gt;
: &amp;lt;tt&amp;gt;sp = SP.SerialPort(nazwa_pliku) &amp;lt;/tt&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
: &amp;lt;tt&amp;gt;sp.open()&amp;lt;/tt&amp;gt;&lt;br /&gt;
W naszym przypadku prawidłowa nazwa pliku to &amp;lt;tt&amp;gt;/dev/ttyUSB0&amp;lt;/tt&amp;gt;.&lt;br /&gt;
* Po włączeniu zasilania mikrokontrolera, diody podłączone do niego i wykorzystywane w eksperymencie z potencjałami wywołanymi będą zapalone. Następujące polecenie zgasi obydwie diody:&lt;br /&gt;
: &amp;lt;tt&amp;gt;sp.blinkP300([0, 0])&amp;lt;/tt&amp;gt;&lt;br /&gt;
* Wydanie poniższego polecenia spowoduje, iż mikrokontroler zapali podłączoną do niego diodę numer 1 na czas 100 ms, zaś diodę numer 2 na 200 ms. Jednocześnie, w momencie włączenia jak i wyłączenia diody, sygnał z mikrokontrolera zostanie wysłany na 5-stykowe wejście AUX mikrokontrolera:&lt;br /&gt;
: &amp;lt;tt&amp;gt;sp.blinkP300([100, 200])&amp;lt;/tt&amp;gt;&lt;br /&gt;
* Jeśli chcemy zapalić tylko diodę numer dwa, np. na czas 500 ms w programie podajemy następującą instrukcję:&lt;br /&gt;
: &amp;lt;tt&amp;gt;sp.blinkP300([0, 500])&amp;lt;/tt&amp;gt;&lt;br /&gt;
* Jeśli chcemy zakończyć komunikację z mikrokontrolerem piszemy:&lt;br /&gt;
: &amp;lt;tt&amp;gt;sp.close()&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Kod biblioteki do komunikacji z mikrokontrolerem:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;!--  Kod w Pythonie 2&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# -*- coding: cp1250 -*-&lt;br /&gt;
import serial&lt;br /&gt;
import logging&lt;br /&gt;
import sys&lt;br /&gt;
import os&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def to_hex_word(a):&lt;br /&gt;
    '''encodes a decimal number hexadecimally on two bytes'''&lt;br /&gt;
    return chr(a%256) + chr(a/256)&lt;br /&gt;
&lt;br /&gt;
class SerialPort(object):&lt;br /&gt;
    def __init__(self, port_name):&lt;br /&gt;
        import serial&lt;br /&gt;
        try:&lt;br /&gt;
            self.port = serial.Serial(&lt;br /&gt;
                port=port_name,&lt;br /&gt;
                baudrate=9600,&lt;br /&gt;
                bytesize=serial.EIGHTBITS,&lt;br /&gt;
                parity=serial.PARITY_NONE,&lt;br /&gt;
                stopbits=serial.STOPBITS_ONE,&lt;br /&gt;
                xonxoff=False&lt;br /&gt;
                )&lt;br /&gt;
        except serial.SerialException as e:&lt;br /&gt;
            print(&amp;quot;Nieprawidłowa nazwa portu lub port zajęty.&amp;quot;)&lt;br /&gt;
            raise e&lt;br /&gt;
        self.close()&lt;br /&gt;
        &lt;br /&gt;
    def open(self):&lt;br /&gt;
        self.port.open()&lt;br /&gt;
&lt;br /&gt;
    def close(self):&lt;br /&gt;
        self.port.close()&lt;br /&gt;
&lt;br /&gt;
    def send(self, value):&lt;br /&gt;
        self.port.write(value)&lt;br /&gt;
                           &lt;br /&gt;
    def blinkSSVEP(self,d, p1, p2):&lt;br /&gt;
        '''&lt;br /&gt;
        d = list of frequencies;&lt;br /&gt;
        p1:p2 = ratio LED_on_time/LED_off_time&lt;br /&gt;
        if you want i-th LED to be OFF all the time send  d[i] = 0&lt;br /&gt;
        if you want i-th LED to be ON all the time send  d[i] = -1&lt;br /&gt;
        in these two cases p1 and p2 do not matter&lt;br /&gt;
        '''&lt;br /&gt;
        clock  = 62500&lt;br /&gt;
        factor = float(p1) / float(p1 + p2)&lt;br /&gt;
    &lt;br /&gt;
        str = chr(3) # 'SSVEP_RUN'&lt;br /&gt;
&lt;br /&gt;
        for i in range(len(d)):&lt;br /&gt;
            # i-th LED OFF&lt;br /&gt;
            if d[i] == 0:                       &lt;br /&gt;
                str += to_hex_word(0) + to_hex_word(255) &lt;br /&gt;
            # i-th LED ON&lt;br /&gt;
            elif d[i] == -1:&lt;br /&gt;
                str += to_hex_word(255) + to_hex_word(0)&lt;br /&gt;
                #str = 'S'&lt;br /&gt;
                # i-th LED blinks d[i] times per second&lt;br /&gt;
                # p1:p2 = on_time:off_time in one blink&lt;br /&gt;
            else:&lt;br /&gt;
                period = clock/d[i]&lt;br /&gt;
                bright = int((clock/d[i]) * factor)&lt;br /&gt;
                dark = period - bright&lt;br /&gt;
                str += to_hex_word(bright) + to_hex_word(dark)&lt;br /&gt;
&lt;br /&gt;
        self.send(str)&lt;br /&gt;
&lt;br /&gt;
    def blinkP300(self,d):&lt;br /&gt;
        clock  = 62500&lt;br /&gt;
        str = chr(4) # 'P300_RUN'&lt;br /&gt;
&lt;br /&gt;
        for i in range(len(d)):&lt;br /&gt;
            period = int(clock*d[i]/1000.0)&lt;br /&gt;
            str += to_hex_word(period)&lt;br /&gt;
            print(period)&lt;br /&gt;
&lt;br /&gt;
        self.send(str)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
--&amp;gt; &amp;lt;!-- Kod w Pythonie 3 --&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# -*- coding: cp1250 -*-&lt;br /&gt;
import serial&lt;br /&gt;
import logging&lt;br /&gt;
import sys&lt;br /&gt;
import os&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
def to_hex_word(a):&lt;br /&gt;
    '''encodes a decimal number hexadecimally on two bytes'''&lt;br /&gt;
    return a.to_bytes(2,byteorder=sys.byteorder)&lt;br /&gt;
 &lt;br /&gt;
class SerialPort(object):&lt;br /&gt;
    def __init__(self, port_name):&lt;br /&gt;
        import serial&lt;br /&gt;
        try:&lt;br /&gt;
            self.port = serial.Serial(&lt;br /&gt;
                port=port_name,&lt;br /&gt;
                baudrate=9600,&lt;br /&gt;
                bytesize=serial.EIGHTBITS,&lt;br /&gt;
                parity=serial.PARITY_NONE,&lt;br /&gt;
                stopbits=serial.STOPBITS_ONE,&lt;br /&gt;
                xonxoff=False&lt;br /&gt;
                )&lt;br /&gt;
        except serial.SerialException as e:&lt;br /&gt;
            print(&amp;quot;Nieprawidłowa nazwa portu lub port zajęty.&amp;quot;)&lt;br /&gt;
            raise e&lt;br /&gt;
        self.close()&lt;br /&gt;
 &lt;br /&gt;
    def open(self):&lt;br /&gt;
        self.port.open()&lt;br /&gt;
 &lt;br /&gt;
    def close(self):&lt;br /&gt;
        self.port.close()&lt;br /&gt;
 &lt;br /&gt;
    def send(self, value):&lt;br /&gt;
        self.port.write(value)&lt;br /&gt;
 &lt;br /&gt;
    def blinkSSVEP(self,d, p1, p2):&lt;br /&gt;
        '''&lt;br /&gt;
        d = list of frequencies;&lt;br /&gt;
        p1:p2 = ratio LED_on_time/LED_off_time&lt;br /&gt;
        if you want i-th LED to be OFF all the time send  d[i] = 0&lt;br /&gt;
        if you want i-th LED to be ON all the time send  d[i] = -1&lt;br /&gt;
        in these two cases p1 and p2 do not matter&lt;br /&gt;
        '''&lt;br /&gt;
        clock  = 62500&lt;br /&gt;
        factor = float(p1) / float(p1 + p2)&lt;br /&gt;
 &lt;br /&gt;
        str = (3).to_bytes(1,byteorder=sys.byteorder) # 'SSVEP_RUN'&lt;br /&gt;
 &lt;br /&gt;
        for i in range(len(d)):&lt;br /&gt;
            # i-th LED OFF&lt;br /&gt;
            if d[i] == 0:                       &lt;br /&gt;
                str += to_hex_word(0) + to_hex_word(255) &lt;br /&gt;
            # i-th LED ON&lt;br /&gt;
            elif d[i] == -1:&lt;br /&gt;
                str += to_hex_word(255) + to_hex_word(0)&lt;br /&gt;
                #str = 'S'&lt;br /&gt;
                # i-th LED blinks d[i] times per second&lt;br /&gt;
                # p1:p2 = on_time:off_time in one blink&lt;br /&gt;
            else:&lt;br /&gt;
                period = clock/d[i]&lt;br /&gt;
                bright = int((clock/d[i]) * factor)&lt;br /&gt;
                dark = int(period - bright)&lt;br /&gt;
                str += to_hex_word(bright) + to_hex_word(dark)&lt;br /&gt;
 &lt;br /&gt;
        self.send(str)&lt;br /&gt;
 &lt;br /&gt;
    def blinkP300(self,d):&lt;br /&gt;
        clock  = 62500&lt;br /&gt;
        str = (4).to_bytes(1,byteorder=sys.byteorder) # 'P300_RUN'&lt;br /&gt;
 &lt;br /&gt;
        for i in range(len(d)):&lt;br /&gt;
            period = int(clock*d[i]/1000.0)&lt;br /&gt;
            str += to_hex_word(period)&lt;br /&gt;
 &lt;br /&gt;
        self.send(str)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
--&amp;gt; &lt;br /&gt;
&lt;br /&gt;
===Zestaw eksperymentalny===&lt;br /&gt;
Zestaw składa się ze:&lt;br /&gt;
* wzmacniacza,&lt;br /&gt;
* stymulatora   &lt;br /&gt;
&amp;lt;!--* izolowanego galwanicznie układu generującego impulsy odpowiadające gaszeniu i zapalaniu diody,  o wartościach dopasowanych do akceptowalnych przez wejścia AUX wzmacniacza,--&amp;gt;&lt;br /&gt;
* komputera: w tym eksperymencie komputer będzie służył do zaprogramowania stymulatora i do rejestracji sygnałów.&lt;br /&gt;
&lt;br /&gt;
===Wersja 1: obserwacja błyskającej diody  ===&lt;br /&gt;
&amp;lt;!--Proszę zapoznać się ze standardami rejestracji wzrokowych potencjałów wywołanych [http://www.gcu.ac.uk/media/gcalwebv2/theuniversity/academicschools/sls/psytimetables/SLS%20-%20VEP_Standard_2010.pdf] --&amp;gt;&lt;br /&gt;
Proszę zapoznać się z typowym wyglądem załamków w przypadku potencjałów wzrokowych, jaki jest przedstawiony na [https://link.springer.com/article/10.1007/s10633-009-9195-4/figures/2 rysunku] (cały artykuł jest dostępny [http://link.springer.com/article/10.1007%2Fs10633-009-9195-4 tu]).&lt;br /&gt;
&amp;lt;!--[[Plik:Fig 4 VEP.jpg|thumb|320px|right|&amp;lt;figure id=&amp;quot;fig:zalamki_VEP&amp;quot;&amp;gt;&amp;lt;/figure&amp;gt;&lt;br /&gt;
&amp;lt;xr id=&amp;quot;fig:zalamki_VEP&amp;quot;&amp;gt;Rys. %i.&amp;lt;/xr&amp;gt; Schemat załamków rozpoznawanych we wzrokowych potencjach wywołanych (z pracy: J. V. Odom i in. &amp;amp;bdquo;ISCEV standard for clinical visual evoked potentials&lt;br /&gt;
(2009 update)&amp;amp;rdquo;, Doc Ophthalmol (2010), 120:111–119).]]&lt;br /&gt;
--&amp;gt; &lt;br /&gt;
&lt;br /&gt;
==== Rejestracja ====&lt;br /&gt;
* Paradygmat: z odległości około 40 cm badany obserwuje błyski diody. Błyski powtarzają się co 1&amp;amp;plusmn;0,1 sekundy. Każdy błysk trwa 20 ms. Rejestrujemy 2 serie po 100 błysków. Częstość próbkowania 512 Hz.&lt;br /&gt;
** W pierwszej serii błyskamy tylko jedną diodą.&lt;br /&gt;
** W drugiej serii błyskamy dwiema diodami. &lt;br /&gt;
Pomiędzy seriami badany odpoczywa około 2 min. Diody powinny być ustawione na jednakową jasność błysków.&lt;br /&gt;
&lt;br /&gt;
* Pomiar&lt;br /&gt;
**Zakładamy czepek i elektrody w systemie 10-20, dbamy o to by opory pomiędzy elektrodami były poniżej 5 k&amp;amp;Omega; i różnice pomiędzy oporami różnych elektrod nie przekraczały 20%. [[Plik:Glowka10-20 ERPy.svg|thumb|600px|right]]&lt;br /&gt;
** Elektrodę GND mocujemy w otworze czepka odpowiadającym pozycji AFz (na linii centralnej 10% w stronę nosa od elektrody Fz) &lt;br /&gt;
** Montujemy także elektrodę FCz (na linii centralnej pomiędzy Fz a Cz), będziemy jej używać w montażu i w czasie analizy jako referencji.&lt;br /&gt;
&lt;br /&gt;
==== Analiza ====&lt;br /&gt;
# Filtrujemy sygnał w paśmie 1-20 Hz.&lt;br /&gt;
# Z ciągłego zapisu wycinamy fragmenty od &amp;amp;minus;300 ms do +400 ms (zero oznacza moment wystąpienia bodźca). W czasie wycinania badamy wycinane fragmenty pod względem zakresu amplitudy (wszystkie kanały powinny mieć amplitudę w granicach &amp;amp;plusmn;75 &amp;amp;mu;V) i zawartości artefaktów od mrugania (w tym celu trzeba oglądając sygnał w SVAROG-u ustalić próg na amplitudę sygnału w kanałach Fp1 i Fp2).&lt;br /&gt;
# Uśredniamy wycięte sygnały.&lt;br /&gt;
# Rysujemy średni potencjał we wszystkich kanałach.&lt;br /&gt;
# Identyfikujemy załamki N2 i P2. Mierzymy amplitudę P2 jako różnicę między ekstremalną wartością załamka P2 a ekstremalną wartością załamka N2. &lt;br /&gt;
&lt;br /&gt;
[[Plik:ZalamkiN2_P2.png‎|thumb|600px|right|  Uśredniony potencjał wywołany dla serii 1 i 2 na kanale T5 z zaznaczonymi załamkami N2 i P2. Na osi poziomej czas [s] natomiast na pionowej amplituda [μV].]]&lt;br /&gt;
Pomiar wykonujemy dla obu serii błysków.&lt;br /&gt;
&lt;br /&gt;
Pytanie: Czy intensywność bodźca wpływa na amplitudę potencjału P2?&lt;br /&gt;
Jak stwierdzić czy amplitudy załamków P2 istotnie różnią się pomiędzy seriami?&lt;br /&gt;
&lt;br /&gt;
Musimy przeprowadzić test statystyczny. Możemy skonstruować go np. tak:&lt;br /&gt;
Mamy dwa warunki I i II. Jako statystykę przyjmiemy różnicę pomiędzy amplitudą załamka zmierzoną w serii z dwoma diodami (P2&amp;lt;sub&amp;gt;II&amp;lt;/sub&amp;gt;) a amplitudą zmierzoną w serii z jedną diodą (P2&amp;lt;sub&amp;gt;I&amp;lt;/sub&amp;gt;):&lt;br /&gt;
: ''S'' = P2&amp;lt;sub&amp;gt;II&amp;lt;/sub&amp;gt; &amp;amp;minus; P2&amp;lt;sub&amp;gt;I&amp;lt;/sub&amp;gt;&lt;br /&gt;
Postawmy hipotezę zerową, że nie ma różnicy w amplitudzie pomiędzy warunkiem II a I oraz hipotezę alternatywną, że różnica taka występuje.&lt;br /&gt;
: H&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;: ''S'' = 0&lt;br /&gt;
: H&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;: ''S'' &amp;amp;ne; 0&lt;br /&gt;
Zgodnie z H&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; dla wartości ''S'' nie ma różnicy czy realizacja została zarejestrowana w warunkach I czy II, zatem można losowo poprzypisywać numery warunków do realizacji i w ten sposób uzyskać rozkład statystyki ''S'' pod warunkiem prawdziwości H&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;, czyli obliczyć średnie potencjały dla &amp;amp;bdquo;pomieszanych&amp;amp;rdquo; tagów, wyliczyć średnie potencjały dla sztucznie wygenerowaych grup, i wyliczyć różnicę amplitud dla tych średnich, czyli wartość statystyki dla hipotezy H&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Zaimplementuj test permutacyjny zgodny z powyższą koncepcją.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- ===Wersja 2: obserwacja habituacji / uśrednianie w blokach ===&lt;br /&gt;
==== Rejestracja ====&lt;br /&gt;
# Paradygmat: &lt;br /&gt;
#* z odległości około 40 cm badany obserwuje błyski diody. &lt;br /&gt;
#* Błyski powtarzają się co 0,5 sekundy. &lt;br /&gt;
#* Rejestrujemy 60 serii po 15 błysków.  &lt;br /&gt;
#* Pomiędzy seriami badany odpoczywa około 10 sekund.&lt;br /&gt;
# Zakładamy czepek i elektrody w systemie 10-20, dbamy o to by opory pomiędzy elektrodami były poniżej 5 k&amp;amp;Omega; i różnice pomiędzy oporami różnych elektrod nie przekraczały 20%.&lt;br /&gt;
#* Elektrodę GND mocujemy w otworze czepka odpowiadającym pozycji AFz (na linii centralnej 10% w stronę nosa od elektrody Fz) &lt;br /&gt;
#* Montujemy także elektrodę FCz (na linii centralnej pomiędzy Fz a Cz), będziemy jej używać w montażu i w czasie analizy jako referencji.&lt;br /&gt;
#* Częstość próbkowania 512 Hz.&lt;br /&gt;
&lt;br /&gt;
==== Analiza ====&lt;br /&gt;
# Filtrujemy sygnał w paśmie 0,1-20 Hz.&lt;br /&gt;
# Z ciągłego zapisu wycinamy fragmenty od &amp;amp;minus;300 ms do +600 ms (zero oznacza moment wystąpienia bodźca). W czasie wycinania badamy wycinane fragmenty pod względem zakresu amplitudy (wszystkie kanały powinny mieć amplitudę w granicach &amp;amp;plusmn;75 &amp;amp;mu;V) i zawartości artefaktów od mrugania (w tym celu trzeba oglądając sygnał w SVAROG-u ustalić próg na amplitudę sygnału w kanałach Fp1 i Fp2).&lt;br /&gt;
# Uśredniamy wycięte sygnały o tym samym numerze wewnątrz serii.&lt;br /&gt;
# Rysujemy serie 15 uśrednionych potencjałów dla tego kanału, który wykazywał najsilniejszy potencjał w pierwszej wersji eksperymentu. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Zadanie 3: rejestracja i analiza potencjału P3 ==&lt;br /&gt;
==== Rejestracja ====&lt;br /&gt;
# Paradygmat: &lt;br /&gt;
#* z odległości około 40 cm badany obserwuje błyski diody. &lt;br /&gt;
#* Błyski diody nr 1 powtarzają się co 1&amp;amp;plusmn;0,1 sekundy. &lt;br /&gt;
#* W losowych realizacjach zapalana jest także dioda nr 2. &lt;br /&gt;
#* Proporcja pomiędzy liczbą błysków pojedynczych i podwójnych powinna wynosić 10:2, przy czym błyski podwójne muszą być odseparowane co najmniej jednym błyskiem pojedynczym. &lt;br /&gt;
#* Czas zapalenia diod, tak jak w poprzednich eksperymentach, wynosi 20 ms. &lt;br /&gt;
#* Zadaniem badanego jest liczenie liczby błysków podwójnych.&lt;br /&gt;
#* Wykonujemy tyle realizacji aby zarejestrować 50 powtórzeń podwójnych błysków. &lt;br /&gt;
# Zakładamy czepek i elektrody w systemie 10-20, dbamy o to by opory pomiędzy elektrodami były poniżej 5 k&amp;amp;Omega; i różnice pomiędzy oporami różnych elektrod nie przekraczały 20%.&lt;br /&gt;
#* Elektrodę GND mocujemy w otworze czepka odpowiadającym pozycji AFz (na linii centralnej 10% w stronę nosa od elektrody Fz) &lt;br /&gt;
#* Montujemy także elektrody M1 i M2, będziemy ich używać w montażu i w czasie analizy jako referencji typu połączone uszy.&lt;br /&gt;
#* Częstość próbkowania 512 Hz.&lt;br /&gt;
&lt;br /&gt;
==== Analiza ====&lt;br /&gt;
# Filtrujemy sygnał w paśmie 0,1-20 Hz.&lt;br /&gt;
# Z ciągłego zapisu wycinamy fragmenty od &amp;amp;minus;300 ms do +600 ms (zero oznacza moment wystąpienia bodźca). W czasie wycinania badamy wycinane fragmenty pod względem zakresu amplitudy (wszystkie kanały powinny mieć amplitudę w granicach &amp;amp;plusmn;75 &amp;amp;mu;V) i zawartości artefaktów od mrugania (w tym celu trzeba oglądając sygnał w SVAROG-u ustalić próg na amplitudę sygnału w kanałach Fp1 i Fp2).&lt;br /&gt;
# Uśredniamy osobno realizacje błysków pojedynczych i błysków podwójnych.&lt;br /&gt;
# Nakładamy na siebie na rysunkach oba typy średnich.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Ćwiczenie dodatkowe: P300 BCI==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wykorzystujemy elektrody z systemu 10-10 umieszczone nad korą wzrokową: P07, O1, O2, PO8, PO3, PO4, Pz, Cz.&lt;br /&gt;
&lt;br /&gt;
Uruchamiamy &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
obci_gui --presets eeg_workshop&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
i z guzika &amp;amp;bdquo;select amplifier&amp;amp;rdquo; wybieramy właściwy wzmacniacz.&lt;br /&gt;
&lt;br /&gt;
Do kontroli jakości sygnału możemy uruchomić Svaroga.&lt;br /&gt;
&lt;br /&gt;
Dane z kalibracji zapisują się w pliku test1 w katalogu domowym użytkownika, z labiryntu w pliku test2.&lt;br /&gt;
&lt;br /&gt;
Po zakończeniu kalibracji pojawia się napis &amp;amp;bdquo;Trwają obliczenia&amp;amp;rdquo; lub podobny. Odczekujemy kilka minut, aż skończy się peer &amp;amp;bdquo;Calibration&amp;amp;rdquo; (widoczny w obci_gui) i zamykamy okienko klawiszami Alt-F4 lub zatrzymując scenariusz guzikiem &amp;amp;bdquo;Stop&amp;amp;rdquo;. W katalogu domowym pojawi się plik z wynikami kalibracji, co pozwala na uruchomienie scenariusza &amp;amp;bdquo;labirynt&amp;amp;rdquo;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Po zebraniu danych, przed wczytaniem ich do Svaroga należy w tym samym katalogu uruchomić skrypt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
#!/usr/bin/env python&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
&lt;br /&gt;
from obci.analysis.obci_signal_processing.tags import tags_file_writer&lt;br /&gt;
from obci.analysis.obci_signal_processing.read_manager import ReadManager&lt;br /&gt;
&lt;br /&gt;
def main(): &lt;br /&gt;
	file_name = 'test1'&lt;br /&gt;
	&lt;br /&gt;
	mgr = ReadManager(&lt;br /&gt;
		file_name + '.obci.xml',&lt;br /&gt;
		file_name + '.obci.raw',&lt;br /&gt;
		file_name + '.obci.tag')&lt;br /&gt;
	&lt;br /&gt;
	tags = mgr.get_tags()&lt;br /&gt;
	for i in xrange(0, len(tags)):&lt;br /&gt;
		if tags[i]['desc']['index'] == tags[i]['desc']['target']:&lt;br /&gt;
			tags[i]['name'] = 'blink_target'&lt;br /&gt;
		else:&lt;br /&gt;
			tags[i]['name'] = 'blink'&lt;br /&gt;
			&lt;br /&gt;
	tags_writer = tags_file_writer.TagsFileWriter(file_name + '.obci.tag')&lt;br /&gt;
	for tag in tags:&lt;br /&gt;
		tags_writer.tag_received(tag)		&lt;br /&gt;
	tags_writer.finish_saving(0)	&lt;br /&gt;
 &lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Aduszyk</name></author>
		
	</entry>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=Pracownia_EEG/Potencja%C5%82y_wywo%C5%82ane&amp;diff=8968</id>
		<title>Pracownia EEG/Potencjały wywołane</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=Pracownia_EEG/Potencja%C5%82y_wywo%C5%82ane&amp;diff=8968"/>
		<updated>2022-11-08T10:14:05Z</updated>

		<summary type="html">&lt;p&gt;Aduszyk: /* Zadanie 2: rejestracje i analiza potencjałów wzrokowych */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Pracownia EEG|Pracownia EEG]] / Potencjały wywołane&lt;br /&gt;
&lt;br /&gt;
=Wstęp=&lt;br /&gt;
==Potencjały wywołane==&lt;br /&gt;
=== Wstęp ===&lt;br /&gt;
Potencjały wywołane EEG (ang. ''evoked potentials'', EP) są śladami odpowiedzi mózgu na bodźce. W przypadku MEG poprawnie mówi się o polach wywołanych (ang. ''evoked fields'', EF).&lt;br /&gt;
Zwykle reakcja ta jest mała (wyjątek stanowią [[Elektroencefalografia/Metody_analizy_sygnałów_EEG_-_analiza_w_dziedzinie_czasu |kompleksy K]]) i w zapisie pojedynczej realizacji reakcji na bodziec najczęściej niewidoczna wśród czynności pochodzącej od wielu innych procesów zachodzących w tym samym czasie w mózgu. &lt;br /&gt;
Ich wyodrębnienie z tak zwanego tła EEG/MEG, czyli manifestacji elektrycznej innych, trwających w tym samym czasie w mózgu procesów (aktywny prąd niezależny), wymaga w dniu dzisiejszym zapisu odpowiedzi na szereg powtórzeń tego samego bodźca (&amp;lt;xr id=&amp;quot;fig:EP&amp;quot;&amp;gt;rys. %i&amp;lt;/xr&amp;gt;). Pierwsze potencjały wywołane pokazał pod koniec lat 40-tych Dawson (Dawson 1947) wykonując superpozycję pojedynczych realizacji na kliszy fotograficznej.&lt;br /&gt;
Z czasem skomplikowane urządzenia analogowe zastąpione zostały przez cyfrowe uśrednianie kolejnych fragmentów EEG, zsynchronizowanych według momentu wystąpienia bodźca, łatwo realizowane za pomocą komputera.&lt;br /&gt;
&lt;br /&gt;
[[Grafika:EP.png|thumb|640px|center|&amp;lt;figure id=&amp;quot;fig:EP&amp;quot;&amp;gt;&amp;lt;/figure&amp;gt;&lt;br /&gt;
Uśrednianie potencjałów wywołanych. a) ciągły zapis EEG z wyróżnionymi momentami wystąpienia bodźca (w tym przypadku słuchowego) b) kilkadziesiąt kolejnych odcinków, wyciętych jako sekunda EEG od momentu wystąpienia kolejnych bodźców, ustawione jeden pod drugim c) uśredniony potencjał wywołany &amp;amp;mdash; widać m. in. załamek P300 ok. 300 milisekund po bodźcu]]&lt;br /&gt;
&lt;br /&gt;
Techniki te opierają się na założeniu, że zawarta w EEG odpowiedź mózgu na każdy z kolejnych bodźców jest niezmienna, a EEG odzwierciedlające pozostałe procesy traktowane jest jak nieskorelowany z nią proces stochastyczny. Zależnie od rodzaju potencjałów wywołanych, założenia te są mniej lub bardziej nieuzasadnione; podważa je choćby powszechnie znany efekt habituacji, polegający na osłabieniu późnych potencjałów wywołanych kolejnymi powtórzeniami bodźca.&lt;br /&gt;
&lt;br /&gt;
Istota potencjałów wywołanych jest przedmiotem otwartej dyskusji i dziesiątków prac, dotykających od lat podstawowych w tej dziedzinie pytań: czym jest potencjał wywołany, który widzimy w uśrednionym przebiegu? Czy naprawdę wynika z deterministycznie powtarzanej, jednakowej odpowiedzi pojawiającej się po każdym powtórzeniu bodźca niezależnie od &amp;amp;bdquo;tła&amp;amp;rdquo;, czy może wynika z reorganizacji faz tego właśnie &amp;amp;bdquo;tła&amp;amp;rdquo; EEG, czy może kombinacji tych dwóch efektów? Jest to wspaniałe pole dla zastosowań zaawansowanych metod modelowania i analizy sygnałów. W ostatnich latach powstają dziesiątki prac na ten temat, a od czasu do czasu również krytyczne artykuły wykazujące, że dotychczasowe odkrycia są raczej artefaktami stosowanych metod a nie wynikają z własności analizowanych danych (Yeung et al., 2004). Jak widać jest tu wciąż bardzo wiele do zrobienia, gdyż zrozumienie tego mechanizmu stoi na drodze do &amp;amp;bdquo;świętego Graala&amp;amp;rdquo;, którym w tej dziedzinie jest wyodrębnienie pojedynczych potencjałów wywołanych.&lt;br /&gt;
&lt;br /&gt;
Niezależnie od tego, w neurofizjologii klinicznej nazwą potencjał wywołany określa się krzywą widoczną po uśrednieniu odpowiedzi na kilkanaście do kilku tysięcy bodźców (Szelenberger 2000). Gromadzona od dziesięcioleci wiedza o behawioralnych i klinicznych korelatach potencjałów wywołanych opiera się na rozpoznawaniu w przebiegach uśrednionych tak zwanych załamków, czyli przejściowych wzrostów lub spadków potencjału (na przykład na &amp;lt;xr id=&amp;quot;fig:EP&amp;quot;&amp;gt;rys. %i&amp;lt;/xr&amp;gt; widać załamek P300). Nazwy załamków składają się zwykle z litery &amp;amp;bdquo;P&amp;amp;rdquo; (od ang. ''positive''), jeśli wychylenie jest dodatnie, lub &amp;amp;bdquo;N&amp;amp;rdquo; (od ang. ''negative''), jeśli wychylenie jest ujemne, oraz liczby. Uwaga: &lt;br /&gt;
* Nie ma niestety jednej ustalonej konwencji prezentacji potencjałów koniecznie trzeba więc zwracać uwagę na orientację wykresu, a wykonując wykres samemu - zamieszczać informację o orientacji kierunku dodatniego,gdyż kierunek dodatni może być wykresie skierowany do góry lub do dołu. &lt;br /&gt;
* Liczba następująca po N lub P określa przybliżoną liczbę milisekund od wystąpienia bodźca, czyli tak zwaną latencję. Nie można jednak ścisłego związku między tą liczbą a liczbą milisekund np. potencjał P300 w zależności od szczegółów paradygmatu doświadczalnego może wystąpić znacznie później. np. w eksperymentach językowych zdarza się że P300 występuje później niż N400 :-).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;xr id=&amp;quot;fig:zalamki&amp;quot;&amp;gt;Rys. %i&amp;lt;/xr&amp;gt; przedstawia schematycznie najważniejsze załamki rozpoznawane w potencjałach słuchowych, czyli wywoływanych bodźcem dźwiękowym. Dla potencjałów wzrokowych i somatosensorycznych istnieją podobne klasyfikacje.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Grafika:Zalamki.png|thumb|320px|right|&amp;lt;figure id=&amp;quot;fig:zalamki&amp;quot;&amp;gt;&amp;lt;/figure&amp;gt;&lt;br /&gt;
Orientacyjny schemat załamków rozpoznawanych w słuchowych potencjach wywołanych, na podstawie (Szelenberger 2000). Skala czasu logarytmiczna. Najszybsze (do 12 ms) składowe egzogenne to potencjały pniowe (BAEP), oznaczane jako fale I-VII. Litery &amp;amp;bdquo;P&amp;amp;rdquo; i &amp;amp;bdquo;N&amp;amp;rdquo; oznaczają dodatnie i ujemne wychylenia związane z dalszymi załamkami]]&lt;br /&gt;
&lt;br /&gt;
Najszybsze (czyli o najmniejszej latencji) składowe to potencjały egzogenne, odzwierciedlające wstępne fazy przekazu informacji. W potencjałach słuchowych są to potencjały pnia (ang. ''brainstem auditory evoked potentials'', BAEP), składające się z siedmiu fal występujących pomiędzy 1 a 12 ms od bodźca. Są one generowane np. w nerwie słuchowym czy pniu mózgu, i wykorzystywane w klinicznej diagnostyce integralności dróg słuchowych. Podobnie jak inne wczesne potencjały o latencjach poniżej 100 ms, są praktycznie niezależne od stanu uwagi.&lt;br /&gt;
&lt;br /&gt;
Po potencjałach o średniej latencji (między 12 a 50 ms) zaczynają się późne potencjały słuchowe (od 100 ms od podania bodźca), odzwierciedlające bardziej złożone reakcje na bodziec. Potencjały ok. 100 ms obserwowane w okolicach sensorycznych odzwierciedlają odpowiedź tejże kory na bodziec. Ich amplituda zależy od parametrów fizycznych bodźca oraz od uwagi, np. amplituda załamka N100 wzrasta w stanie skupienia uwagi czy pobudzenia emocjonalnego. Pierwszy i najpopularniejszy całkowicie endogenny załamek to P300, pojawiający się po rozpoznaniu bodźca oczekiwanego, na którym skupiamy uwagę: na przykład, jeśli w serii pojawiających się losowo liter mamy zliczać wystąpienia jednej z nich, to na średniej odpowiedzi na pojawienie się tej litery pojawi się załamek P300. Załamek ten występuje również w odpowiedzi na bodźce wyczekiwane, niespodziewane i ważne dla osoby (np. własne imię). &lt;br /&gt;
&lt;br /&gt;
=== Uśrednianie w dziedzinie czasu ===&lt;br /&gt;
Jak już było wspomniane powyżej podstawową techniką stosowaną do analizy potencjałów wywołanych jest uśrednianie wielu realizacji odpowiedzi na bodziec wyrównanych względem jakiegoś charakterystycznego zdarzenia, np. momentu podania bodźca albo momentu behawioralnej reakcji na bodziec (np. wciśnięcie przycisku). Podejście to bazuje na trzech założeniach:&lt;br /&gt;
* Reakcja jest czasowo związana z bodźcem. Tzn. w kolejnych realizacjach występuje ona zawsze z tym samym opóźnieniem.&lt;br /&gt;
* Reakcja na bodziec skutkuje zawsze pojawieniem się w sygnale składowej o stałym kształcie (mówimy o stałej morfologii).&lt;br /&gt;
* Spontaniczna czynność EEG &amp;amp;mdash; ta która nie dotyczy przetwarzania interesującego nas bodźca &amp;amp;mdash; jest niezależnym, stacjonarnym szumem o średniej zero.&lt;br /&gt;
&lt;br /&gt;
Zgodnie z powyższymi założeniami mierzony w ''i''-tej realizacji sygnał można wyrazić jako:&lt;br /&gt;
: &amp;lt;math&amp;gt;x_i(t) = s(t) + n_i(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
Uśrednianie po ''N'' realizacjach daje:&lt;br /&gt;
: &amp;lt;math&amp;gt;\bar x (t) = \frac{1}{N} \sum_{i=1}^N x_i(t) = \frac{1}{N} \left(N s(t) + \sum_{i=1}^N n_i(t) \right) &amp;lt;/math&amp;gt;&lt;br /&gt;
Wartość oczekiwana średniego sygnału wynosi:&lt;br /&gt;
: &amp;lt;math&amp;gt;\mathrm{E}\left[ \bar x(t) \right] = s(t) &amp;lt;/math&amp;gt;&lt;br /&gt;
gdyż dla szumu o średniej zero mamy:&lt;br /&gt;
: &amp;lt;math&amp;gt;\mathrm{E}\left[\frac{1}{N} \sum_{i=1}^N n_i(t)\right] = 0&amp;lt;/math&amp;gt;.&lt;br /&gt;
Wariancja &amp;lt;math&amp;gt;\bar x(t)&amp;lt;/math&amp;gt; wynosi:&lt;br /&gt;
: &amp;lt;math&amp;gt;\sigma^2_{\bar x(t)} = \mathrm{E} \left[  \left( \frac{1}{N} \sum_{i=1}^N n_i(t)\right)^2 \right] \approx \frac{1}{N} \sigma^2_{n(t)}&amp;lt;/math&amp;gt;&lt;br /&gt;
gdyż &amp;lt;math&amp;gt;s(t)&amp;lt;/math&amp;gt; jest deterministyczne. &lt;br /&gt;
&lt;br /&gt;
Dla potencjałów pojawiających się w pierwszych kilkudziesięciu milisekundach po bodźcu model ten można uznać za poprawny, gdyż wykazują one zależność głównie od parametrów fizycznych bodźca. Dla późniejszych składowych staje się on coraz bardziej wątpliwy ze względu na występujące korelacje ze stanem (np. uwagi) badanego.&lt;br /&gt;
&lt;br /&gt;
Dla późniejszych składowych można by postulować bardziej ogólną wersję modelu potencjału wywołanego:&lt;br /&gt;
: &amp;lt;math&amp;gt;x_i(t) = s_i(t) + n_i(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
Ten model uwidacznia, że do opisu potencjału wywołanego potrzebna jest nie tylko średnia, ale i wyższe momenty rozkładu (np. drugi moment centralny czyli wariancja).&lt;br /&gt;
&lt;br /&gt;
====Wariancja w przypadku szumu skorelowanego ====&lt;br /&gt;
W poprzednim paragrafie pokazaliśmy, że w przypadku niezależnego szumu wariancja uśrednionego sygnału (w danej chwili czasu) maleje jak  &amp;lt;math&amp;gt;\frac{1}{N}&amp;lt;/math&amp;gt;. Jednak w przypadku gdy kolejne próbki szumu są skorelowane (np. występuje silna aktywność rytmiczna alfa) sytuacja się komplikuje. Intuicyjnie łatwo możemy to sobie wyobrazić w granicznym przypadku. Załóżmy, że tło dla  potencjałów o stałej morfologii   stanowi sinusoida. Jeśli będziemy podawać bodźce w odstępach będących wielokrotnością okresu tej sinusoidy to w uśrednianych fragmentach sygnału owa sinusoida jest tak samo powtarzalna jak badany potencjał i uśrednianie nie prowadzi do poprawy stosunku amplitudy sygnału do amplitudy tła. &lt;br /&gt;
&lt;br /&gt;
Stopień zależności pomiędzy próbkami można zmierzyć przy pomocy funkcji autokorelacji. &lt;br /&gt;
Jeśli funkcję autokorelacji przybliżymy przez:&lt;br /&gt;
: &amp;lt;math&amp;gt;R_{xx}(\tau) = \sigma^2 \exp(-\beta |\tau|) \cos(2 \pi f_0 \tau)&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\sigma^2&amp;lt;/math&amp;gt; jest wariancją szumu, &amp;lt;math&amp;gt;f_0&amp;lt;/math&amp;gt; jest średnią częstością aktywności rytmicznej, &amp;lt;math&amp;gt;\beta/ \pi&amp;lt;/math&amp;gt; jest szerokością pasma tej czynności, zaś &amp;lt;math&amp;gt;\tau&amp;lt;/math&amp;gt; opóźnieniem, to wariancję potencjału wywołanego można wyrazić jako&amp;lt;!-- \cite{Spekreijse_1976}--&amp;gt;:&lt;br /&gt;
: &amp;lt;math&amp;gt;\sigma^2_{\bar x(t)} = \frac{\sigma^2}{N} \left[ \frac{1-\exp(-2 \beta T)}{1 - 2 \exp(- \beta T) \cos(2 \pi f_0 T) +\exp(-2 \beta T)} \right]&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; jest odstępem między bodźcami. &lt;br /&gt;
Widać stąd, że obecność czynności rytmicznej w tle wpływa na stosunek sygnału do szumu. Z powyższego równania widać, że stosunek wariancji dąży do &amp;lt;math&amp;gt;\frac{\sigma^2}{N}&amp;lt;/math&amp;gt; gdy &amp;lt;math&amp;gt;\beta T&amp;lt;/math&amp;gt; staje się duże.  &lt;br /&gt;
&lt;br /&gt;
Periodyczna stymulacja może ponadto prowadzić do wzbudzenia czynności rytmicznej o częstości równej częstości pobudzania bądź jej harmonicznej.&lt;br /&gt;
&lt;br /&gt;
===Wariancja latencji===&lt;br /&gt;
&lt;br /&gt;
Jedną z form zmienności potencjału wywołanego w pojedynczych realizacjach jest wariancja latencji. &lt;br /&gt;
[[Grafika:Wariancja_latencji.png|thumb|500px|right|&lt;br /&gt;
Czerwona linia: Uśrednianie 100 potencjałów wywołanych o latncjach z rozkładu normalnego N(300,30 ), Niebieskie linie: przykładowe pojedyncze realizacje wzięte do średniej]]&amp;lt;!--# -*- coding: utf-8 -*-&lt;br /&gt;
from __future__ import division&lt;br /&gt;
import numpy as np&lt;br /&gt;
from matplotlib.pyplot import plot, show ,subplot, figure, title, xlabel, ylabel, ylim&lt;br /&gt;
 &lt;br /&gt;
def fun(t,lat=100):&lt;br /&gt;
    return np.exp(-(t-lat)**2/(2*30**2))&lt;br /&gt;
Fs = 1&lt;br /&gt;
N = 100&lt;br /&gt;
t = np.arange(0,700)&lt;br /&gt;
f = np.zeros((N,700))&lt;br /&gt;
f_sr = np.zeros(t.shape)&lt;br /&gt;
for i in range(N):&lt;br /&gt;
    f[i,:] = fun(t,lat = 300 + 30* np.random.randn())&lt;br /&gt;
for i in range(3):&lt;br /&gt;
    plot(t,f[i,:], 'b')&lt;br /&gt;
plot(t,f.mean(0),'r')&lt;br /&gt;
show()--&amp;gt;&lt;br /&gt;
Zmienność latencji prowadzi do:&lt;br /&gt;
* zmniejszenia amplitudy &amp;lt;math&amp;gt;\bar x&amp;lt;/math&amp;gt;&lt;br /&gt;
* wzrostu rozciągłości czasowej załamka&lt;br /&gt;
&lt;br /&gt;
O tych konsekwencjach zmienności latencji należy w szczególności pamiętać porównując średnie potencjały uzyskane w różnych warunkach eksperymentalnych. Gdy zauważymy, że średnie potencjały różnią się amplitudą należy rozważyć możliwość, że w istocie warunki eksperymentalne wpływają na różnice w wariancji latencji. &lt;br /&gt;
&lt;br /&gt;
Naturalne jest, że zmienność latencji jest bardziej widoczna w przypadku załamków trwających krótko niż w przypadku załamków trwających długo. Wariancja latencji rożnie wraz z jej wartością, stąd wśród późnych składowych potencjałów wywołanych nie obserwuje się komponentów krótkotrwałych.&lt;br /&gt;
&amp;lt;!--====Uśrednianie metodą Woody'ego ====&lt;br /&gt;
&lt;br /&gt;
Model potencjału ze zmienną latencją i sposób na jego efektywniejsze uśrednianie zaproponował Woody (1967). Model ten zakłada, że w każdej realizacji występuje komponent addytywny &amp;lt;math&amp;gt;s_i(t)\;&amp;lt;/math&amp;gt;, który co do kształtu jest stały, a pomiędzy realizacjami różni się tylko latencją:&lt;br /&gt;
: &amp;lt;math&amp;gt; s_i(t) = s(t +\Delta t_i)\;&amp;lt;/math&amp;gt;&lt;br /&gt;
Woody zaproponował aby &amp;lt;math&amp;gt;\Delta t_i\;&amp;lt;/math&amp;gt; szacować na podstawie maksimum funkcji korelacji wzajemnej pomiędzy ''i''-tą realizacją a wzorcem. W pierwszym kroku wzorcem jest średni potencjał uzyskany przez proste uśrednienie realizacji.  Następnie w sposób iteracyjny dokonuje się:&lt;br /&gt;
* poprawek w wyrównaniu poszczególnych realizacji,&lt;br /&gt;
* obliczenia nowego wzorca poprzez uśrednienie realizacji po korekcie wyrównania,&lt;br /&gt;
* obliczenia nowych poprawek do wyrównania realizacji.--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Habituacja ===&lt;br /&gt;
Zmienność w odpowiedziach na kolejno występujące po sobie bodźce można podzielić na komponent stochastyczny i deterministyczny. Komponent deterministyczny odzwierciedla zmianę czułości  układu nerwowego  na kolejne bodźce. Nowy bodziec często wywołuje reakcje pobudzenia widoczną w wielu parametrach takich jak przewodnictwo skóry, rytm serca i reaktywność kory mózgowej. Powszechnie obserwowanym zjawiskiem jest spadek reaktywności na powtarzające się bodźce zwany habituacją. Niekiedy obserwuje się także zjawisko przeciwne &amp;amp;mdash; wzrost reaktywności na bodziec &amp;amp;mdash; zwane sensytyzacją. &lt;br /&gt;
&lt;br /&gt;
Klasycznym sposobem na badanie tych zjawisk w potencjałach wywołanych jest uśrednianie w podzbiorach lub  uśrednianie blokowe. Wymaga ono  zmiany paradygmatu rejestracji danych. Załóżmy, że interesującym nas bodźcem jest błysk światła. Chcemy zaobserwować ewentualne zmiany amplitudy i latencji w ciągu 100 potencjałów będących reakcją na błysk powtarzający się co 500 ms.&lt;br /&gt;
====Uśrednianie w podzbiorach ====&lt;br /&gt;
W metodzie tej musimy założyć, że proces habituacji jest powolny, tzn. zmiany pomiędzy kolejnymi reakcjami są bardzo małe. W takim przypadku możemy podzielić długą serię bodźców na ciąg pod-serii i uśrednienie przeprowadzić dla każdej pod-serii osobno.&lt;br /&gt;
[[Plik:Usrednianie_podzbiory.svg‎|640px|thumb|center|Ilustracja uśredniania w podzbiorach]]&lt;br /&gt;
&lt;br /&gt;
====Uśrednianie blokowe====&lt;br /&gt;
W tym celu eksperyment wykonujemy w wielu seriach. Jedna seria składa się ze 100 błysków powtarzanych co 500 ms.  Po serii następuje przerwa trwająca np. 5 s (długość przerwy wyraża nasze oszacowanie czasu potrzebnego na zanik habituacji). Po przerwie seria jest powtarzana. Powtórzeń serii wykonujemy ''N''.&lt;br /&gt;
Następnie uśredniamy fragmenty sygnałów odpowiadające sobie w kolejnych seriach. &lt;br /&gt;
&lt;br /&gt;
W tym paradygmacie zakładamy, że każda seria rejestrowana jest w tych samych warunkach. Zaniedbujemy efekty związane ze zmęczeniem i zmianami w np. stopniu koncentracji badanego.&lt;br /&gt;
[[Plik:Usrednianie blokowe.svg|Usrednianie blokowe.svg|640px|thumb|center|Ilustracja uśredniania w blokach]]&lt;br /&gt;
&lt;br /&gt;
===Załamki w krzywej potencjału wywołanego vs ukryte komponenty===&lt;br /&gt;
Komponenta potencjału wywołanego to bardzo ważne ale jednocześnie źle określone pojęcie. Krzywa otrzymana w wyniku uśredniania potencjałów wywołanych przedstawia serię załamków dodatnich i ujemnych, ale trzeba być świadomym, że ten przebieg napięcia rejestrowany przez elektrody przedstawia tak naprawdę sumę potencjałów pochodzących od wielu dość niezależnie działających źródeł w mózgu. Przyczynek pochodzący od jednego funkcjonalnego źródła będziemy określać jako komponentę. &lt;br /&gt;
&lt;br /&gt;
Komentarza wymaga też pojęcie źródła funkcjonalnego. Czynność elektryczną synchronicznie działających neuronów piramidalnych w określonym fragmencie kory mózgowej z pewnej odległości można przybliżyć potencjałem dipola prądowego. Taki aktywny fragment kory stanowi źródło dające przyczynek do mierzonego na powierzchni głowy potencjału. W najprostszej sytuacji taki przyczynek może być obserwowany jako komponenta. Mózg jest jednak obiektem niezwykle złożonym i gęsto połączonym. Wiele obszarów korowych może być funkcjonalnie połączonych i aktywowanych synchronicznie w celu realizacji określonego zadania &amp;amp;mdash; o takim funkcjonalnym zespole też możemy myśleć jako o pojedynczym źródle, choć może ono mieć złożoną strukturę przestrzenną. Często zatem myślimy o komponentach ukrytych potencjału wywołanego jako o aktywności takich funkcjonalnych zespołów. &lt;br /&gt;
&lt;br /&gt;
Po tym wstępie widać już chyba, że do zrozumienia co dzieje się w czasie reakcji na bodziec, którą obserwujemy w potencjale wywołanym, bardziej pożądane byłoby badanie komponent ukrytych niż poszczególnych załamków krzywej potencjału wywołanego, która stanowi ważoną sumę owych komponentów. Zanim przejdziemy do omówienia technik służących &amp;amp;bdquo;wyłuskiwaniu&amp;amp;rdquo; komponent prześledźmy kilka symulacji i wnioski z nich płynące.&lt;br /&gt;
&lt;br /&gt;
==== Załamki i komponenty nie są tym samym.====&lt;br /&gt;
Tę samą krzywą można otrzymać na nieskończenie wiele sposobów  przez sumowanie rożnych kombinacji domniemanych komponentów. Przykładowy rysunek pokazuje, jak tę samą krzywą można złożyć z dwóch rożnych zestawów komponentów (kod wytwarzający przykładową symulację pokazany jest poniżej).&lt;br /&gt;
[[Plik:Sumowanie_komponentow1.png|center|thumb|600px| Panel a) przedstawia hipotetyczną krzywą ERP, panel b) jedna z możliwych dekompozycji sygnału w panelu a), panel c) inna możliwa dekompozycja sygnału z panelu a) ]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
from __future__ import division&lt;br /&gt;
import numpy as np&lt;br /&gt;
from matplotlib.pyplot import plot, show ,subplot, figure, title, xlabel, ylabel, ylim&lt;br /&gt;
&lt;br /&gt;
Fs = 1&lt;br /&gt;
t = np.arange(0,700)&lt;br /&gt;
&lt;br /&gt;
C1 = np.exp(-(t-100)**2/(2*30**2))&lt;br /&gt;
C2 = np.exp(-(t-200)**2/(2*50**2))&lt;br /&gt;
C3 = np.exp(-(t-350)**2/(2*100**2))&lt;br /&gt;
ERP = 0.5*C1-C2+C3&lt;br /&gt;
&lt;br /&gt;
C2p = np.concatenate((C2[0:200], np.ones(30), C2[200:700-30] ))&lt;br /&gt;
C3p = ERP - 0.5*C1 + C2p&lt;br /&gt;
ERP_v2 = 0.5*C1-C2p+C3p&lt;br /&gt;
&lt;br /&gt;
subplot(3,1,1)&lt;br /&gt;
plot(t,ERP, t[::10],ERP_v2[::10],'g.')&lt;br /&gt;
ylabel('a)',rotation='horizontal')&lt;br /&gt;
ylim([-1, 1.5])&lt;br /&gt;
&lt;br /&gt;
subplot(3,1,2)&lt;br /&gt;
plot(t,0.5*C1,t,-C2,t,C3)&lt;br /&gt;
ylabel('b)',rotation='horizontal')&lt;br /&gt;
ylim([-1, 1.5])&lt;br /&gt;
&lt;br /&gt;
subplot(3,1,3)&lt;br /&gt;
plot(t,0.5*C1,t,-C2p,t,C3p)&lt;br /&gt;
ylabel('c)',rotation='horizontal')&lt;br /&gt;
ylim([-1, 1.5])&lt;br /&gt;
&lt;br /&gt;
show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Zmiana jednej komponenty może powodować zmiany w amplitudzie i latencji więcej niż jednego załamka.====&lt;br /&gt;
Poniższy rysunek przedstawia sytuację gdy zmiana amplitudy jednego komponentu może znacząco wpływać na amplitudę i latencję innych załamków.&lt;br /&gt;
&lt;br /&gt;
[[Plik:Sumowanie_komponentow2.png|center|thumb|768px| Panel a) przedstawia dwie hipotetyczne krzywe ERP, panel b) panel b i c komponenty z których powstały owe krzywe. Zmiana amplitudy komponentu oznaczonego kolorem powoduje zmianę amplitudy oznaczonych załamków ale także zmianę latencji wcześniejszego załamka. ]]&lt;br /&gt;
Poniżej kod odtwarzający powyższy przykład:&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
from __future__ import division&lt;br /&gt;
import numpy as np&lt;br /&gt;
from matplotlib.pyplot import plot, show, subplot, figure, title, xlabel, ylabel, ylim&lt;br /&gt;
&lt;br /&gt;
Fs = 1&lt;br /&gt;
t = np.arange(0,700)&lt;br /&gt;
&lt;br /&gt;
C1 = np.exp(-(t-100)**2/(2*30**2))&lt;br /&gt;
C2 = np.exp(-(t-200)**2/(2*50**2))&lt;br /&gt;
C3 = np.exp(-(t-350)**2/(2*100**2))&lt;br /&gt;
ERP1 = 0.5*C1-C2+C3&lt;br /&gt;
ERP2 = 0.5*C1-C2+1.5*C3&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
subplot(3,1,1)&lt;br /&gt;
plot(t,ERP1,'b', t,ERP2,'g')&lt;br /&gt;
plot(t[np.argmin(ERP1)],np.min(ERP1),'r.' )&lt;br /&gt;
plot(t[np.argmax(ERP1)],np.max(ERP1),'m.' )&lt;br /&gt;
plot(t[np.argmin(ERP2)],np.min(ERP2),'r.' )&lt;br /&gt;
plot(t[np.argmax(ERP2)],np.max(ERP2),'m.' )&lt;br /&gt;
&lt;br /&gt;
ylabel('a)',rotation='horizontal')&lt;br /&gt;
ylim([-1, 1.6])&lt;br /&gt;
&lt;br /&gt;
subplot(3,1,2)&lt;br /&gt;
plot(t,0.5*C1,'k',t,-C2,'k',t,C3,'b')&lt;br /&gt;
ylabel('b)',rotation='horizontal')&lt;br /&gt;
ylim([-1, 1.6])&lt;br /&gt;
&lt;br /&gt;
subplot(3,1,3)&lt;br /&gt;
plot(t,0.5*C1,'k',t,-C2,'k',t,1.5*C3,'g')&lt;br /&gt;
ylabel('c)',rotation='horizontal')&lt;br /&gt;
ylim([-1, 1.6])&lt;br /&gt;
&lt;br /&gt;
show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Instrukcje do ćwiczeń =&lt;br /&gt;
&lt;br /&gt;
==Zadanie 1: uśrednianie symulowanych sygnałów==&lt;br /&gt;
w tym ćwiczeniu chcemy pokazać efekty:&lt;br /&gt;
# uśredniania sygnałów związanych fazowo z bodźcem i nieskorelowanych z bodźcem / wpływ liczby realizacji,&lt;br /&gt;
# uśredniania sygnałów z fluktuacją latencji,&lt;br /&gt;
# wpływ filtrów o różnych funkcjach odpowiedzi impulsowej na morfologię uśrednionego potencjału.&lt;br /&gt;
&lt;br /&gt;
===Sygnały testowe===&lt;br /&gt;
Proszę zaimplementować funkcje generujące następujące przebiegi czasowe (oznaczenia: ''F&amp;lt;sub&amp;gt;s&amp;lt;/sub&amp;gt;'' &amp;amp;mdash; częstość próbkowania, ''T'' &amp;amp;mdash; czas trwania w sekundach, [[%C4%86wiczenia_1#Sygna.C5.82y_testowe|analogicznie do tego]]):&lt;br /&gt;
* sinusoida o zadanej częstości ''f'' i fazie &amp;lt;math&amp;gt;\phi&amp;lt;/math&amp;gt;: &amp;lt;tt&amp;gt;y = sin(f, phi, Fs, T)&amp;lt;/tt&amp;gt;,&lt;br /&gt;
* funkcja Gaussa o zadanym położeniu i szerokości &amp;lt;tt&amp;gt;y = g_1(t0, sigma, Fs, T) &amp;lt;/tt&amp;gt;&lt;br /&gt;
: &amp;lt;math&amp;gt;g_1(t) = \exp\left(-\frac{(t-t_0)^2}{2 \sigma^2}\right)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* pochodną funkcji Gaussa o zadanym położeniu i szerokości &amp;lt;tt&amp;gt;y = g_2(t0, sigma, Fs, T)&amp;lt;/tt&amp;gt;,&lt;br /&gt;
* połowę funkcji Gaussa o zadanym położeniu i szerokości &amp;lt;tt&amp;gt;y = g_3(t0, sigma, Fs, T)&amp;lt;/tt&amp;gt;,&lt;br /&gt;
: &amp;lt;math&amp;gt;g_{3}(t) = \left\{ &lt;br /&gt;
\begin{array}{lll}&lt;br /&gt;
0 &amp;amp; \mathrm{dla}&amp;amp; t&amp;lt;t_0 \\&lt;br /&gt;
\exp\left(-\frac{(t-t_0)^2}{2 \sigma^2}\right)&amp;amp; \mathrm{dla}&amp;amp; t \ge t_0  &lt;br /&gt;
\end{array}&lt;br /&gt;
\right. &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
W dalszych zadaniach tej sekcji przyjmiemy:&lt;br /&gt;
* ''T'' = 1 s,&lt;br /&gt;
* ''F&amp;lt;sub&amp;gt;s&amp;lt;/sub&amp;gt;'' = 128 Hz,&lt;br /&gt;
* ''t''&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; = 0,3 s,&lt;br /&gt;
* &amp;amp;sigma; = 0,02 s.&lt;br /&gt;
&lt;br /&gt;
===Uśrednianie w modelu addytywnym: sygnał + szum===&lt;br /&gt;
Dla funkcji &amp;lt;math&amp;gt;g_1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;g_2&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;g_3&amp;lt;/math&amp;gt;  wykonaj ''N'' symulacji sygnału opisanego daną funkcją z dodanym szumem gaussowskim (&amp;lt;tt&amp;gt;numpy.random.randn&amp;lt;/tt&amp;gt;). Zaobserwuj zmianę wariancji uśrednianego sygnału wraz z ''N''.&lt;br /&gt;
&lt;br /&gt;
===Uśrednianie w modelu addytywnym: sygnał + szum + niezależna czynność rytmiczna===&lt;br /&gt;
Powtórz poprzednie symulacje dokładając w każdej realizacji sinusoidę o losowo wybranej fazie. Symulacje wykonaj dla różnych częstości sinusoidy, takich których połówka okresu zbliżona jest do szerokości funkcji Gaussa, oraz znacząco od niej różnych.&lt;br /&gt;
&lt;br /&gt;
===Uśrednianie w modelu z resetem fazy===&lt;br /&gt;
Zbuduj sygnał składający się z dwóch fragmentów sinusoidy o częstości ''f'': &lt;br /&gt;
* pierwszy fragment ma losową fazę,&lt;br /&gt;
* drugi fragment ma fazę równą 0.&lt;br /&gt;
Wykonaj ''N'' realizacji takiego sygnału, przy czym każda realizacja ma częstość losowaną z rozkładu Gaussa o średniej 10 i pewnej wariancji (czyli &amp;lt;math&amp;gt;f \in \mathrm{N}(10,\sigma)&amp;lt;/math&amp;gt;). &lt;br /&gt;
Uśrednij otrzymane realizacje. Zaobserwuj zależność średniej od liczby uśrednianych realizacji i od wariancji częstości.&lt;br /&gt;
&lt;br /&gt;
===Uśrednianie potencjału z fluktuacją latencji===&lt;br /&gt;
Wygeneruj sygnały składające się z funkcji &amp;lt;math&amp;gt;g_1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;g_2&amp;lt;/math&amp;gt; albo &amp;lt;math&amp;gt;g_3&amp;lt;/math&amp;gt; z fluktuującą latencją, tzn. z wartością &amp;lt;math&amp;gt;t_0&amp;lt;/math&amp;gt; pochodzącą z jakiegoś rozkładu prawdopodobieństwa. U nas dla ustalenia uwagi niech będzie to rozkład Gaussa. Wykonaj zestaw symulacji obrazujący zależność od liczby realizacji i od wielkości fluktuacji, mierzonej przez wariancję rozkładu. Czy jest związek pomiędzy wariancją fluktuacji &amp;lt;math&amp;gt;t_0&amp;lt;/math&amp;gt; a szerokością załamków?&lt;br /&gt;
&lt;br /&gt;
===Wpływ filtrów===&lt;br /&gt;
# Zaprojektuj następujące filtry (przyjmij częstość próbkowania 128 Hz):&lt;br /&gt;
#* dolnoprzepustowy: Butterwortha z częstością odcięcia: 30, 40, 50 Hz, i rzędach od 1 do 5 (funkcja butter w module scipy.signal),&lt;br /&gt;
#* górnoprzepustowy: Butterwortha z częstością odcięcia: 0,1, 0,5, 2 i 5 Hz, i rzędach od 1 do 5,&lt;br /&gt;
#* notch: Czybyszewa II rodzaju z pasmem zaporowym ustawionym na 50 Hz, i rzędach od 1 do 3 (funkcja cheby2),&lt;br /&gt;
# Zbadaj funkcję odpowiedzi impulsowej i funkcję przenoszenia tych filtrów (w skali dB). Zaobserwuj jak długa jest odpowiedź impulsowa i jak daleko od częstości odcięcia zaburzone jest pasmo przenoszenia.&lt;br /&gt;
# Zastosuj powyższe filtry do funkcji &amp;lt;math&amp;gt;g_1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;g_2&amp;lt;/math&amp;gt; albo &amp;lt;math&amp;gt;g_3&amp;lt;/math&amp;gt;. Filtrowanie przeprowadź w jedną (lfilter) oraz w dwie strony (filtfilt). Zaobserwuj związek między zniekształceniem wprowadzanym przez filtr a funkcją odpowiedzi impulsowej filtru.&lt;br /&gt;
# W ćwiczeniu tym posłuż się symulowanymi sygnałami uzyskanymi z modelu addytywnego: &amp;amp;bdquo;sygnał+szum&amp;amp;rdquo;. Dla funkcji &amp;lt;math&amp;gt;g_1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;g_2&amp;lt;/math&amp;gt; albo &amp;lt;math&amp;gt;g_3&amp;lt;/math&amp;gt;  wykonaj ''N'' = 60 realizacji sygnału opisanego daną funkcją z dodanym szumem gaussowskim (&amp;lt;tt&amp;gt;numpy.random.randn&amp;lt;/tt&amp;gt;). Każdą z realizacji przefiltruj, a następnie uśrednij uzyskane sygnały.&lt;br /&gt;
&lt;br /&gt;
==Zadanie 2: rejestracje i analiza potencjałów wzrokowych==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;! -- ===Synchronizacja występowania bodźców z sygnałem EEG===&lt;br /&gt;
&lt;br /&gt;
Rejestracja potencjałów wywołanych jest przykładem pomiaru czynności elektrycznej mózgu w odpowiedzi na określony bodziec. W przypadku tego rodzaju pomiarów konieczna jest synchronizacja momentu wystąpienia bodźca z sygnałem EEG. Wzmacniacze do pomiaru czynności elektrycznej mózgu wyposażone są w specjalne wejścia, na które można podawać sygnał odpowiadający pojawianiu się bodźca. Jak pamiętamy z zeszłego semestru, wejście to (jak i podawany na nie sygnał) nazywamy trigerem (ang. ''trigger'' &amp;amp;mdash; spust, cyngiel, wyzwalacz). W najprostszym przypadku, bodziec moglibyśmy wyświetlać na monitorze komputerowym, a sygnał związany z jego wystąpieniem wysyłać przez któryś z portów komputera (LPT, COM) na wzmacniacz EEG. Niestety, obecnie dostępne i popularne systemy operacyjne, takie jak Windows czy Linux nie są systemami czasu rzeczywistego (http://pl.wikipedia.org/wiki/System_operacyjny_czasu_rzeczywistego). Od momentu wyświetlania bodźca na ekranie, do pojawiania się sygnału odpowiednim porcie komputerowym może upłynąć kilkadziesiąt milisekund i co gorsza czas ten zwykle jest losowy. W przypadku gdy wzmacniacz próbkuje sygnał z częstością 1000 Hz, moment wystąpienia bodźca możemy określić z dokładnością 1 ms, jednakże wspomniane opóźnienia w systemie operacyjnym uniemożliwiają to. Ponadto, jak dowiedzieliśmy się w rozdziale wstępnym [http://brain.fuw.edu.pl/edu-wiki/action/edit/EEG:Potencja%C5%82y_wywo%C5%82ane?section=T-1], pierwsze załamki związane z potencjałami wywołanymi pojawiają się już 10 ms po wystąpieniu bodźca. W związku z tym, losowe, rzędu kilkudziesięciu milisekund opóźnienia sygnału określającego moment pojawienia się bodźca względem jego rzeczywistego wystąpienia są niedopuszczalne.&lt;br /&gt;
Istnieją pewne techniki programowania, dzięki którym opisywane opóźnienia można zmniejszyć, jednakże są one bardzo trudne  do realizacji. Ponadto, standardowe porty komputera, takie jak LPT, czy COM zostały zaprojektowane przede wszystkim do sterowania urządzeniami zewnętrznymi, a nie ich zasilania. Przykładowo, jedna linia portu drukarkowego (LPT) może być obciążona prądem nie większym niż 5 mA, podczas gdy do zapalenie zwykłej diody LED potrzeba około 10 mA. Taki pobór prądu możliwy jest do uzyskania z portu USB, jednakże  jest on  wyjątkowo trudny do oprogramowania.  &lt;br /&gt;
W celu ominięcia powyższych niedogodności w Zakładzie Fizyki Biomedycznej UW w przeprowadzanych eksperymentach wykorzystywane są  mikrokontrolery [http://pl.wikipedia.org/wiki/Mikrokontroler], w szczególności ATmega16 i ATmega32.  Mikrokontrolery te wyposażone są w procesory o architekturze RISC [http://pl.wikipedia.org/wiki/RISC] i mocy obliczeniowej porównywalnej z szeroko stosowanym kiedyś w komputerach ZX Spectrum, Commodore, Amiga i Atari procesorem Z80. Oprócz jednostki centralnej mikrokontrolery zawierają   stałą pamięć FLASH przeznaczoną do przechowywania kodu programu, pamięć  RAM i pamięć EEPROM, liczniki 8- i 16-bitowe, komparatory, przetworniki analogowo-cyfrowe, porty wejścia/wyjścia, łącze RS232 (popularnie nazywane portem szeregowym) i układy przerwań.&lt;br /&gt;
&lt;br /&gt;
Mikrokontrolery wchodzące w skład zestawów pomiarowych na Pracowni EEG zawierają program, który umożliwia komunikację z nimi poprzez port szeregowy. Obecnie, komputery są coraz rzadziej wyposażane w porty szeregowe. Standard komunikacji RS-232, opracowany w 1962 roku  nadal jest jednak popularny i często wykorzystywany do komunikacji miedzy urządzeniami.  W celu połączenia komputera posiadającego tylko porty USB z mikrokontrolerem zastosowano przejściówkę USB/RS-232. &lt;br /&gt;
&lt;br /&gt;
Jak każde urządzenie w systemie Linuks, przejściówka USB/RS-232 widoczna jest jako plik, znajdujący się w katalogu &amp;lt;tt&amp;gt;/dev&amp;lt;/tt&amp;gt;. Nazwy plików obsługujących urządzenia szeregowe to &amp;lt;tt&amp;gt;ttyXY&amp;lt;/tt&amp;gt;, gdzie &amp;lt;tt&amp;gt;XY&amp;lt;/tt&amp;gt; to kolejny numer przydzielony do urządzenia szeregowego.&lt;br /&gt;
Do komunikacji komputera z mikroknotrolerem  w Zakładzie Fizyki Biomedycznej UW została napisana prosta biblioteka.  Jej użycie jest następujące:&lt;br /&gt;
* Po podłączeniu przejściówki USB/RS232 do komputera mikrokontrolera sprawdź jaki plik w katalogu &amp;lt;tt&amp;gt;/dev&amp;lt;/tt&amp;gt; został utworzony i przydzielony do urządzenia. &lt;br /&gt;
* Zaimportuj bibliotekę do komunikacji z mikrokontrolerem: &lt;br /&gt;
: &amp;lt;tt&amp;gt;import SerialPort as SP&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Otwórz plik powiązany z urządzeniem zewnętrznym:&lt;br /&gt;
: &amp;lt;tt&amp;gt;sp = SP.SerialPort(nazwa_pliku) &amp;lt;/tt&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
: &amp;lt;tt&amp;gt;sp.open()&amp;lt;/tt&amp;gt;&lt;br /&gt;
W naszym przypadku prawidłowa nazwa pliku to &amp;lt;tt&amp;gt;/dev/ttyUSB0&amp;lt;/tt&amp;gt;.&lt;br /&gt;
* Po włączeniu zasilania mikrokontrolera, diody podłączone do niego i wykorzystywane w eksperymencie z potencjałami wywołanymi będą zapalone. Następujące polecenie zgasi obydwie diody:&lt;br /&gt;
: &amp;lt;tt&amp;gt;sp.blinkP300([0, 0])&amp;lt;/tt&amp;gt;&lt;br /&gt;
* Wydanie poniższego polecenia spowoduje, iż mikrokontroler zapali podłączoną do niego diodę numer 1 na czas 100 ms, zaś diodę numer 2 na 200 ms. Jednocześnie, w momencie włączenia jak i wyłączenia diody, sygnał z mikrokontrolera zostanie wysłany na 5-stykowe wejście AUX mikrokontrolera:&lt;br /&gt;
: &amp;lt;tt&amp;gt;sp.blinkP300([100, 200])&amp;lt;/tt&amp;gt;&lt;br /&gt;
* Jeśli chcemy zapalić tylko diodę numer dwa, np. na czas 500 ms w programie podajemy następującą instrukcję:&lt;br /&gt;
: &amp;lt;tt&amp;gt;sp.blinkP300([0, 500])&amp;lt;/tt&amp;gt;&lt;br /&gt;
* Jeśli chcemy zakończyć komunikację z mikrokontrolerem piszemy:&lt;br /&gt;
: &amp;lt;tt&amp;gt;sp.close()&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Kod biblioteki do komunikacji z mikrokontrolerem:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;!--  Kod w Pythonie 2&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# -*- coding: cp1250 -*-&lt;br /&gt;
import serial&lt;br /&gt;
import logging&lt;br /&gt;
import sys&lt;br /&gt;
import os&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def to_hex_word(a):&lt;br /&gt;
    '''encodes a decimal number hexadecimally on two bytes'''&lt;br /&gt;
    return chr(a%256) + chr(a/256)&lt;br /&gt;
&lt;br /&gt;
class SerialPort(object):&lt;br /&gt;
    def __init__(self, port_name):&lt;br /&gt;
        import serial&lt;br /&gt;
        try:&lt;br /&gt;
            self.port = serial.Serial(&lt;br /&gt;
                port=port_name,&lt;br /&gt;
                baudrate=9600,&lt;br /&gt;
                bytesize=serial.EIGHTBITS,&lt;br /&gt;
                parity=serial.PARITY_NONE,&lt;br /&gt;
                stopbits=serial.STOPBITS_ONE,&lt;br /&gt;
                xonxoff=False&lt;br /&gt;
                )&lt;br /&gt;
        except serial.SerialException as e:&lt;br /&gt;
            print(&amp;quot;Nieprawidłowa nazwa portu lub port zajęty.&amp;quot;)&lt;br /&gt;
            raise e&lt;br /&gt;
        self.close()&lt;br /&gt;
        &lt;br /&gt;
    def open(self):&lt;br /&gt;
        self.port.open()&lt;br /&gt;
&lt;br /&gt;
    def close(self):&lt;br /&gt;
        self.port.close()&lt;br /&gt;
&lt;br /&gt;
    def send(self, value):&lt;br /&gt;
        self.port.write(value)&lt;br /&gt;
                           &lt;br /&gt;
    def blinkSSVEP(self,d, p1, p2):&lt;br /&gt;
        '''&lt;br /&gt;
        d = list of frequencies;&lt;br /&gt;
        p1:p2 = ratio LED_on_time/LED_off_time&lt;br /&gt;
        if you want i-th LED to be OFF all the time send  d[i] = 0&lt;br /&gt;
        if you want i-th LED to be ON all the time send  d[i] = -1&lt;br /&gt;
        in these two cases p1 and p2 do not matter&lt;br /&gt;
        '''&lt;br /&gt;
        clock  = 62500&lt;br /&gt;
        factor = float(p1) / float(p1 + p2)&lt;br /&gt;
    &lt;br /&gt;
        str = chr(3) # 'SSVEP_RUN'&lt;br /&gt;
&lt;br /&gt;
        for i in range(len(d)):&lt;br /&gt;
            # i-th LED OFF&lt;br /&gt;
            if d[i] == 0:                       &lt;br /&gt;
                str += to_hex_word(0) + to_hex_word(255) &lt;br /&gt;
            # i-th LED ON&lt;br /&gt;
            elif d[i] == -1:&lt;br /&gt;
                str += to_hex_word(255) + to_hex_word(0)&lt;br /&gt;
                #str = 'S'&lt;br /&gt;
                # i-th LED blinks d[i] times per second&lt;br /&gt;
                # p1:p2 = on_time:off_time in one blink&lt;br /&gt;
            else:&lt;br /&gt;
                period = clock/d[i]&lt;br /&gt;
                bright = int((clock/d[i]) * factor)&lt;br /&gt;
                dark = period - bright&lt;br /&gt;
                str += to_hex_word(bright) + to_hex_word(dark)&lt;br /&gt;
&lt;br /&gt;
        self.send(str)&lt;br /&gt;
&lt;br /&gt;
    def blinkP300(self,d):&lt;br /&gt;
        clock  = 62500&lt;br /&gt;
        str = chr(4) # 'P300_RUN'&lt;br /&gt;
&lt;br /&gt;
        for i in range(len(d)):&lt;br /&gt;
            period = int(clock*d[i]/1000.0)&lt;br /&gt;
            str += to_hex_word(period)&lt;br /&gt;
            print(period)&lt;br /&gt;
&lt;br /&gt;
        self.send(str)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
--&amp;gt; &amp;lt;!-- Kod w Pythonie 3 --&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# -*- coding: cp1250 -*-&lt;br /&gt;
import serial&lt;br /&gt;
import logging&lt;br /&gt;
import sys&lt;br /&gt;
import os&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
def to_hex_word(a):&lt;br /&gt;
    '''encodes a decimal number hexadecimally on two bytes'''&lt;br /&gt;
    return a.to_bytes(2,byteorder=sys.byteorder)&lt;br /&gt;
 &lt;br /&gt;
class SerialPort(object):&lt;br /&gt;
    def __init__(self, port_name):&lt;br /&gt;
        import serial&lt;br /&gt;
        try:&lt;br /&gt;
            self.port = serial.Serial(&lt;br /&gt;
                port=port_name,&lt;br /&gt;
                baudrate=9600,&lt;br /&gt;
                bytesize=serial.EIGHTBITS,&lt;br /&gt;
                parity=serial.PARITY_NONE,&lt;br /&gt;
                stopbits=serial.STOPBITS_ONE,&lt;br /&gt;
                xonxoff=False&lt;br /&gt;
                )&lt;br /&gt;
        except serial.SerialException as e:&lt;br /&gt;
            print(&amp;quot;Nieprawidłowa nazwa portu lub port zajęty.&amp;quot;)&lt;br /&gt;
            raise e&lt;br /&gt;
        self.close()&lt;br /&gt;
 &lt;br /&gt;
    def open(self):&lt;br /&gt;
        self.port.open()&lt;br /&gt;
 &lt;br /&gt;
    def close(self):&lt;br /&gt;
        self.port.close()&lt;br /&gt;
 &lt;br /&gt;
    def send(self, value):&lt;br /&gt;
        self.port.write(value)&lt;br /&gt;
 &lt;br /&gt;
    def blinkSSVEP(self,d, p1, p2):&lt;br /&gt;
        '''&lt;br /&gt;
        d = list of frequencies;&lt;br /&gt;
        p1:p2 = ratio LED_on_time/LED_off_time&lt;br /&gt;
        if you want i-th LED to be OFF all the time send  d[i] = 0&lt;br /&gt;
        if you want i-th LED to be ON all the time send  d[i] = -1&lt;br /&gt;
        in these two cases p1 and p2 do not matter&lt;br /&gt;
        '''&lt;br /&gt;
        clock  = 62500&lt;br /&gt;
        factor = float(p1) / float(p1 + p2)&lt;br /&gt;
 &lt;br /&gt;
        str = (3).to_bytes(1,byteorder=sys.byteorder) # 'SSVEP_RUN'&lt;br /&gt;
 &lt;br /&gt;
        for i in range(len(d)):&lt;br /&gt;
            # i-th LED OFF&lt;br /&gt;
            if d[i] == 0:                       &lt;br /&gt;
                str += to_hex_word(0) + to_hex_word(255) &lt;br /&gt;
            # i-th LED ON&lt;br /&gt;
            elif d[i] == -1:&lt;br /&gt;
                str += to_hex_word(255) + to_hex_word(0)&lt;br /&gt;
                #str = 'S'&lt;br /&gt;
                # i-th LED blinks d[i] times per second&lt;br /&gt;
                # p1:p2 = on_time:off_time in one blink&lt;br /&gt;
            else:&lt;br /&gt;
                period = clock/d[i]&lt;br /&gt;
                bright = int((clock/d[i]) * factor)&lt;br /&gt;
                dark = int(period - bright)&lt;br /&gt;
                str += to_hex_word(bright) + to_hex_word(dark)&lt;br /&gt;
 &lt;br /&gt;
        self.send(str)&lt;br /&gt;
 &lt;br /&gt;
    def blinkP300(self,d):&lt;br /&gt;
        clock  = 62500&lt;br /&gt;
        str = (4).to_bytes(1,byteorder=sys.byteorder) # 'P300_RUN'&lt;br /&gt;
 &lt;br /&gt;
        for i in range(len(d)):&lt;br /&gt;
            period = int(clock*d[i]/1000.0)&lt;br /&gt;
            str += to_hex_word(period)&lt;br /&gt;
 &lt;br /&gt;
        self.send(str)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
--&amp;gt; &lt;br /&gt;
&lt;br /&gt;
===Zestaw eksperymentalny===&lt;br /&gt;
Zestaw składa się ze:&lt;br /&gt;
* wzmacniacza,&lt;br /&gt;
* stymulatora   &lt;br /&gt;
&amp;lt;!--* izolowanego galwanicznie układu generującego impulsy odpowiadające gaszeniu i zapalaniu diody,  o wartościach dopasowanych do akceptowalnych przez wejścia AUX wzmacniacza,--&amp;gt;&lt;br /&gt;
* komputera: w tym eksperymencie komputer będzie służył do zaprogramowania stymulatora i do rejestracji sygnałów.&lt;br /&gt;
&lt;br /&gt;
===Wersja 1: obserwacja błyskającej diody  ===&lt;br /&gt;
&amp;lt;!--Proszę zapoznać się ze standardami rejestracji wzrokowych potencjałów wywołanych [http://www.gcu.ac.uk/media/gcalwebv2/theuniversity/academicschools/sls/psytimetables/SLS%20-%20VEP_Standard_2010.pdf] --&amp;gt;&lt;br /&gt;
Proszę zapoznać się z typowym wyglądem załamków w przypadku potencjałów wzrokowych, jaki jest przedstawiony na [https://link.springer.com/article/10.1007/s10633-009-9195-4/figures/2 rysunku] (cały artykuł jest dostępny [http://link.springer.com/article/10.1007%2Fs10633-009-9195-4 tu]).&lt;br /&gt;
&amp;lt;!--[[Plik:Fig 4 VEP.jpg|thumb|320px|right|&amp;lt;figure id=&amp;quot;fig:zalamki_VEP&amp;quot;&amp;gt;&amp;lt;/figure&amp;gt;&lt;br /&gt;
&amp;lt;xr id=&amp;quot;fig:zalamki_VEP&amp;quot;&amp;gt;Rys. %i.&amp;lt;/xr&amp;gt; Schemat załamków rozpoznawanych we wzrokowych potencjach wywołanych (z pracy: J. V. Odom i in. &amp;amp;bdquo;ISCEV standard for clinical visual evoked potentials&lt;br /&gt;
(2009 update)&amp;amp;rdquo;, Doc Ophthalmol (2010), 120:111–119).]]&lt;br /&gt;
--&amp;gt; &lt;br /&gt;
&lt;br /&gt;
==== Rejestracja ====&lt;br /&gt;
* Paradygmat: z odległości około 40 cm badany obserwuje błyski diody. Błyski powtarzają się co 1&amp;amp;plusmn;0,1 sekundy. Każdy błysk trwa 20 ms. Rejestrujemy 2 serie po 100 błysków. Częstość próbkowania 512 Hz.&lt;br /&gt;
** W pierwszej serii błyskamy tylko jedną diodą.&lt;br /&gt;
** W drugiej serii błyskamy dwiema diodami. &lt;br /&gt;
Pomiędzy seriami badany odpoczywa około 2 min. Diody powinny być ustawione na jednakową jasność błysków.&lt;br /&gt;
&lt;br /&gt;
* Pomiar&lt;br /&gt;
**Zakładamy czepek i elektrody w systemie 10-20, dbamy o to by opory pomiędzy elektrodami były poniżej 5 k&amp;amp;Omega; i różnice pomiędzy oporami różnych elektrod nie przekraczały 20%. [[Plik:Glowka10-20 ERPy.svg|thumb|600px|right]]&lt;br /&gt;
** Elektrodę GND mocujemy w otworze czepka odpowiadającym pozycji AFz (na linii centralnej 10% w stronę nosa od elektrody Fz) &lt;br /&gt;
** Montujemy także elektrodę FCz (na linii centralnej pomiędzy Fz a Cz), będziemy jej używać w montażu i w czasie analizy jako referencji.&lt;br /&gt;
&lt;br /&gt;
==== Analiza ====&lt;br /&gt;
# Filtrujemy sygnał w paśmie 1-20 Hz.&lt;br /&gt;
# Z ciągłego zapisu wycinamy fragmenty od &amp;amp;minus;300 ms do +400 ms (zero oznacza moment wystąpienia bodźca). W czasie wycinania badamy wycinane fragmenty pod względem zakresu amplitudy (wszystkie kanały powinny mieć amplitudę w granicach &amp;amp;plusmn;75 &amp;amp;mu;V) i zawartości artefaktów od mrugania (w tym celu trzeba oglądając sygnał w SVAROG-u ustalić próg na amplitudę sygnału w kanałach Fp1 i Fp2).&lt;br /&gt;
# Uśredniamy wycięte sygnały.&lt;br /&gt;
# Rysujemy średni potencjał we wszystkich kanałach.&lt;br /&gt;
# Identyfikujemy załamki N2 i P2. Mierzymy amplitudę P2 jako różnicę między ekstremalną wartością załamka P2 a ekstremalną wartością załamka N2. &lt;br /&gt;
&lt;br /&gt;
[[Plik:ZalamkiN2_P2.png‎|thumb|600px|right|  Uśredniony potencjał wywołany dla serii 1 i 2 na kanale T5 z zaznaczonymi załamkami N2 i P2. Na osi poziomej czas [s] natomiast na pionowej amplituda [μV].]]&lt;br /&gt;
Pomiar wykonujemy dla obu serii błysków.&lt;br /&gt;
&lt;br /&gt;
Pytanie: Czy intensywność bodźca wpływa na amplitudę potencjału P2?&lt;br /&gt;
Jak stwierdzić czy amplitudy załamków P2 istotnie różnią się pomiędzy seriami?&lt;br /&gt;
&lt;br /&gt;
Musimy przeprowadzić test statystyczny. Możemy skonstruować go np. tak:&lt;br /&gt;
Mamy dwa warunki I i II. Jako statystykę przyjmiemy różnicę pomiędzy amplitudą załamka zmierzoną w serii z dwoma diodami (P2&amp;lt;sub&amp;gt;II&amp;lt;/sub&amp;gt;) a amplitudą zmierzoną w serii z jedną diodą (P2&amp;lt;sub&amp;gt;I&amp;lt;/sub&amp;gt;):&lt;br /&gt;
: ''S'' = P2&amp;lt;sub&amp;gt;II&amp;lt;/sub&amp;gt; &amp;amp;minus; P2&amp;lt;sub&amp;gt;I&amp;lt;/sub&amp;gt;&lt;br /&gt;
Postawmy hipotezę zerową, że nie ma różnicy w amplitudzie pomiędzy warunkiem II a I oraz hipotezę alternatywną, że różnica taka występuje.&lt;br /&gt;
: H&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;: ''S'' = 0&lt;br /&gt;
: H&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;: ''S'' &amp;amp;ne; 0&lt;br /&gt;
Zgodnie z H&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; dla wartości ''S'' nie ma różnicy czy realizacja została zarejestrowana w warunkach I czy II, zatem można losowo poprzypisywać numery warunków do realizacji i w ten sposób uzyskać rozkład statystyki ''S'' pod warunkiem prawdziwości H&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;, czyli obliczyć średnie potencjały dla &amp;amp;bdquo;pomieszanych&amp;amp;rdquo; tagów, wyliczyć średnie potencjały dla sztucznie wygenerowaych grup, i wyliczyć różnicę amplitud dla tych średnich, czyli wartość statystyki dla hipotezy H&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Zaimplementuj test permutacyjny zgodny z powyższą koncepcją.&lt;br /&gt;
&lt;br /&gt;
===Wersja 2: obserwacja habituacji / uśrednianie w blokach ===&lt;br /&gt;
==== Rejestracja ====&lt;br /&gt;
# Paradygmat: &lt;br /&gt;
#* z odległości około 40 cm badany obserwuje błyski diody. &lt;br /&gt;
#* Błyski powtarzają się co 0,5 sekundy. &lt;br /&gt;
#* Rejestrujemy 60 serii po 15 błysków.  &lt;br /&gt;
#* Pomiędzy seriami badany odpoczywa około 10 sekund.&lt;br /&gt;
# Zakładamy czepek i elektrody w systemie 10-20, dbamy o to by opory pomiędzy elektrodami były poniżej 5 k&amp;amp;Omega; i różnice pomiędzy oporami różnych elektrod nie przekraczały 20%.&lt;br /&gt;
#* Elektrodę GND mocujemy w otworze czepka odpowiadającym pozycji AFz (na linii centralnej 10% w stronę nosa od elektrody Fz) &lt;br /&gt;
#* Montujemy także elektrodę FCz (na linii centralnej pomiędzy Fz a Cz), będziemy jej używać w montażu i w czasie analizy jako referencji.&lt;br /&gt;
#* Częstość próbkowania 512 Hz.&lt;br /&gt;
&lt;br /&gt;
==== Analiza ====&lt;br /&gt;
# Filtrujemy sygnał w paśmie 0,1-20 Hz.&lt;br /&gt;
# Z ciągłego zapisu wycinamy fragmenty od &amp;amp;minus;300 ms do +600 ms (zero oznacza moment wystąpienia bodźca). W czasie wycinania badamy wycinane fragmenty pod względem zakresu amplitudy (wszystkie kanały powinny mieć amplitudę w granicach &amp;amp;plusmn;75 &amp;amp;mu;V) i zawartości artefaktów od mrugania (w tym celu trzeba oglądając sygnał w SVAROG-u ustalić próg na amplitudę sygnału w kanałach Fp1 i Fp2).&lt;br /&gt;
# Uśredniamy wycięte sygnały o tym samym numerze wewnątrz serii.&lt;br /&gt;
# Rysujemy serie 15 uśrednionych potencjałów dla tego kanału, który wykazywał najsilniejszy potencjał w pierwszej wersji eksperymentu.&lt;br /&gt;
&lt;br /&gt;
==Zadanie 3: rejestracja i analiza potencjału P3 ==&lt;br /&gt;
==== Rejestracja ====&lt;br /&gt;
# Paradygmat: &lt;br /&gt;
#* z odległości około 40 cm badany obserwuje błyski diody. &lt;br /&gt;
#* Błyski diody nr 1 powtarzają się co 1&amp;amp;plusmn;0,1 sekundy. &lt;br /&gt;
#* W losowych realizacjach zapalana jest także dioda nr 2. &lt;br /&gt;
#* Proporcja pomiędzy liczbą błysków pojedynczych i podwójnych powinna wynosić 10:2, przy czym błyski podwójne muszą być odseparowane co najmniej jednym błyskiem pojedynczym. &lt;br /&gt;
#* Czas zapalenia diod, tak jak w poprzednich eksperymentach, wynosi 20 ms. &lt;br /&gt;
#* Zadaniem badanego jest liczenie liczby błysków podwójnych.&lt;br /&gt;
#* Wykonujemy tyle realizacji aby zarejestrować 50 powtórzeń podwójnych błysków. &lt;br /&gt;
# Zakładamy czepek i elektrody w systemie 10-20, dbamy o to by opory pomiędzy elektrodami były poniżej 5 k&amp;amp;Omega; i różnice pomiędzy oporami różnych elektrod nie przekraczały 20%.&lt;br /&gt;
#* Elektrodę GND mocujemy w otworze czepka odpowiadającym pozycji AFz (na linii centralnej 10% w stronę nosa od elektrody Fz) &lt;br /&gt;
#* Montujemy także elektrody M1 i M2, będziemy ich używać w montażu i w czasie analizy jako referencji typu połączone uszy.&lt;br /&gt;
#* Częstość próbkowania 512 Hz.&lt;br /&gt;
&lt;br /&gt;
==== Analiza ====&lt;br /&gt;
# Filtrujemy sygnał w paśmie 0,1-20 Hz.&lt;br /&gt;
# Z ciągłego zapisu wycinamy fragmenty od &amp;amp;minus;300 ms do +600 ms (zero oznacza moment wystąpienia bodźca). W czasie wycinania badamy wycinane fragmenty pod względem zakresu amplitudy (wszystkie kanały powinny mieć amplitudę w granicach &amp;amp;plusmn;75 &amp;amp;mu;V) i zawartości artefaktów od mrugania (w tym celu trzeba oglądając sygnał w SVAROG-u ustalić próg na amplitudę sygnału w kanałach Fp1 i Fp2).&lt;br /&gt;
# Uśredniamy osobno realizacje błysków pojedynczych i błysków podwójnych.&lt;br /&gt;
# Nakładamy na siebie na rysunkach oba typy średnich.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Ćwiczenie dodatkowe: P300 BCI==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wykorzystujemy elektrody z systemu 10-10 umieszczone nad korą wzrokową: P07, O1, O2, PO8, PO3, PO4, Pz, Cz.&lt;br /&gt;
&lt;br /&gt;
Uruchamiamy &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
obci_gui --presets eeg_workshop&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
i z guzika &amp;amp;bdquo;select amplifier&amp;amp;rdquo; wybieramy właściwy wzmacniacz.&lt;br /&gt;
&lt;br /&gt;
Do kontroli jakości sygnału możemy uruchomić Svaroga.&lt;br /&gt;
&lt;br /&gt;
Dane z kalibracji zapisują się w pliku test1 w katalogu domowym użytkownika, z labiryntu w pliku test2.&lt;br /&gt;
&lt;br /&gt;
Po zakończeniu kalibracji pojawia się napis &amp;amp;bdquo;Trwają obliczenia&amp;amp;rdquo; lub podobny. Odczekujemy kilka minut, aż skończy się peer &amp;amp;bdquo;Calibration&amp;amp;rdquo; (widoczny w obci_gui) i zamykamy okienko klawiszami Alt-F4 lub zatrzymując scenariusz guzikiem &amp;amp;bdquo;Stop&amp;amp;rdquo;. W katalogu domowym pojawi się plik z wynikami kalibracji, co pozwala na uruchomienie scenariusza &amp;amp;bdquo;labirynt&amp;amp;rdquo;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Po zebraniu danych, przed wczytaniem ich do Svaroga należy w tym samym katalogu uruchomić skrypt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
#!/usr/bin/env python&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
&lt;br /&gt;
from obci.analysis.obci_signal_processing.tags import tags_file_writer&lt;br /&gt;
from obci.analysis.obci_signal_processing.read_manager import ReadManager&lt;br /&gt;
&lt;br /&gt;
def main(): &lt;br /&gt;
	file_name = 'test1'&lt;br /&gt;
	&lt;br /&gt;
	mgr = ReadManager(&lt;br /&gt;
		file_name + '.obci.xml',&lt;br /&gt;
		file_name + '.obci.raw',&lt;br /&gt;
		file_name + '.obci.tag')&lt;br /&gt;
	&lt;br /&gt;
	tags = mgr.get_tags()&lt;br /&gt;
	for i in xrange(0, len(tags)):&lt;br /&gt;
		if tags[i]['desc']['index'] == tags[i]['desc']['target']:&lt;br /&gt;
			tags[i]['name'] = 'blink_target'&lt;br /&gt;
		else:&lt;br /&gt;
			tags[i]['name'] = 'blink'&lt;br /&gt;
			&lt;br /&gt;
	tags_writer = tags_file_writer.TagsFileWriter(file_name + '.obci.tag')&lt;br /&gt;
	for tag in tags:&lt;br /&gt;
		tags_writer.tag_received(tag)		&lt;br /&gt;
	tags_writer.finish_saving(0)	&lt;br /&gt;
 &lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Aduszyk</name></author>
		
	</entry>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=Pracownia_EEG/Potencja%C5%82y_wywo%C5%82ane&amp;diff=8967</id>
		<title>Pracownia EEG/Potencjały wywołane</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=Pracownia_EEG/Potencja%C5%82y_wywo%C5%82ane&amp;diff=8967"/>
		<updated>2022-11-08T10:05:09Z</updated>

		<summary type="html">&lt;p&gt;Aduszyk: /* Wstęp */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Pracownia EEG|Pracownia EEG]] / Potencjały wywołane&lt;br /&gt;
&lt;br /&gt;
=Wstęp=&lt;br /&gt;
==Potencjały wywołane==&lt;br /&gt;
=== Wstęp ===&lt;br /&gt;
Potencjały wywołane EEG (ang. ''evoked potentials'', EP) są śladami odpowiedzi mózgu na bodźce. W przypadku MEG poprawnie mówi się o polach wywołanych (ang. ''evoked fields'', EF).&lt;br /&gt;
Zwykle reakcja ta jest mała (wyjątek stanowią [[Elektroencefalografia/Metody_analizy_sygnałów_EEG_-_analiza_w_dziedzinie_czasu |kompleksy K]]) i w zapisie pojedynczej realizacji reakcji na bodziec najczęściej niewidoczna wśród czynności pochodzącej od wielu innych procesów zachodzących w tym samym czasie w mózgu. &lt;br /&gt;
Ich wyodrębnienie z tak zwanego tła EEG/MEG, czyli manifestacji elektrycznej innych, trwających w tym samym czasie w mózgu procesów (aktywny prąd niezależny), wymaga w dniu dzisiejszym zapisu odpowiedzi na szereg powtórzeń tego samego bodźca (&amp;lt;xr id=&amp;quot;fig:EP&amp;quot;&amp;gt;rys. %i&amp;lt;/xr&amp;gt;). Pierwsze potencjały wywołane pokazał pod koniec lat 40-tych Dawson (Dawson 1947) wykonując superpozycję pojedynczych realizacji na kliszy fotograficznej.&lt;br /&gt;
Z czasem skomplikowane urządzenia analogowe zastąpione zostały przez cyfrowe uśrednianie kolejnych fragmentów EEG, zsynchronizowanych według momentu wystąpienia bodźca, łatwo realizowane za pomocą komputera.&lt;br /&gt;
&lt;br /&gt;
[[Grafika:EP.png|thumb|640px|center|&amp;lt;figure id=&amp;quot;fig:EP&amp;quot;&amp;gt;&amp;lt;/figure&amp;gt;&lt;br /&gt;
Uśrednianie potencjałów wywołanych. a) ciągły zapis EEG z wyróżnionymi momentami wystąpienia bodźca (w tym przypadku słuchowego) b) kilkadziesiąt kolejnych odcinków, wyciętych jako sekunda EEG od momentu wystąpienia kolejnych bodźców, ustawione jeden pod drugim c) uśredniony potencjał wywołany &amp;amp;mdash; widać m. in. załamek P300 ok. 300 milisekund po bodźcu]]&lt;br /&gt;
&lt;br /&gt;
Techniki te opierają się na założeniu, że zawarta w EEG odpowiedź mózgu na każdy z kolejnych bodźców jest niezmienna, a EEG odzwierciedlające pozostałe procesy traktowane jest jak nieskorelowany z nią proces stochastyczny. Zależnie od rodzaju potencjałów wywołanych, założenia te są mniej lub bardziej nieuzasadnione; podważa je choćby powszechnie znany efekt habituacji, polegający na osłabieniu późnych potencjałów wywołanych kolejnymi powtórzeniami bodźca.&lt;br /&gt;
&lt;br /&gt;
Istota potencjałów wywołanych jest przedmiotem otwartej dyskusji i dziesiątków prac, dotykających od lat podstawowych w tej dziedzinie pytań: czym jest potencjał wywołany, który widzimy w uśrednionym przebiegu? Czy naprawdę wynika z deterministycznie powtarzanej, jednakowej odpowiedzi pojawiającej się po każdym powtórzeniu bodźca niezależnie od &amp;amp;bdquo;tła&amp;amp;rdquo;, czy może wynika z reorganizacji faz tego właśnie &amp;amp;bdquo;tła&amp;amp;rdquo; EEG, czy może kombinacji tych dwóch efektów? Jest to wspaniałe pole dla zastosowań zaawansowanych metod modelowania i analizy sygnałów. W ostatnich latach powstają dziesiątki prac na ten temat, a od czasu do czasu również krytyczne artykuły wykazujące, że dotychczasowe odkrycia są raczej artefaktami stosowanych metod a nie wynikają z własności analizowanych danych (Yeung et al., 2004). Jak widać jest tu wciąż bardzo wiele do zrobienia, gdyż zrozumienie tego mechanizmu stoi na drodze do &amp;amp;bdquo;świętego Graala&amp;amp;rdquo;, którym w tej dziedzinie jest wyodrębnienie pojedynczych potencjałów wywołanych.&lt;br /&gt;
&lt;br /&gt;
Niezależnie od tego, w neurofizjologii klinicznej nazwą potencjał wywołany określa się krzywą widoczną po uśrednieniu odpowiedzi na kilkanaście do kilku tysięcy bodźców (Szelenberger 2000). Gromadzona od dziesięcioleci wiedza o behawioralnych i klinicznych korelatach potencjałów wywołanych opiera się na rozpoznawaniu w przebiegach uśrednionych tak zwanych załamków, czyli przejściowych wzrostów lub spadków potencjału (na przykład na &amp;lt;xr id=&amp;quot;fig:EP&amp;quot;&amp;gt;rys. %i&amp;lt;/xr&amp;gt; widać załamek P300). Nazwy załamków składają się zwykle z litery &amp;amp;bdquo;P&amp;amp;rdquo; (od ang. ''positive''), jeśli wychylenie jest dodatnie, lub &amp;amp;bdquo;N&amp;amp;rdquo; (od ang. ''negative''), jeśli wychylenie jest ujemne, oraz liczby. Uwaga: &lt;br /&gt;
* Nie ma niestety jednej ustalonej konwencji prezentacji potencjałów koniecznie trzeba więc zwracać uwagę na orientację wykresu, a wykonując wykres samemu - zamieszczać informację o orientacji kierunku dodatniego,gdyż kierunek dodatni może być wykresie skierowany do góry lub do dołu. &lt;br /&gt;
* Liczba następująca po N lub P określa przybliżoną liczbę milisekund od wystąpienia bodźca, czyli tak zwaną latencję. Nie można jednak ścisłego związku między tą liczbą a liczbą milisekund np. potencjał P300 w zależności od szczegółów paradygmatu doświadczalnego może wystąpić znacznie później. np. w eksperymentach językowych zdarza się że P300 występuje później niż N400 :-).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;xr id=&amp;quot;fig:zalamki&amp;quot;&amp;gt;Rys. %i&amp;lt;/xr&amp;gt; przedstawia schematycznie najważniejsze załamki rozpoznawane w potencjałach słuchowych, czyli wywoływanych bodźcem dźwiękowym. Dla potencjałów wzrokowych i somatosensorycznych istnieją podobne klasyfikacje.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Grafika:Zalamki.png|thumb|320px|right|&amp;lt;figure id=&amp;quot;fig:zalamki&amp;quot;&amp;gt;&amp;lt;/figure&amp;gt;&lt;br /&gt;
Orientacyjny schemat załamków rozpoznawanych w słuchowych potencjach wywołanych, na podstawie (Szelenberger 2000). Skala czasu logarytmiczna. Najszybsze (do 12 ms) składowe egzogenne to potencjały pniowe (BAEP), oznaczane jako fale I-VII. Litery &amp;amp;bdquo;P&amp;amp;rdquo; i &amp;amp;bdquo;N&amp;amp;rdquo; oznaczają dodatnie i ujemne wychylenia związane z dalszymi załamkami]]&lt;br /&gt;
&lt;br /&gt;
Najszybsze (czyli o najmniejszej latencji) składowe to potencjały egzogenne, odzwierciedlające wstępne fazy przekazu informacji. W potencjałach słuchowych są to potencjały pnia (ang. ''brainstem auditory evoked potentials'', BAEP), składające się z siedmiu fal występujących pomiędzy 1 a 12 ms od bodźca. Są one generowane np. w nerwie słuchowym czy pniu mózgu, i wykorzystywane w klinicznej diagnostyce integralności dróg słuchowych. Podobnie jak inne wczesne potencjały o latencjach poniżej 100 ms, są praktycznie niezależne od stanu uwagi.&lt;br /&gt;
&lt;br /&gt;
Po potencjałach o średniej latencji (między 12 a 50 ms) zaczynają się późne potencjały słuchowe (od 100 ms od podania bodźca), odzwierciedlające bardziej złożone reakcje na bodziec. Potencjały ok. 100 ms obserwowane w okolicach sensorycznych odzwierciedlają odpowiedź tejże kory na bodziec. Ich amplituda zależy od parametrów fizycznych bodźca oraz od uwagi, np. amplituda załamka N100 wzrasta w stanie skupienia uwagi czy pobudzenia emocjonalnego. Pierwszy i najpopularniejszy całkowicie endogenny załamek to P300, pojawiający się po rozpoznaniu bodźca oczekiwanego, na którym skupiamy uwagę: na przykład, jeśli w serii pojawiających się losowo liter mamy zliczać wystąpienia jednej z nich, to na średniej odpowiedzi na pojawienie się tej litery pojawi się załamek P300. Załamek ten występuje również w odpowiedzi na bodźce wyczekiwane, niespodziewane i ważne dla osoby (np. własne imię). &lt;br /&gt;
&lt;br /&gt;
=== Uśrednianie w dziedzinie czasu ===&lt;br /&gt;
Jak już było wspomniane powyżej podstawową techniką stosowaną do analizy potencjałów wywołanych jest uśrednianie wielu realizacji odpowiedzi na bodziec wyrównanych względem jakiegoś charakterystycznego zdarzenia, np. momentu podania bodźca albo momentu behawioralnej reakcji na bodziec (np. wciśnięcie przycisku). Podejście to bazuje na trzech założeniach:&lt;br /&gt;
* Reakcja jest czasowo związana z bodźcem. Tzn. w kolejnych realizacjach występuje ona zawsze z tym samym opóźnieniem.&lt;br /&gt;
* Reakcja na bodziec skutkuje zawsze pojawieniem się w sygnale składowej o stałym kształcie (mówimy o stałej morfologii).&lt;br /&gt;
* Spontaniczna czynność EEG &amp;amp;mdash; ta która nie dotyczy przetwarzania interesującego nas bodźca &amp;amp;mdash; jest niezależnym, stacjonarnym szumem o średniej zero.&lt;br /&gt;
&lt;br /&gt;
Zgodnie z powyższymi założeniami mierzony w ''i''-tej realizacji sygnał można wyrazić jako:&lt;br /&gt;
: &amp;lt;math&amp;gt;x_i(t) = s(t) + n_i(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
Uśrednianie po ''N'' realizacjach daje:&lt;br /&gt;
: &amp;lt;math&amp;gt;\bar x (t) = \frac{1}{N} \sum_{i=1}^N x_i(t) = \frac{1}{N} \left(N s(t) + \sum_{i=1}^N n_i(t) \right) &amp;lt;/math&amp;gt;&lt;br /&gt;
Wartość oczekiwana średniego sygnału wynosi:&lt;br /&gt;
: &amp;lt;math&amp;gt;\mathrm{E}\left[ \bar x(t) \right] = s(t) &amp;lt;/math&amp;gt;&lt;br /&gt;
gdyż dla szumu o średniej zero mamy:&lt;br /&gt;
: &amp;lt;math&amp;gt;\mathrm{E}\left[\frac{1}{N} \sum_{i=1}^N n_i(t)\right] = 0&amp;lt;/math&amp;gt;.&lt;br /&gt;
Wariancja &amp;lt;math&amp;gt;\bar x(t)&amp;lt;/math&amp;gt; wynosi:&lt;br /&gt;
: &amp;lt;math&amp;gt;\sigma^2_{\bar x(t)} = \mathrm{E} \left[  \left( \frac{1}{N} \sum_{i=1}^N n_i(t)\right)^2 \right] \approx \frac{1}{N} \sigma^2_{n(t)}&amp;lt;/math&amp;gt;&lt;br /&gt;
gdyż &amp;lt;math&amp;gt;s(t)&amp;lt;/math&amp;gt; jest deterministyczne. &lt;br /&gt;
&lt;br /&gt;
Dla potencjałów pojawiających się w pierwszych kilkudziesięciu milisekundach po bodźcu model ten można uznać za poprawny, gdyż wykazują one zależność głównie od parametrów fizycznych bodźca. Dla późniejszych składowych staje się on coraz bardziej wątpliwy ze względu na występujące korelacje ze stanem (np. uwagi) badanego.&lt;br /&gt;
&lt;br /&gt;
Dla późniejszych składowych można by postulować bardziej ogólną wersję modelu potencjału wywołanego:&lt;br /&gt;
: &amp;lt;math&amp;gt;x_i(t) = s_i(t) + n_i(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
Ten model uwidacznia, że do opisu potencjału wywołanego potrzebna jest nie tylko średnia, ale i wyższe momenty rozkładu (np. drugi moment centralny czyli wariancja).&lt;br /&gt;
&lt;br /&gt;
====Wariancja w przypadku szumu skorelowanego ====&lt;br /&gt;
W poprzednim paragrafie pokazaliśmy, że w przypadku niezależnego szumu wariancja uśrednionego sygnału (w danej chwili czasu) maleje jak  &amp;lt;math&amp;gt;\frac{1}{N}&amp;lt;/math&amp;gt;. Jednak w przypadku gdy kolejne próbki szumu są skorelowane (np. występuje silna aktywność rytmiczna alfa) sytuacja się komplikuje. Intuicyjnie łatwo możemy to sobie wyobrazić w granicznym przypadku. Załóżmy, że tło dla  potencjałów o stałej morfologii   stanowi sinusoida. Jeśli będziemy podawać bodźce w odstępach będących wielokrotnością okresu tej sinusoidy to w uśrednianych fragmentach sygnału owa sinusoida jest tak samo powtarzalna jak badany potencjał i uśrednianie nie prowadzi do poprawy stosunku amplitudy sygnału do amplitudy tła. &lt;br /&gt;
&lt;br /&gt;
Stopień zależności pomiędzy próbkami można zmierzyć przy pomocy funkcji autokorelacji. &lt;br /&gt;
Jeśli funkcję autokorelacji przybliżymy przez:&lt;br /&gt;
: &amp;lt;math&amp;gt;R_{xx}(\tau) = \sigma^2 \exp(-\beta |\tau|) \cos(2 \pi f_0 \tau)&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\sigma^2&amp;lt;/math&amp;gt; jest wariancją szumu, &amp;lt;math&amp;gt;f_0&amp;lt;/math&amp;gt; jest średnią częstością aktywności rytmicznej, &amp;lt;math&amp;gt;\beta/ \pi&amp;lt;/math&amp;gt; jest szerokością pasma tej czynności, zaś &amp;lt;math&amp;gt;\tau&amp;lt;/math&amp;gt; opóźnieniem, to wariancję potencjału wywołanego można wyrazić jako&amp;lt;!-- \cite{Spekreijse_1976}--&amp;gt;:&lt;br /&gt;
: &amp;lt;math&amp;gt;\sigma^2_{\bar x(t)} = \frac{\sigma^2}{N} \left[ \frac{1-\exp(-2 \beta T)}{1 - 2 \exp(- \beta T) \cos(2 \pi f_0 T) +\exp(-2 \beta T)} \right]&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; jest odstępem między bodźcami. &lt;br /&gt;
Widać stąd, że obecność czynności rytmicznej w tle wpływa na stosunek sygnału do szumu. Z powyższego równania widać, że stosunek wariancji dąży do &amp;lt;math&amp;gt;\frac{\sigma^2}{N}&amp;lt;/math&amp;gt; gdy &amp;lt;math&amp;gt;\beta T&amp;lt;/math&amp;gt; staje się duże.  &lt;br /&gt;
&lt;br /&gt;
Periodyczna stymulacja może ponadto prowadzić do wzbudzenia czynności rytmicznej o częstości równej częstości pobudzania bądź jej harmonicznej.&lt;br /&gt;
&lt;br /&gt;
===Wariancja latencji===&lt;br /&gt;
&lt;br /&gt;
Jedną z form zmienności potencjału wywołanego w pojedynczych realizacjach jest wariancja latencji. &lt;br /&gt;
[[Grafika:Wariancja_latencji.png|thumb|500px|right|&lt;br /&gt;
Czerwona linia: Uśrednianie 100 potencjałów wywołanych o latncjach z rozkładu normalnego N(300,30 ), Niebieskie linie: przykładowe pojedyncze realizacje wzięte do średniej]]&amp;lt;!--# -*- coding: utf-8 -*-&lt;br /&gt;
from __future__ import division&lt;br /&gt;
import numpy as np&lt;br /&gt;
from matplotlib.pyplot import plot, show ,subplot, figure, title, xlabel, ylabel, ylim&lt;br /&gt;
 &lt;br /&gt;
def fun(t,lat=100):&lt;br /&gt;
    return np.exp(-(t-lat)**2/(2*30**2))&lt;br /&gt;
Fs = 1&lt;br /&gt;
N = 100&lt;br /&gt;
t = np.arange(0,700)&lt;br /&gt;
f = np.zeros((N,700))&lt;br /&gt;
f_sr = np.zeros(t.shape)&lt;br /&gt;
for i in range(N):&lt;br /&gt;
    f[i,:] = fun(t,lat = 300 + 30* np.random.randn())&lt;br /&gt;
for i in range(3):&lt;br /&gt;
    plot(t,f[i,:], 'b')&lt;br /&gt;
plot(t,f.mean(0),'r')&lt;br /&gt;
show()--&amp;gt;&lt;br /&gt;
Zmienność latencji prowadzi do:&lt;br /&gt;
* zmniejszenia amplitudy &amp;lt;math&amp;gt;\bar x&amp;lt;/math&amp;gt;&lt;br /&gt;
* wzrostu rozciągłości czasowej załamka&lt;br /&gt;
&lt;br /&gt;
O tych konsekwencjach zmienności latencji należy w szczególności pamiętać porównując średnie potencjały uzyskane w różnych warunkach eksperymentalnych. Gdy zauważymy, że średnie potencjały różnią się amplitudą należy rozważyć możliwość, że w istocie warunki eksperymentalne wpływają na różnice w wariancji latencji. &lt;br /&gt;
&lt;br /&gt;
Naturalne jest, że zmienność latencji jest bardziej widoczna w przypadku załamków trwających krótko niż w przypadku załamków trwających długo. Wariancja latencji rożnie wraz z jej wartością, stąd wśród późnych składowych potencjałów wywołanych nie obserwuje się komponentów krótkotrwałych.&lt;br /&gt;
&amp;lt;!--====Uśrednianie metodą Woody'ego ====&lt;br /&gt;
&lt;br /&gt;
Model potencjału ze zmienną latencją i sposób na jego efektywniejsze uśrednianie zaproponował Woody (1967). Model ten zakłada, że w każdej realizacji występuje komponent addytywny &amp;lt;math&amp;gt;s_i(t)\;&amp;lt;/math&amp;gt;, który co do kształtu jest stały, a pomiędzy realizacjami różni się tylko latencją:&lt;br /&gt;
: &amp;lt;math&amp;gt; s_i(t) = s(t +\Delta t_i)\;&amp;lt;/math&amp;gt;&lt;br /&gt;
Woody zaproponował aby &amp;lt;math&amp;gt;\Delta t_i\;&amp;lt;/math&amp;gt; szacować na podstawie maksimum funkcji korelacji wzajemnej pomiędzy ''i''-tą realizacją a wzorcem. W pierwszym kroku wzorcem jest średni potencjał uzyskany przez proste uśrednienie realizacji.  Następnie w sposób iteracyjny dokonuje się:&lt;br /&gt;
* poprawek w wyrównaniu poszczególnych realizacji,&lt;br /&gt;
* obliczenia nowego wzorca poprzez uśrednienie realizacji po korekcie wyrównania,&lt;br /&gt;
* obliczenia nowych poprawek do wyrównania realizacji.--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Habituacja ===&lt;br /&gt;
Zmienność w odpowiedziach na kolejno występujące po sobie bodźce można podzielić na komponent stochastyczny i deterministyczny. Komponent deterministyczny odzwierciedla zmianę czułości  układu nerwowego  na kolejne bodźce. Nowy bodziec często wywołuje reakcje pobudzenia widoczną w wielu parametrach takich jak przewodnictwo skóry, rytm serca i reaktywność kory mózgowej. Powszechnie obserwowanym zjawiskiem jest spadek reaktywności na powtarzające się bodźce zwany habituacją. Niekiedy obserwuje się także zjawisko przeciwne &amp;amp;mdash; wzrost reaktywności na bodziec &amp;amp;mdash; zwane sensytyzacją. &lt;br /&gt;
&lt;br /&gt;
Klasycznym sposobem na badanie tych zjawisk w potencjałach wywołanych jest uśrednianie w podzbiorach lub  uśrednianie blokowe. Wymaga ono  zmiany paradygmatu rejestracji danych. Załóżmy, że interesującym nas bodźcem jest błysk światła. Chcemy zaobserwować ewentualne zmiany amplitudy i latencji w ciągu 100 potencjałów będących reakcją na błysk powtarzający się co 500 ms.&lt;br /&gt;
====Uśrednianie w podzbiorach ====&lt;br /&gt;
W metodzie tej musimy założyć, że proces habituacji jest powolny, tzn. zmiany pomiędzy kolejnymi reakcjami są bardzo małe. W takim przypadku możemy podzielić długą serię bodźców na ciąg pod-serii i uśrednienie przeprowadzić dla każdej pod-serii osobno.&lt;br /&gt;
[[Plik:Usrednianie_podzbiory.svg‎|640px|thumb|center|Ilustracja uśredniania w podzbiorach]]&lt;br /&gt;
&lt;br /&gt;
====Uśrednianie blokowe====&lt;br /&gt;
W tym celu eksperyment wykonujemy w wielu seriach. Jedna seria składa się ze 100 błysków powtarzanych co 500 ms.  Po serii następuje przerwa trwająca np. 5 s (długość przerwy wyraża nasze oszacowanie czasu potrzebnego na zanik habituacji). Po przerwie seria jest powtarzana. Powtórzeń serii wykonujemy ''N''.&lt;br /&gt;
Następnie uśredniamy fragmenty sygnałów odpowiadające sobie w kolejnych seriach. &lt;br /&gt;
&lt;br /&gt;
W tym paradygmacie zakładamy, że każda seria rejestrowana jest w tych samych warunkach. Zaniedbujemy efekty związane ze zmęczeniem i zmianami w np. stopniu koncentracji badanego.&lt;br /&gt;
[[Plik:Usrednianie blokowe.svg|Usrednianie blokowe.svg|640px|thumb|center|Ilustracja uśredniania w blokach]]&lt;br /&gt;
&lt;br /&gt;
===Załamki w krzywej potencjału wywołanego vs ukryte komponenty===&lt;br /&gt;
Komponenta potencjału wywołanego to bardzo ważne ale jednocześnie źle określone pojęcie. Krzywa otrzymana w wyniku uśredniania potencjałów wywołanych przedstawia serię załamków dodatnich i ujemnych, ale trzeba być świadomym, że ten przebieg napięcia rejestrowany przez elektrody przedstawia tak naprawdę sumę potencjałów pochodzących od wielu dość niezależnie działających źródeł w mózgu. Przyczynek pochodzący od jednego funkcjonalnego źródła będziemy określać jako komponentę. &lt;br /&gt;
&lt;br /&gt;
Komentarza wymaga też pojęcie źródła funkcjonalnego. Czynność elektryczną synchronicznie działających neuronów piramidalnych w określonym fragmencie kory mózgowej z pewnej odległości można przybliżyć potencjałem dipola prądowego. Taki aktywny fragment kory stanowi źródło dające przyczynek do mierzonego na powierzchni głowy potencjału. W najprostszej sytuacji taki przyczynek może być obserwowany jako komponenta. Mózg jest jednak obiektem niezwykle złożonym i gęsto połączonym. Wiele obszarów korowych może być funkcjonalnie połączonych i aktywowanych synchronicznie w celu realizacji określonego zadania &amp;amp;mdash; o takim funkcjonalnym zespole też możemy myśleć jako o pojedynczym źródle, choć może ono mieć złożoną strukturę przestrzenną. Często zatem myślimy o komponentach ukrytych potencjału wywołanego jako o aktywności takich funkcjonalnych zespołów. &lt;br /&gt;
&lt;br /&gt;
Po tym wstępie widać już chyba, że do zrozumienia co dzieje się w czasie reakcji na bodziec, którą obserwujemy w potencjale wywołanym, bardziej pożądane byłoby badanie komponent ukrytych niż poszczególnych załamków krzywej potencjału wywołanego, która stanowi ważoną sumę owych komponentów. Zanim przejdziemy do omówienia technik służących &amp;amp;bdquo;wyłuskiwaniu&amp;amp;rdquo; komponent prześledźmy kilka symulacji i wnioski z nich płynące.&lt;br /&gt;
&lt;br /&gt;
==== Załamki i komponenty nie są tym samym.====&lt;br /&gt;
Tę samą krzywą można otrzymać na nieskończenie wiele sposobów  przez sumowanie rożnych kombinacji domniemanych komponentów. Przykładowy rysunek pokazuje, jak tę samą krzywą można złożyć z dwóch rożnych zestawów komponentów (kod wytwarzający przykładową symulację pokazany jest poniżej).&lt;br /&gt;
[[Plik:Sumowanie_komponentow1.png|center|thumb|600px| Panel a) przedstawia hipotetyczną krzywą ERP, panel b) jedna z możliwych dekompozycji sygnału w panelu a), panel c) inna możliwa dekompozycja sygnału z panelu a) ]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
from __future__ import division&lt;br /&gt;
import numpy as np&lt;br /&gt;
from matplotlib.pyplot import plot, show ,subplot, figure, title, xlabel, ylabel, ylim&lt;br /&gt;
&lt;br /&gt;
Fs = 1&lt;br /&gt;
t = np.arange(0,700)&lt;br /&gt;
&lt;br /&gt;
C1 = np.exp(-(t-100)**2/(2*30**2))&lt;br /&gt;
C2 = np.exp(-(t-200)**2/(2*50**2))&lt;br /&gt;
C3 = np.exp(-(t-350)**2/(2*100**2))&lt;br /&gt;
ERP = 0.5*C1-C2+C3&lt;br /&gt;
&lt;br /&gt;
C2p = np.concatenate((C2[0:200], np.ones(30), C2[200:700-30] ))&lt;br /&gt;
C3p = ERP - 0.5*C1 + C2p&lt;br /&gt;
ERP_v2 = 0.5*C1-C2p+C3p&lt;br /&gt;
&lt;br /&gt;
subplot(3,1,1)&lt;br /&gt;
plot(t,ERP, t[::10],ERP_v2[::10],'g.')&lt;br /&gt;
ylabel('a)',rotation='horizontal')&lt;br /&gt;
ylim([-1, 1.5])&lt;br /&gt;
&lt;br /&gt;
subplot(3,1,2)&lt;br /&gt;
plot(t,0.5*C1,t,-C2,t,C3)&lt;br /&gt;
ylabel('b)',rotation='horizontal')&lt;br /&gt;
ylim([-1, 1.5])&lt;br /&gt;
&lt;br /&gt;
subplot(3,1,3)&lt;br /&gt;
plot(t,0.5*C1,t,-C2p,t,C3p)&lt;br /&gt;
ylabel('c)',rotation='horizontal')&lt;br /&gt;
ylim([-1, 1.5])&lt;br /&gt;
&lt;br /&gt;
show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Zmiana jednej komponenty może powodować zmiany w amplitudzie i latencji więcej niż jednego załamka.====&lt;br /&gt;
Poniższy rysunek przedstawia sytuację gdy zmiana amplitudy jednego komponentu może znacząco wpływać na amplitudę i latencję innych załamków.&lt;br /&gt;
&lt;br /&gt;
[[Plik:Sumowanie_komponentow2.png|center|thumb|768px| Panel a) przedstawia dwie hipotetyczne krzywe ERP, panel b) panel b i c komponenty z których powstały owe krzywe. Zmiana amplitudy komponentu oznaczonego kolorem powoduje zmianę amplitudy oznaczonych załamków ale także zmianę latencji wcześniejszego załamka. ]]&lt;br /&gt;
Poniżej kod odtwarzający powyższy przykład:&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
from __future__ import division&lt;br /&gt;
import numpy as np&lt;br /&gt;
from matplotlib.pyplot import plot, show, subplot, figure, title, xlabel, ylabel, ylim&lt;br /&gt;
&lt;br /&gt;
Fs = 1&lt;br /&gt;
t = np.arange(0,700)&lt;br /&gt;
&lt;br /&gt;
C1 = np.exp(-(t-100)**2/(2*30**2))&lt;br /&gt;
C2 = np.exp(-(t-200)**2/(2*50**2))&lt;br /&gt;
C3 = np.exp(-(t-350)**2/(2*100**2))&lt;br /&gt;
ERP1 = 0.5*C1-C2+C3&lt;br /&gt;
ERP2 = 0.5*C1-C2+1.5*C3&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
subplot(3,1,1)&lt;br /&gt;
plot(t,ERP1,'b', t,ERP2,'g')&lt;br /&gt;
plot(t[np.argmin(ERP1)],np.min(ERP1),'r.' )&lt;br /&gt;
plot(t[np.argmax(ERP1)],np.max(ERP1),'m.' )&lt;br /&gt;
plot(t[np.argmin(ERP2)],np.min(ERP2),'r.' )&lt;br /&gt;
plot(t[np.argmax(ERP2)],np.max(ERP2),'m.' )&lt;br /&gt;
&lt;br /&gt;
ylabel('a)',rotation='horizontal')&lt;br /&gt;
ylim([-1, 1.6])&lt;br /&gt;
&lt;br /&gt;
subplot(3,1,2)&lt;br /&gt;
plot(t,0.5*C1,'k',t,-C2,'k',t,C3,'b')&lt;br /&gt;
ylabel('b)',rotation='horizontal')&lt;br /&gt;
ylim([-1, 1.6])&lt;br /&gt;
&lt;br /&gt;
subplot(3,1,3)&lt;br /&gt;
plot(t,0.5*C1,'k',t,-C2,'k',t,1.5*C3,'g')&lt;br /&gt;
ylabel('c)',rotation='horizontal')&lt;br /&gt;
ylim([-1, 1.6])&lt;br /&gt;
&lt;br /&gt;
show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Instrukcje do ćwiczeń =&lt;br /&gt;
&lt;br /&gt;
==Zadanie 1: uśrednianie symulowanych sygnałów==&lt;br /&gt;
w tym ćwiczeniu chcemy pokazać efekty:&lt;br /&gt;
# uśredniania sygnałów związanych fazowo z bodźcem i nieskorelowanych z bodźcem / wpływ liczby realizacji,&lt;br /&gt;
# uśredniania sygnałów z fluktuacją latencji,&lt;br /&gt;
# wpływ filtrów o różnych funkcjach odpowiedzi impulsowej na morfologię uśrednionego potencjału.&lt;br /&gt;
&lt;br /&gt;
===Sygnały testowe===&lt;br /&gt;
Proszę zaimplementować funkcje generujące następujące przebiegi czasowe (oznaczenia: ''F&amp;lt;sub&amp;gt;s&amp;lt;/sub&amp;gt;'' &amp;amp;mdash; częstość próbkowania, ''T'' &amp;amp;mdash; czas trwania w sekundach, [[%C4%86wiczenia_1#Sygna.C5.82y_testowe|analogicznie do tego]]):&lt;br /&gt;
* sinusoida o zadanej częstości ''f'' i fazie &amp;lt;math&amp;gt;\phi&amp;lt;/math&amp;gt;: &amp;lt;tt&amp;gt;y = sin(f, phi, Fs, T)&amp;lt;/tt&amp;gt;,&lt;br /&gt;
* funkcja Gaussa o zadanym położeniu i szerokości &amp;lt;tt&amp;gt;y = g_1(t0, sigma, Fs, T) &amp;lt;/tt&amp;gt;&lt;br /&gt;
: &amp;lt;math&amp;gt;g_1(t) = \exp\left(-\frac{(t-t_0)^2}{2 \sigma^2}\right)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* pochodną funkcji Gaussa o zadanym położeniu i szerokości &amp;lt;tt&amp;gt;y = g_2(t0, sigma, Fs, T)&amp;lt;/tt&amp;gt;,&lt;br /&gt;
* połowę funkcji Gaussa o zadanym położeniu i szerokości &amp;lt;tt&amp;gt;y = g_3(t0, sigma, Fs, T)&amp;lt;/tt&amp;gt;,&lt;br /&gt;
: &amp;lt;math&amp;gt;g_{3}(t) = \left\{ &lt;br /&gt;
\begin{array}{lll}&lt;br /&gt;
0 &amp;amp; \mathrm{dla}&amp;amp; t&amp;lt;t_0 \\&lt;br /&gt;
\exp\left(-\frac{(t-t_0)^2}{2 \sigma^2}\right)&amp;amp; \mathrm{dla}&amp;amp; t \ge t_0  &lt;br /&gt;
\end{array}&lt;br /&gt;
\right. &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
W dalszych zadaniach tej sekcji przyjmiemy:&lt;br /&gt;
* ''T'' = 1 s,&lt;br /&gt;
* ''F&amp;lt;sub&amp;gt;s&amp;lt;/sub&amp;gt;'' = 128 Hz,&lt;br /&gt;
* ''t''&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; = 0,3 s,&lt;br /&gt;
* &amp;amp;sigma; = 0,02 s.&lt;br /&gt;
&lt;br /&gt;
===Uśrednianie w modelu addytywnym: sygnał + szum===&lt;br /&gt;
Dla funkcji &amp;lt;math&amp;gt;g_1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;g_2&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;g_3&amp;lt;/math&amp;gt;  wykonaj ''N'' symulacji sygnału opisanego daną funkcją z dodanym szumem gaussowskim (&amp;lt;tt&amp;gt;numpy.random.randn&amp;lt;/tt&amp;gt;). Zaobserwuj zmianę wariancji uśrednianego sygnału wraz z ''N''.&lt;br /&gt;
&lt;br /&gt;
===Uśrednianie w modelu addytywnym: sygnał + szum + niezależna czynność rytmiczna===&lt;br /&gt;
Powtórz poprzednie symulacje dokładając w każdej realizacji sinusoidę o losowo wybranej fazie. Symulacje wykonaj dla różnych częstości sinusoidy, takich których połówka okresu zbliżona jest do szerokości funkcji Gaussa, oraz znacząco od niej różnych.&lt;br /&gt;
&lt;br /&gt;
===Uśrednianie w modelu z resetem fazy===&lt;br /&gt;
Zbuduj sygnał składający się z dwóch fragmentów sinusoidy o częstości ''f'': &lt;br /&gt;
* pierwszy fragment ma losową fazę,&lt;br /&gt;
* drugi fragment ma fazę równą 0.&lt;br /&gt;
Wykonaj ''N'' realizacji takiego sygnału, przy czym każda realizacja ma częstość losowaną z rozkładu Gaussa o średniej 10 i pewnej wariancji (czyli &amp;lt;math&amp;gt;f \in \mathrm{N}(10,\sigma)&amp;lt;/math&amp;gt;). &lt;br /&gt;
Uśrednij otrzymane realizacje. Zaobserwuj zależność średniej od liczby uśrednianych realizacji i od wariancji częstości.&lt;br /&gt;
&lt;br /&gt;
===Uśrednianie potencjału z fluktuacją latencji===&lt;br /&gt;
Wygeneruj sygnały składające się z funkcji &amp;lt;math&amp;gt;g_1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;g_2&amp;lt;/math&amp;gt; albo &amp;lt;math&amp;gt;g_3&amp;lt;/math&amp;gt; z fluktuującą latencją, tzn. z wartością &amp;lt;math&amp;gt;t_0&amp;lt;/math&amp;gt; pochodzącą z jakiegoś rozkładu prawdopodobieństwa. U nas dla ustalenia uwagi niech będzie to rozkład Gaussa. Wykonaj zestaw symulacji obrazujący zależność od liczby realizacji i od wielkości fluktuacji, mierzonej przez wariancję rozkładu. Czy jest związek pomiędzy wariancją fluktuacji &amp;lt;math&amp;gt;t_0&amp;lt;/math&amp;gt; a szerokością załamków?&lt;br /&gt;
&lt;br /&gt;
===Wpływ filtrów===&lt;br /&gt;
# Zaprojektuj następujące filtry (przyjmij częstość próbkowania 128 Hz):&lt;br /&gt;
#* dolnoprzepustowy: Butterwortha z częstością odcięcia: 30, 40, 50 Hz, i rzędach od 1 do 5 (funkcja butter w module scipy.signal),&lt;br /&gt;
#* górnoprzepustowy: Butterwortha z częstością odcięcia: 0,1, 0,5, 2 i 5 Hz, i rzędach od 1 do 5,&lt;br /&gt;
#* notch: Czybyszewa II rodzaju z pasmem zaporowym ustawionym na 50 Hz, i rzędach od 1 do 3 (funkcja cheby2),&lt;br /&gt;
# Zbadaj funkcję odpowiedzi impulsowej i funkcję przenoszenia tych filtrów (w skali dB). Zaobserwuj jak długa jest odpowiedź impulsowa i jak daleko od częstości odcięcia zaburzone jest pasmo przenoszenia.&lt;br /&gt;
# Zastosuj powyższe filtry do funkcji &amp;lt;math&amp;gt;g_1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;g_2&amp;lt;/math&amp;gt; albo &amp;lt;math&amp;gt;g_3&amp;lt;/math&amp;gt;. Filtrowanie przeprowadź w jedną (lfilter) oraz w dwie strony (filtfilt). Zaobserwuj związek między zniekształceniem wprowadzanym przez filtr a funkcją odpowiedzi impulsowej filtru.&lt;br /&gt;
# W ćwiczeniu tym posłuż się symulowanymi sygnałami uzyskanymi z modelu addytywnego: &amp;amp;bdquo;sygnał+szum&amp;amp;rdquo;. Dla funkcji &amp;lt;math&amp;gt;g_1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;g_2&amp;lt;/math&amp;gt; albo &amp;lt;math&amp;gt;g_3&amp;lt;/math&amp;gt;  wykonaj ''N'' = 60 realizacji sygnału opisanego daną funkcją z dodanym szumem gaussowskim (&amp;lt;tt&amp;gt;numpy.random.randn&amp;lt;/tt&amp;gt;). Każdą z realizacji przefiltruj, a następnie uśrednij uzyskane sygnały.&lt;br /&gt;
&lt;br /&gt;
==Zadanie 2: rejestracje i analiza potencjałów wzrokowych==&lt;br /&gt;
&lt;br /&gt;
===Synchronizacja występowania bodźców z sygnałem EEG===&lt;br /&gt;
&lt;br /&gt;
Rejestracja potencjałów wywołanych jest przykładem pomiaru czynności elektrycznej mózgu w odpowiedzi na określony bodziec. W przypadku tego rodzaju pomiarów konieczna jest synchronizacja momentu wystąpienia bodźca z sygnałem EEG. Wzmacniacze do pomiaru czynności elektrycznej mózgu wyposażone są w specjalne wejścia, na które można podawać sygnał odpowiadający pojawianiu się bodźca. Jak pamiętamy z zeszłego semestru, wejście to (jak i podawany na nie sygnał) nazywamy trigerem (ang. ''trigger'' &amp;amp;mdash; spust, cyngiel, wyzwalacz). W najprostszym przypadku, bodziec moglibyśmy wyświetlać na monitorze komputerowym, a sygnał związany z jego wystąpieniem wysyłać przez któryś z portów komputera (LPT, COM) na wzmacniacz EEG. Niestety, obecnie dostępne i popularne systemy operacyjne, takie jak Windows czy Linux nie są systemami czasu rzeczywistego (http://pl.wikipedia.org/wiki/System_operacyjny_czasu_rzeczywistego). Od momentu wyświetlania bodźca na ekranie, do pojawiania się sygnału odpowiednim porcie komputerowym może upłynąć kilkadziesiąt milisekund i co gorsza czas ten zwykle jest losowy. W przypadku gdy wzmacniacz próbkuje sygnał z częstością 1000 Hz, moment wystąpienia bodźca możemy określić z dokładnością 1 ms, jednakże wspomniane opóźnienia w systemie operacyjnym uniemożliwiają to. Ponadto, jak dowiedzieliśmy się w rozdziale wstępnym [http://brain.fuw.edu.pl/edu-wiki/action/edit/EEG:Potencja%C5%82y_wywo%C5%82ane?section=T-1], pierwsze załamki związane z potencjałami wywołanymi pojawiają się już 10 ms po wystąpieniu bodźca. W związku z tym, losowe, rzędu kilkudziesięciu milisekund opóźnienia sygnału określającego moment pojawienia się bodźca względem jego rzeczywistego wystąpienia są niedopuszczalne.&lt;br /&gt;
Istnieją pewne techniki programowania, dzięki którym opisywane opóźnienia można zmniejszyć, jednakże są one bardzo trudne  do realizacji. Ponadto, standardowe porty komputera, takie jak LPT, czy COM zostały zaprojektowane przede wszystkim do sterowania urządzeniami zewnętrznymi, a nie ich zasilania. Przykładowo, jedna linia portu drukarkowego (LPT) może być obciążona prądem nie większym niż 5 mA, podczas gdy do zapalenie zwykłej diody LED potrzeba około 10 mA. Taki pobór prądu możliwy jest do uzyskania z portu USB, jednakże  jest on  wyjątkowo trudny do oprogramowania.  &lt;br /&gt;
W celu ominięcia powyższych niedogodności w Zakładzie Fizyki Biomedycznej UW w przeprowadzanych eksperymentach wykorzystywane są  mikrokontrolery [http://pl.wikipedia.org/wiki/Mikrokontroler], w szczególności ATmega16 i ATmega32.  Mikrokontrolery te wyposażone są w procesory o architekturze RISC [http://pl.wikipedia.org/wiki/RISC] i mocy obliczeniowej porównywalnej z szeroko stosowanym kiedyś w komputerach ZX Spectrum, Commodore, Amiga i Atari procesorem Z80. Oprócz jednostki centralnej mikrokontrolery zawierają   stałą pamięć FLASH przeznaczoną do przechowywania kodu programu, pamięć  RAM i pamięć EEPROM, liczniki 8- i 16-bitowe, komparatory, przetworniki analogowo-cyfrowe, porty wejścia/wyjścia, łącze RS232 (popularnie nazywane portem szeregowym) i układy przerwań.&lt;br /&gt;
&lt;br /&gt;
Mikrokontrolery wchodzące w skład zestawów pomiarowych na Pracowni EEG zawierają program, który umożliwia komunikację z nimi poprzez port szeregowy. Obecnie, komputery są coraz rzadziej wyposażane w porty szeregowe. Standard komunikacji RS-232, opracowany w 1962 roku  nadal jest jednak popularny i często wykorzystywany do komunikacji miedzy urządzeniami.  W celu połączenia komputera posiadającego tylko porty USB z mikrokontrolerem zastosowano przejściówkę USB/RS-232. &lt;br /&gt;
&lt;br /&gt;
Jak każde urządzenie w systemie Linuks, przejściówka USB/RS-232 widoczna jest jako plik, znajdujący się w katalogu &amp;lt;tt&amp;gt;/dev&amp;lt;/tt&amp;gt;. Nazwy plików obsługujących urządzenia szeregowe to &amp;lt;tt&amp;gt;ttyXY&amp;lt;/tt&amp;gt;, gdzie &amp;lt;tt&amp;gt;XY&amp;lt;/tt&amp;gt; to kolejny numer przydzielony do urządzenia szeregowego.&lt;br /&gt;
Do komunikacji komputera z mikroknotrolerem  w Zakładzie Fizyki Biomedycznej UW została napisana prosta biblioteka.  Jej użycie jest następujące:&lt;br /&gt;
* Po podłączeniu przejściówki USB/RS232 do komputera mikrokontrolera sprawdź jaki plik w katalogu &amp;lt;tt&amp;gt;/dev&amp;lt;/tt&amp;gt; został utworzony i przydzielony do urządzenia. &lt;br /&gt;
* Zaimportuj bibliotekę do komunikacji z mikrokontrolerem: &lt;br /&gt;
: &amp;lt;tt&amp;gt;import SerialPort as SP&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Otwórz plik powiązany z urządzeniem zewnętrznym:&lt;br /&gt;
: &amp;lt;tt&amp;gt;sp = SP.SerialPort(nazwa_pliku) &amp;lt;/tt&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
: &amp;lt;tt&amp;gt;sp.open()&amp;lt;/tt&amp;gt;&lt;br /&gt;
W naszym przypadku prawidłowa nazwa pliku to &amp;lt;tt&amp;gt;/dev/ttyUSB0&amp;lt;/tt&amp;gt;.&lt;br /&gt;
* Po włączeniu zasilania mikrokontrolera, diody podłączone do niego i wykorzystywane w eksperymencie z potencjałami wywołanymi będą zapalone. Następujące polecenie zgasi obydwie diody:&lt;br /&gt;
: &amp;lt;tt&amp;gt;sp.blinkP300([0, 0])&amp;lt;/tt&amp;gt;&lt;br /&gt;
* Wydanie poniższego polecenia spowoduje, iż mikrokontroler zapali podłączoną do niego diodę numer 1 na czas 100 ms, zaś diodę numer 2 na 200 ms. Jednocześnie, w momencie włączenia jak i wyłączenia diody, sygnał z mikrokontrolera zostanie wysłany na 5-stykowe wejście AUX mikrokontrolera:&lt;br /&gt;
: &amp;lt;tt&amp;gt;sp.blinkP300([100, 200])&amp;lt;/tt&amp;gt;&lt;br /&gt;
* Jeśli chcemy zapalić tylko diodę numer dwa, np. na czas 500 ms w programie podajemy następującą instrukcję:&lt;br /&gt;
: &amp;lt;tt&amp;gt;sp.blinkP300([0, 500])&amp;lt;/tt&amp;gt;&lt;br /&gt;
* Jeśli chcemy zakończyć komunikację z mikrokontrolerem piszemy:&lt;br /&gt;
: &amp;lt;tt&amp;gt;sp.close()&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Kod biblioteki do komunikacji z mikrokontrolerem:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;!--  Kod w Pythonie 2&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# -*- coding: cp1250 -*-&lt;br /&gt;
import serial&lt;br /&gt;
import logging&lt;br /&gt;
import sys&lt;br /&gt;
import os&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def to_hex_word(a):&lt;br /&gt;
    '''encodes a decimal number hexadecimally on two bytes'''&lt;br /&gt;
    return chr(a%256) + chr(a/256)&lt;br /&gt;
&lt;br /&gt;
class SerialPort(object):&lt;br /&gt;
    def __init__(self, port_name):&lt;br /&gt;
        import serial&lt;br /&gt;
        try:&lt;br /&gt;
            self.port = serial.Serial(&lt;br /&gt;
                port=port_name,&lt;br /&gt;
                baudrate=9600,&lt;br /&gt;
                bytesize=serial.EIGHTBITS,&lt;br /&gt;
                parity=serial.PARITY_NONE,&lt;br /&gt;
                stopbits=serial.STOPBITS_ONE,&lt;br /&gt;
                xonxoff=False&lt;br /&gt;
                )&lt;br /&gt;
        except serial.SerialException as e:&lt;br /&gt;
            print(&amp;quot;Nieprawidłowa nazwa portu lub port zajęty.&amp;quot;)&lt;br /&gt;
            raise e&lt;br /&gt;
        self.close()&lt;br /&gt;
        &lt;br /&gt;
    def open(self):&lt;br /&gt;
        self.port.open()&lt;br /&gt;
&lt;br /&gt;
    def close(self):&lt;br /&gt;
        self.port.close()&lt;br /&gt;
&lt;br /&gt;
    def send(self, value):&lt;br /&gt;
        self.port.write(value)&lt;br /&gt;
                           &lt;br /&gt;
    def blinkSSVEP(self,d, p1, p2):&lt;br /&gt;
        '''&lt;br /&gt;
        d = list of frequencies;&lt;br /&gt;
        p1:p2 = ratio LED_on_time/LED_off_time&lt;br /&gt;
        if you want i-th LED to be OFF all the time send  d[i] = 0&lt;br /&gt;
        if you want i-th LED to be ON all the time send  d[i] = -1&lt;br /&gt;
        in these two cases p1 and p2 do not matter&lt;br /&gt;
        '''&lt;br /&gt;
        clock  = 62500&lt;br /&gt;
        factor = float(p1) / float(p1 + p2)&lt;br /&gt;
    &lt;br /&gt;
        str = chr(3) # 'SSVEP_RUN'&lt;br /&gt;
&lt;br /&gt;
        for i in range(len(d)):&lt;br /&gt;
            # i-th LED OFF&lt;br /&gt;
            if d[i] == 0:                       &lt;br /&gt;
                str += to_hex_word(0) + to_hex_word(255) &lt;br /&gt;
            # i-th LED ON&lt;br /&gt;
            elif d[i] == -1:&lt;br /&gt;
                str += to_hex_word(255) + to_hex_word(0)&lt;br /&gt;
                #str = 'S'&lt;br /&gt;
                # i-th LED blinks d[i] times per second&lt;br /&gt;
                # p1:p2 = on_time:off_time in one blink&lt;br /&gt;
            else:&lt;br /&gt;
                period = clock/d[i]&lt;br /&gt;
                bright = int((clock/d[i]) * factor)&lt;br /&gt;
                dark = period - bright&lt;br /&gt;
                str += to_hex_word(bright) + to_hex_word(dark)&lt;br /&gt;
&lt;br /&gt;
        self.send(str)&lt;br /&gt;
&lt;br /&gt;
    def blinkP300(self,d):&lt;br /&gt;
        clock  = 62500&lt;br /&gt;
        str = chr(4) # 'P300_RUN'&lt;br /&gt;
&lt;br /&gt;
        for i in range(len(d)):&lt;br /&gt;
            period = int(clock*d[i]/1000.0)&lt;br /&gt;
            str += to_hex_word(period)&lt;br /&gt;
            print(period)&lt;br /&gt;
&lt;br /&gt;
        self.send(str)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
--&amp;gt; &amp;lt;!-- Kod w Pythonie 3 --&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# -*- coding: cp1250 -*-&lt;br /&gt;
import serial&lt;br /&gt;
import logging&lt;br /&gt;
import sys&lt;br /&gt;
import os&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
def to_hex_word(a):&lt;br /&gt;
    '''encodes a decimal number hexadecimally on two bytes'''&lt;br /&gt;
    return a.to_bytes(2,byteorder=sys.byteorder)&lt;br /&gt;
 &lt;br /&gt;
class SerialPort(object):&lt;br /&gt;
    def __init__(self, port_name):&lt;br /&gt;
        import serial&lt;br /&gt;
        try:&lt;br /&gt;
            self.port = serial.Serial(&lt;br /&gt;
                port=port_name,&lt;br /&gt;
                baudrate=9600,&lt;br /&gt;
                bytesize=serial.EIGHTBITS,&lt;br /&gt;
                parity=serial.PARITY_NONE,&lt;br /&gt;
                stopbits=serial.STOPBITS_ONE,&lt;br /&gt;
                xonxoff=False&lt;br /&gt;
                )&lt;br /&gt;
        except serial.SerialException as e:&lt;br /&gt;
            print(&amp;quot;Nieprawidłowa nazwa portu lub port zajęty.&amp;quot;)&lt;br /&gt;
            raise e&lt;br /&gt;
        self.close()&lt;br /&gt;
 &lt;br /&gt;
    def open(self):&lt;br /&gt;
        self.port.open()&lt;br /&gt;
 &lt;br /&gt;
    def close(self):&lt;br /&gt;
        self.port.close()&lt;br /&gt;
 &lt;br /&gt;
    def send(self, value):&lt;br /&gt;
        self.port.write(value)&lt;br /&gt;
 &lt;br /&gt;
    def blinkSSVEP(self,d, p1, p2):&lt;br /&gt;
        '''&lt;br /&gt;
        d = list of frequencies;&lt;br /&gt;
        p1:p2 = ratio LED_on_time/LED_off_time&lt;br /&gt;
        if you want i-th LED to be OFF all the time send  d[i] = 0&lt;br /&gt;
        if you want i-th LED to be ON all the time send  d[i] = -1&lt;br /&gt;
        in these two cases p1 and p2 do not matter&lt;br /&gt;
        '''&lt;br /&gt;
        clock  = 62500&lt;br /&gt;
        factor = float(p1) / float(p1 + p2)&lt;br /&gt;
 &lt;br /&gt;
        str = (3).to_bytes(1,byteorder=sys.byteorder) # 'SSVEP_RUN'&lt;br /&gt;
 &lt;br /&gt;
        for i in range(len(d)):&lt;br /&gt;
            # i-th LED OFF&lt;br /&gt;
            if d[i] == 0:                       &lt;br /&gt;
                str += to_hex_word(0) + to_hex_word(255) &lt;br /&gt;
            # i-th LED ON&lt;br /&gt;
            elif d[i] == -1:&lt;br /&gt;
                str += to_hex_word(255) + to_hex_word(0)&lt;br /&gt;
                #str = 'S'&lt;br /&gt;
                # i-th LED blinks d[i] times per second&lt;br /&gt;
                # p1:p2 = on_time:off_time in one blink&lt;br /&gt;
            else:&lt;br /&gt;
                period = clock/d[i]&lt;br /&gt;
                bright = int((clock/d[i]) * factor)&lt;br /&gt;
                dark = int(period - bright)&lt;br /&gt;
                str += to_hex_word(bright) + to_hex_word(dark)&lt;br /&gt;
 &lt;br /&gt;
        self.send(str)&lt;br /&gt;
 &lt;br /&gt;
    def blinkP300(self,d):&lt;br /&gt;
        clock  = 62500&lt;br /&gt;
        str = (4).to_bytes(1,byteorder=sys.byteorder) # 'P300_RUN'&lt;br /&gt;
 &lt;br /&gt;
        for i in range(len(d)):&lt;br /&gt;
            period = int(clock*d[i]/1000.0)&lt;br /&gt;
            str += to_hex_word(period)&lt;br /&gt;
 &lt;br /&gt;
        self.send(str)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Zestaw eksperymentalny===&lt;br /&gt;
Zestaw składa się ze:&lt;br /&gt;
* wzmacniacza,&lt;br /&gt;
* stymulatora &amp;amp;mdash; układ zapalający i gaszący diodę w kontrolowany sposób,  &lt;br /&gt;
* izolowanego galwanicznie układu generującego impulsy odpowiadające gaszeniu i zapalaniu diody,  o wartościach dopasowanych do akceptowalnych przez wejścia AUX wzmacniacza,&lt;br /&gt;
* komputera: w tym eksperymencie komputer będzie służył do zaprogramowania stymulatora i do rejestracji sygnałów.&lt;br /&gt;
&lt;br /&gt;
===Wersja 1: obserwacja błyskającej diody  ===&lt;br /&gt;
&amp;lt;!--Proszę zapoznać się ze standardami rejestracji wzrokowych potencjałów wywołanych [http://www.gcu.ac.uk/media/gcalwebv2/theuniversity/academicschools/sls/psytimetables/SLS%20-%20VEP_Standard_2010.pdf] --&amp;gt;&lt;br /&gt;
Proszę zapoznać się z typowym wyglądem załamków w przypadku potencjałów wzrokowych, jaki jest przedstawiony na [https://static-content.springer.com/image/art%3A10.1007%2Fs10633-009-9195-4/MediaObjects/10633_2009_9195_Fig4_HTML.gif tym rysunku] (cały artykuł jest dostępny [http://link.springer.com/article/10.1007%2Fs10633-009-9195-4 tu]).&lt;br /&gt;
&amp;lt;!--[[Plik:Fig 4 VEP.jpg|thumb|320px|right|&amp;lt;figure id=&amp;quot;fig:zalamki_VEP&amp;quot;&amp;gt;&amp;lt;/figure&amp;gt;&lt;br /&gt;
&amp;lt;xr id=&amp;quot;fig:zalamki_VEP&amp;quot;&amp;gt;Rys. %i.&amp;lt;/xr&amp;gt; Schemat załamków rozpoznawanych we wzrokowych potencjach wywołanych (z pracy: J. V. Odom i in. &amp;amp;bdquo;ISCEV standard for clinical visual evoked potentials&lt;br /&gt;
(2009 update)&amp;amp;rdquo;, Doc Ophthalmol (2010), 120:111–119).]]&lt;br /&gt;
--&amp;gt; &lt;br /&gt;
&lt;br /&gt;
==== Rejestracja ====&lt;br /&gt;
* Paradygmat: z odległości około 40 cm badany obserwuje błyski diody. Błyski powtarzają się co 1&amp;amp;plusmn;0,1 sekundy. Każdy błysk trwa 20 ms. Rejestrujemy 2 serie po 100 błysków. Częstość próbkowania 512 Hz.&lt;br /&gt;
** W pierwszej serii błyskamy tylko jedną diodą.&lt;br /&gt;
** W drugiej serii błyskamy dwiema diodami. &lt;br /&gt;
Pomiędzy seriami badany odpoczywa około 2 min. Diody powinny być ustawione na jednakową jasność błysków.&lt;br /&gt;
&lt;br /&gt;
* Pomiar&lt;br /&gt;
**Zakładamy czepek i elektrody w systemie 10-20, dbamy o to by opory pomiędzy elektrodami były poniżej 5 k&amp;amp;Omega; i różnice pomiędzy oporami różnych elektrod nie przekraczały 20%. [[Plik:Glowka10-20 ERPy.svg|thumb|600px|right]]&lt;br /&gt;
** Elektrodę GND mocujemy w otworze czepka odpowiadającym pozycji AFz (na linii centralnej 10% w stronę nosa od elektrody Fz) &lt;br /&gt;
** Montujemy także elektrodę FCz (na linii centralnej pomiędzy Fz a Cz), będziemy jej używać w montażu i w czasie analizy jako referencji.&lt;br /&gt;
&lt;br /&gt;
==== Analiza ====&lt;br /&gt;
# Filtrujemy sygnał w paśmie 1-20 Hz.&lt;br /&gt;
# Z ciągłego zapisu wycinamy fragmenty od &amp;amp;minus;300 ms do +400 ms (zero oznacza moment wystąpienia bodźca). W czasie wycinania badamy wycinane fragmenty pod względem zakresu amplitudy (wszystkie kanały powinny mieć amplitudę w granicach &amp;amp;plusmn;75 &amp;amp;mu;V) i zawartości artefaktów od mrugania (w tym celu trzeba oglądając sygnał w SVAROG-u ustalić próg na amplitudę sygnału w kanałach Fp1 i Fp2).&lt;br /&gt;
# Uśredniamy wycięte sygnały.&lt;br /&gt;
# Rysujemy średni potencjał we wszystkich kanałach.&lt;br /&gt;
# Identyfikujemy załamki N2 i P2. Mierzymy amplitudę P2 jako różnicę między ekstremalną wartością załamka P2 a ekstremalną wartością załamka N2. &lt;br /&gt;
&lt;br /&gt;
[[Plik:ZalamkiN2_P2.png‎|thumb|600px|right|  Uśredniony potencjał wywołany dla serii 1 i 2 na kanale T5 z zaznaczonymi załamkami N2 i P2. Na osi poziomej czas [s] natomiast na pionowej amplituda [μV].]]&lt;br /&gt;
Pomiar wykonujemy dla obu serii błysków.&lt;br /&gt;
&lt;br /&gt;
Pytanie: Czy intensywność bodźca wpływa na amplitudę potencjału P2?&lt;br /&gt;
Jak stwierdzić czy amplitudy załamków P2 istotnie różnią się pomiędzy seriami?&lt;br /&gt;
&lt;br /&gt;
Musimy przeprowadzić test statystyczny. Możemy skonstruować go np. tak:&lt;br /&gt;
Mamy dwa warunki I i II. Jako statystykę przyjmiemy różnicę pomiędzy amplitudą załamka zmierzoną w serii z dwoma diodami (P2&amp;lt;sub&amp;gt;II&amp;lt;/sub&amp;gt;) a amplitudą zmierzoną w serii z jedną diodą (P2&amp;lt;sub&amp;gt;I&amp;lt;/sub&amp;gt;):&lt;br /&gt;
: ''S'' = P2&amp;lt;sub&amp;gt;II&amp;lt;/sub&amp;gt; &amp;amp;minus; P2&amp;lt;sub&amp;gt;I&amp;lt;/sub&amp;gt;&lt;br /&gt;
Postawmy hipotezę zerową, że nie ma różnicy w amplitudzie pomiędzy warunkiem II a I oraz hipotezę alternatywną, że różnica taka występuje.&lt;br /&gt;
: H&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;: ''S'' = 0&lt;br /&gt;
: H&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;: ''S'' &amp;amp;ne; 0&lt;br /&gt;
Zgodnie z H&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; dla wartości ''S'' nie ma różnicy czy realizacja została zarejestrowana w warunkach I czy II, zatem można losowo poprzypisywać numery warunków do realizacji i w ten sposób uzyskać rozkład statystyki ''S'' pod warunkiem prawdziwości H&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;, czyli obliczyć średnie potencjały dla &amp;amp;bdquo;pomieszanych&amp;amp;rdquo; tagów, wyliczyć średnie potencjały dla sztucznie wygenerowaych grup, i wyliczyć różnicę amplitud dla tych średnich, czyli wartość statystyki dla hipotezy H&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Zaimplementuj test permutacyjny zgodny z powyższą koncepcją.&lt;br /&gt;
&lt;br /&gt;
===Wersja 2: obserwacja habituacji / uśrednianie w blokach ===&lt;br /&gt;
==== Rejestracja ====&lt;br /&gt;
# Paradygmat: &lt;br /&gt;
#* z odległości około 40 cm badany obserwuje błyski diody. &lt;br /&gt;
#* Błyski powtarzają się co 0,5 sekundy. &lt;br /&gt;
#* Rejestrujemy 60 serii po 15 błysków.  &lt;br /&gt;
#* Pomiędzy seriami badany odpoczywa około 10 sekund.&lt;br /&gt;
# Zakładamy czepek i elektrody w systemie 10-20, dbamy o to by opory pomiędzy elektrodami były poniżej 5 k&amp;amp;Omega; i różnice pomiędzy oporami różnych elektrod nie przekraczały 20%.&lt;br /&gt;
#* Elektrodę GND mocujemy w otworze czepka odpowiadającym pozycji AFz (na linii centralnej 10% w stronę nosa od elektrody Fz) &lt;br /&gt;
#* Montujemy także elektrodę FCz (na linii centralnej pomiędzy Fz a Cz), będziemy jej używać w montażu i w czasie analizy jako referencji.&lt;br /&gt;
#* Częstość próbkowania 512 Hz.&lt;br /&gt;
&lt;br /&gt;
==== Analiza ====&lt;br /&gt;
# Filtrujemy sygnał w paśmie 0,1-20 Hz.&lt;br /&gt;
# Z ciągłego zapisu wycinamy fragmenty od &amp;amp;minus;300 ms do +600 ms (zero oznacza moment wystąpienia bodźca). W czasie wycinania badamy wycinane fragmenty pod względem zakresu amplitudy (wszystkie kanały powinny mieć amplitudę w granicach &amp;amp;plusmn;75 &amp;amp;mu;V) i zawartości artefaktów od mrugania (w tym celu trzeba oglądając sygnał w SVAROG-u ustalić próg na amplitudę sygnału w kanałach Fp1 i Fp2).&lt;br /&gt;
# Uśredniamy wycięte sygnały o tym samym numerze wewnątrz serii.&lt;br /&gt;
# Rysujemy serie 15 uśrednionych potencjałów dla tego kanału, który wykazywał najsilniejszy potencjał w pierwszej wersji eksperymentu.&lt;br /&gt;
&lt;br /&gt;
==Zadanie 3: rejestracja i analiza potencjału P3 ==&lt;br /&gt;
==== Rejestracja ====&lt;br /&gt;
# Paradygmat: &lt;br /&gt;
#* z odległości około 40 cm badany obserwuje błyski diody. &lt;br /&gt;
#* Błyski diody nr 1 powtarzają się co 1&amp;amp;plusmn;0,1 sekundy. &lt;br /&gt;
#* W losowych realizacjach zapalana jest także dioda nr 2. &lt;br /&gt;
#* Proporcja pomiędzy liczbą błysków pojedynczych i podwójnych powinna wynosić 10:2, przy czym błyski podwójne muszą być odseparowane co najmniej jednym błyskiem pojedynczym. &lt;br /&gt;
#* Czas zapalenia diod, tak jak w poprzednich eksperymentach, wynosi 20 ms. &lt;br /&gt;
#* Zadaniem badanego jest liczenie liczby błysków podwójnych.&lt;br /&gt;
#* Wykonujemy tyle realizacji aby zarejestrować 50 powtórzeń podwójnych błysków. &lt;br /&gt;
# Zakładamy czepek i elektrody w systemie 10-20, dbamy o to by opory pomiędzy elektrodami były poniżej 5 k&amp;amp;Omega; i różnice pomiędzy oporami różnych elektrod nie przekraczały 20%.&lt;br /&gt;
#* Elektrodę GND mocujemy w otworze czepka odpowiadającym pozycji AFz (na linii centralnej 10% w stronę nosa od elektrody Fz) &lt;br /&gt;
#* Montujemy także elektrody M1 i M2, będziemy ich używać w montażu i w czasie analizy jako referencji typu połączone uszy.&lt;br /&gt;
#* Częstość próbkowania 512 Hz.&lt;br /&gt;
&lt;br /&gt;
==== Analiza ====&lt;br /&gt;
# Filtrujemy sygnał w paśmie 0,1-20 Hz.&lt;br /&gt;
# Z ciągłego zapisu wycinamy fragmenty od &amp;amp;minus;300 ms do +600 ms (zero oznacza moment wystąpienia bodźca). W czasie wycinania badamy wycinane fragmenty pod względem zakresu amplitudy (wszystkie kanały powinny mieć amplitudę w granicach &amp;amp;plusmn;75 &amp;amp;mu;V) i zawartości artefaktów od mrugania (w tym celu trzeba oglądając sygnał w SVAROG-u ustalić próg na amplitudę sygnału w kanałach Fp1 i Fp2).&lt;br /&gt;
# Uśredniamy osobno realizacje błysków pojedynczych i błysków podwójnych.&lt;br /&gt;
# Nakładamy na siebie na rysunkach oba typy średnich.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Ćwiczenie dodatkowe: P300 BCI==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wykorzystujemy elektrody z systemu 10-10 umieszczone nad korą wzrokową: P07, O1, O2, PO8, PO3, PO4, Pz, Cz.&lt;br /&gt;
&lt;br /&gt;
Uruchamiamy &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
obci_gui --presets eeg_workshop&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
i z guzika &amp;amp;bdquo;select amplifier&amp;amp;rdquo; wybieramy właściwy wzmacniacz.&lt;br /&gt;
&lt;br /&gt;
Do kontroli jakości sygnału możemy uruchomić Svaroga.&lt;br /&gt;
&lt;br /&gt;
Dane z kalibracji zapisują się w pliku test1 w katalogu domowym użytkownika, z labiryntu w pliku test2.&lt;br /&gt;
&lt;br /&gt;
Po zakończeniu kalibracji pojawia się napis &amp;amp;bdquo;Trwają obliczenia&amp;amp;rdquo; lub podobny. Odczekujemy kilka minut, aż skończy się peer &amp;amp;bdquo;Calibration&amp;amp;rdquo; (widoczny w obci_gui) i zamykamy okienko klawiszami Alt-F4 lub zatrzymując scenariusz guzikiem &amp;amp;bdquo;Stop&amp;amp;rdquo;. W katalogu domowym pojawi się plik z wynikami kalibracji, co pozwala na uruchomienie scenariusza &amp;amp;bdquo;labirynt&amp;amp;rdquo;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Po zebraniu danych, przed wczytaniem ich do Svaroga należy w tym samym katalogu uruchomić skrypt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
#!/usr/bin/env python&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
&lt;br /&gt;
from obci.analysis.obci_signal_processing.tags import tags_file_writer&lt;br /&gt;
from obci.analysis.obci_signal_processing.read_manager import ReadManager&lt;br /&gt;
&lt;br /&gt;
def main(): &lt;br /&gt;
	file_name = 'test1'&lt;br /&gt;
	&lt;br /&gt;
	mgr = ReadManager(&lt;br /&gt;
		file_name + '.obci.xml',&lt;br /&gt;
		file_name + '.obci.raw',&lt;br /&gt;
		file_name + '.obci.tag')&lt;br /&gt;
	&lt;br /&gt;
	tags = mgr.get_tags()&lt;br /&gt;
	for i in xrange(0, len(tags)):&lt;br /&gt;
		if tags[i]['desc']['index'] == tags[i]['desc']['target']:&lt;br /&gt;
			tags[i]['name'] = 'blink_target'&lt;br /&gt;
		else:&lt;br /&gt;
			tags[i]['name'] = 'blink'&lt;br /&gt;
			&lt;br /&gt;
	tags_writer = tags_file_writer.TagsFileWriter(file_name + '.obci.tag')&lt;br /&gt;
	for tag in tags:&lt;br /&gt;
		tags_writer.tag_received(tag)		&lt;br /&gt;
	tags_writer.finish_saving(0)	&lt;br /&gt;
 &lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Aduszyk</name></author>
		
	</entry>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=Pracownia_EEG/Potencja%C5%82y_wywo%C5%82ane&amp;diff=8966</id>
		<title>Pracownia EEG/Potencjały wywołane</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=Pracownia_EEG/Potencja%C5%82y_wywo%C5%82ane&amp;diff=8966"/>
		<updated>2022-11-08T10:03:53Z</updated>

		<summary type="html">&lt;p&gt;Aduszyk: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Pracownia EEG|Pracownia EEG]] / Potencjały wywołane&lt;br /&gt;
&lt;br /&gt;
=Wstęp=&lt;br /&gt;
==Potencjały wywołane==&lt;br /&gt;
=== Wstęp ===&lt;br /&gt;
Potencjały wywołane EEG (ang. ''evoked potentials'', EP) są śladami odpowiedzi mózgu na bodźce. W przypadku MEG poprawnie mówi się o polach wywołanych (ang. ''evoked fields'', EF).&lt;br /&gt;
Zwykle reakcja ta jest mała (wyjątek stanowią [[Elektroencefalografia/Metody_analizy_sygnałów_EEG_-_analiza_w_dziedzinie_czasu |kompleksy K]]) i w zapisie pojedynczej realizacji reakcji na bodziec najczęściej niewidoczna wśród czynności pochodzącej od wielu innych procesów zachodzących w tym samym czasie w mózgu. &lt;br /&gt;
Ich wyodrębnienie z tak zwanego tła EEG/MEG, czyli manifestacji elektrycznej innych, trwających w tym samym czasie w mózgu procesów (aktywny prąd niezależny), wymaga w dniu dzisiejszym zapisu odpowiedzi na szereg powtórzeń tego samego bodźca (&amp;lt;xr id=&amp;quot;fig:EP&amp;quot;&amp;gt;rys. %i&amp;lt;/xr&amp;gt;). Pierwsze potencjały wywołane pokazał pod koniec lat 40-tych Dawson (Dawson 1947) wykonując superpozycję pojedynczych realizacji na kliszy fotograficznej.&lt;br /&gt;
Z czasem skomplikowane urządzenia analogowe zastąpione zostały przez cyfrowe uśrednianie kolejnych fragmentów EEG, zsynchronizowanych według momentu wystąpienia bodźca, łatwo realizowane za pomocą komputera.&lt;br /&gt;
&lt;br /&gt;
[[Grafika:EP.png|thumb|640px|center|&amp;lt;figure id=&amp;quot;fig:EP&amp;quot;&amp;gt;&amp;lt;/figure&amp;gt;&lt;br /&gt;
Uśrednianie potencjałów wywołanych. a) ciągły zapis EEG z wyróżnionymi momentami wystąpienia bodźca (w tym przypadku słuchowego) b) kilkadziesiąt kolejnych odcinków, wyciętych jako sekunda EEG od momentu wystąpienia kolejnych bodźców, ustawione jeden pod drugim c) uśredniony potencjał wywołany &amp;amp;mdash; widać m. in. załamek P300 ok. 300 milisekund po bodźcu]]&lt;br /&gt;
&lt;br /&gt;
Techniki te opierają się na założeniu, że zawarta w EEG odpowiedź mózgu na każdy z kolejnych bodźców jest niezmienna, a EEG odzwierciedlające pozostałe procesy traktowane jest jak nieskorelowany z nią proces stochastyczny. Zależnie od rodzaju potencjałów wywołanych, założenia te są mniej lub bardziej nieuzasadnione; podważa je choćby powszechnie znany efekt habituacji, polegający na osłabieniu późnych potencjałów wywołanych kolejnymi powtórzeniami bodźca.&lt;br /&gt;
&lt;br /&gt;
Istota potencjałów wywołanych jest przedmiotem otwartej dyskusji i dziesiątków prac, dotykających od lat podstawowych w tej dziedzinie pytań: czym jest potencjał wywołany, który widzimy w uśrednionym przebiegu? Czy naprawdę wynika z deterministycznie powtarzanej, jednakowej odpowiedzi pojawiającej się po każdym powtórzeniu bodźca niezależnie od &amp;amp;bdquo;tła&amp;amp;rdquo;, czy może wynika z reorganizacji faz tego właśnie &amp;amp;bdquo;tła&amp;amp;rdquo; EEG, czy może kombinacji tych dwóch efektów? Jest to wspaniałe pole dla zastosowań zaawansowanych metod modelowania i analizy sygnałów. W ostatnich latach powstają dziesiątki prac na ten temat, a od czasu do czasu również krytyczne artykuły wykazujące, że dotychczasowe odkrycia są raczej artefaktami stosowanych metod a nie wynikają z własności analizowanych danych (Yeung et al., 2004). Jak widać jest tu wciąż bardzo wiele do zrobienia, gdyż zrozumienie tego mechanizmu stoi na drodze do &amp;amp;bdquo;świętego Graala&amp;amp;rdquo;, którym w tej dziedzinie jest wyodrębnienie pojedynczych potencjałów wywołanych.&lt;br /&gt;
&lt;br /&gt;
Niezależnie od tego, w neurofizjologii klinicznej nazwą potencjał wywołany określa się krzywą widoczną po uśrednieniu odpowiedzi na kilkanaście do kilku tysięcy bodźców (Szelenberger 2000). Gromadzona od dziesięcioleci wiedza o behawioralnych i klinicznych korelatach potencjałów wywołanych opiera się na rozpoznawaniu w przebiegach uśrednionych tak zwanych załamków, czyli przejściowych wzrostów lub spadków potencjału (na przykład na &amp;lt;xr id=&amp;quot;fig:EP&amp;quot;&amp;gt;rys. %i&amp;lt;/xr&amp;gt; widać załamek P300). Nazwy załamków składają się zwykle z litery &amp;amp;bdquo;P&amp;amp;rdquo; (od ang. ''positive''), jeśli wychylenie jest dodatnie, lub &amp;amp;bdquo;N&amp;amp;rdquo; (od ang. ''negative''), jeśli wychylenie jest ujemne, oraz liczby. Uwaga: &lt;br /&gt;
* Nie ma niestety jednej ustalonej konwencji prezentacji potencjałów koniecznie trzeba więc zwracać uwagę na orientację wykresu, a wykonując wykres samemu - zamieszczać informację o orientacji kierunku dodatniego,gdyż kierunek dodatni może być wykresie skierowany do góry lub do dołu. &lt;br /&gt;
* Liczba następująca po N lub P określa przybliżoną liczbę milisekund od wystąpienia bodźca, czyli tak zwaną latencję. Nie można jednak ścisłego związku między tą liczbą a liczbą milisekund np. potencjał P300 w zależności od szczegółów paradygmatu doświadczalnego może wystąpić znacznie później. np. w eksperymentach językowych zdarza się że P300 występuje później niż N400 :-).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;xr id=&amp;quot;fig:zalamki&amp;quot;&amp;gt;Rys. %i&amp;lt;/xr&amp;gt; przedstawia schematycznie najważniejsze załamki rozpoznawane w potencjałach słuchowych, czyli wywoływanych bodźcem dźwiękowym. Dla potencjałów wzrokowych i somatosensorycznych istnieją podobne klasyfikacje.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Grafika:Zalamki.png|thumb|320px|right|&amp;lt;figure id=&amp;quot;fig:zalamki&amp;quot;&amp;gt;&amp;lt;/figure&amp;gt;&lt;br /&gt;
Orientacyjny schemat załamków rozpoznawanych w słuchowych potencjach wywołanych, na podstawie (Szelenberger 2000). Skala czasu logarytmiczna. Najszybsze (do 12 ms) składowe egzogenne to potencjały pniowe (BAEP), oznaczane jako fale I-VII. Litery &amp;amp;bdquo;P&amp;amp;rdquo; i &amp;amp;bdquo;N&amp;amp;rdquo; oznaczają dodatnie i ujemne wychylenia związane z dalszymi załamkami]]&lt;br /&gt;
&lt;br /&gt;
Najszybsze (czyli o najmniejszej latencji) składowe to potencjały egzogenne, odzwierciedlające wstępne fazy przekazu informacji. W potencjałach słuchowych są to potencjały pnia (ang. ''brainstem auditory evoked potentials'', BAEP), składające się z siedmiu fal występujących pomiędzy 1 a 12 ms od bodźca. Są one generowane np. w nerwie słuchowym czy pniu mózgu, i wykorzystywane w klinicznej diagnostyce integralności dróg słuchowych. Podobnie jak inne wczesne potencjały o latencjach poniżej 100 ms, są praktycznie niezależne od stanu uwagi.&lt;br /&gt;
&lt;br /&gt;
Po potencjałach o średniej latencji (między 12 a 50 ms) zaczynają się późne potencjały słuchowe (od 100 ms od podania bodźca), odzwierciedlające bardziej złożone reakcje na bodziec. Potencjały ok. 100 ms obserwowane w okolicach sensorycznych odzwierciedlają odpowiedź tejże kory na bodziec. Ich amplituda zależy od parametrów fizycznych bodźca oraz od uwagi, np. amplituda załamka N100 wzrasta w stanie skupienia uwagi czy pobudzenia emocjonalnego. Pierwszy i najpopularniejszy całkowicie endogenny załamek to P300, pojawiający się po rozpoznaniu bodźca oczekiwanego, na którym skupiamy uwagę: na przykład, jeśli w serii pojawiających się losowo liter mamy zliczać wystąpienia jednej z nich, to na średniej odpowiedzi na pojawienie się tej litery pojawi się załamek P300. Załamek ten występuje również w odpowiedzi na bodźce wyczekiwane, niespodziewane i ważne dla osoby (np. własne imię). &lt;br /&gt;
&lt;br /&gt;
=== Uśrednianie w dziedzinie czasu ===&lt;br /&gt;
Jak już było wspomniane powyżej podstawową techniką stosowaną do analizy potencjałów wywołanych jest uśrednianie wielu realizacji odpowiedzi na bodziec wyrównanych względem jakiegoś charakterystycznego zdarzenia, np. momentu podania bodźca albo momentu behawioralnej reakcji na bodziec (np. wciśnięcie przycisku). Podejście to bazuje na trzech założeniach:&lt;br /&gt;
* Reakcja jest czasowo związana z bodźcem. Tzn. w kolejnych realizacjach występuje ona zawsze z tym samym opóźnieniem.&lt;br /&gt;
* Reakcja na bodziec skutkuje zawsze pojawieniem się w sygnale składowej o stałym kształcie (mówimy o stałej morfologii).&lt;br /&gt;
* Spontaniczna czynność EEG &amp;amp;mdash; ta która nie dotyczy przetwarzania interesującego nas bodźca &amp;amp;mdash; jest niezależnym, stacjonarnym szumem o średniej zero.&lt;br /&gt;
&lt;br /&gt;
Zgodnie z powyższymi założeniami mierzony w ''i''-tej realizacji sygnał można wyrazić jako:&lt;br /&gt;
: &amp;lt;math&amp;gt;x_i(t) = s(t) + n_i(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
Uśrednianie po ''N'' realizacjach daje:&lt;br /&gt;
: &amp;lt;math&amp;gt;\bar x (t) = \frac{1}{N} \sum_{i=1}^N x_i(t) = \frac{1}{N} \left(N s(t) + \sum_{i=1}^N n_i(t) \right) &amp;lt;/math&amp;gt;&lt;br /&gt;
Wartość oczekiwana średniego sygnału wynosi:&lt;br /&gt;
: &amp;lt;math&amp;gt;\mathrm{E}\left[ \bar x(t) \right] = s(t) &amp;lt;/math&amp;gt;&lt;br /&gt;
gdyż dla szumu o średniej zero mamy:&lt;br /&gt;
: &amp;lt;math&amp;gt;\mathrm{E}\left[\frac{1}{N} \sum_{i=1}^N n_i(t)\right] = 0&amp;lt;/math&amp;gt;.&lt;br /&gt;
Wariancja &amp;lt;math&amp;gt;\bar x(t)&amp;lt;/math&amp;gt; wynosi:&lt;br /&gt;
: &amp;lt;math&amp;gt;\sigma^2_{\bar x(t)} = \mathrm{E} \left[  \left( \frac{1}{N} \sum_{i=1}^N n_i(t)\right)^2 \right] \approx \frac{1}{N} \sigma^2_{n(t)}&amp;lt;/math&amp;gt;&lt;br /&gt;
gdyż &amp;lt;math&amp;gt;s(t)&amp;lt;/math&amp;gt; jest deterministyczne. &lt;br /&gt;
&lt;br /&gt;
Dla potencjałów pojawiających się w pierwszych kilkudziesięciu milisekundach po bodźcu model ten można uznać za poprawny, gdyż wykazują one zależność głównie od parametrów fizycznych bodźca. Dla późniejszych składowych staje się on coraz bardziej wątpliwy ze względu na występujące korelacje ze stanem (np. uwagi) badanego.&lt;br /&gt;
&lt;br /&gt;
Dla późniejszych składowych można by postulować bardziej ogólną wersję modelu potencjału wywołanego:&lt;br /&gt;
: &amp;lt;math&amp;gt;x_i(t) = s_i(t) + n_i(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
Ten model uwidacznia, że do opisu potencjału wywołanego potrzebna jest nie tylko średnia, ale i wyższe momenty rozkładu (np. drugi moment centralny czyli wariancja).&lt;br /&gt;
&lt;br /&gt;
====Wariancja w przypadku szumu skorelowanego ====&lt;br /&gt;
W poprzednim paragrafie pokazaliśmy, że w przypadku niezależnego szumu wariancja uśrednionego sygnału (w danej chwili czasu) maleje jak  &amp;lt;math&amp;gt;\frac{1}{N}&amp;lt;/math&amp;gt;. Jednak w przypadku gdy kolejne próbki szumu są skorelowane (np. występuje silna aktywność rytmiczna alfa) sytuacja się komplikuje. Intuicyjnie łatwo możemy to sobie wyobrazić w granicznym przypadku. Załóżmy, że tło dla  potencjałów o stałej morfologii   stanowi sinusoida. Jeśli będziemy podawać bodźce w odstępach będących wielokrotnością okresu tej sinusoidy to w uśrednianych fragmentach sygnału owa sinusoida jest tak samo powtarzalna jak badany potencjał i uśrednianie nie prowadzi do poprawy stosunku amplitudy sygnału do amplitudy tła. &lt;br /&gt;
&lt;br /&gt;
Stopień zależności pomiędzy próbkami można zmierzyć przy pomocy funkcji autokorelacji. &lt;br /&gt;
Jeśli funkcję autokorelacji przybliżymy przez:&lt;br /&gt;
: &amp;lt;math&amp;gt;R_{xx}(\tau) = \sigma^2 \exp(-\beta |\tau|) \cos(2 \pi f_0 \tau)&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\sigma^2&amp;lt;/math&amp;gt; jest wariancją szumu, &amp;lt;math&amp;gt;f_0&amp;lt;/math&amp;gt; jest średnią częstością aktywności rytmicznej, &amp;lt;math&amp;gt;\beta/ \pi&amp;lt;/math&amp;gt; jest szerokością pasma tej czynności, zaś &amp;lt;math&amp;gt;\tau&amp;lt;/math&amp;gt; opóźnieniem, to wariancję potencjału wywołanego można wyrazić jako&amp;lt;!-- \cite{Spekreijse_1976}--&amp;gt;:&lt;br /&gt;
: &amp;lt;math&amp;gt;\sigma^2_{\bar x(t)} = \frac{\sigma^2}{N} \left[ \frac{1-\exp(-2 \beta T)}{1 - 2 \exp(- \beta T) \cos(2 \pi f_0 T) +\exp(-2 \beta T)} \right]&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; jest odstępem między bodźcami. &lt;br /&gt;
Widać stąd, że obecność czynności rytmicznej w tle wpływa na stosunek sygnału do szumu. Z powyższego równania widać, że stosunek wariancji dąży do &amp;lt;math&amp;gt;\frac{\sigma^2}{N}&amp;lt;/math&amp;gt; gdy &amp;lt;math&amp;gt;\beta T&amp;lt;/math&amp;gt; staje się duże.  &lt;br /&gt;
&lt;br /&gt;
Periodyczna stymulacja może ponadto prowadzić do wzbudzenia czynności rytmicznej o częstości równej częstości pobudzania bądź jej harmonicznej.&lt;br /&gt;
&lt;br /&gt;
===Wariancja latencji===&lt;br /&gt;
&lt;br /&gt;
Jedną z form zmienności potencjału wywołanego w pojedynczych realizacjach jest wariancja latencji. &lt;br /&gt;
[[Grafika:Wariancja_latencji.png|thumb|500px|right|&lt;br /&gt;
Czerwona linia: Uśrednianie 100 potencjałów wywołanych o latncjach z rozkładu normalnego N(300,30 ), Niebieskie linie: przykładowe pojedyncze realizacje wzięte do średniej]]&amp;lt;!--# -*- coding: utf-8 -*-&lt;br /&gt;
from __future__ import division&lt;br /&gt;
import numpy as np&lt;br /&gt;
from matplotlib.pyplot import plot, show ,subplot, figure, title, xlabel, ylabel, ylim&lt;br /&gt;
 &lt;br /&gt;
def fun(t,lat=100):&lt;br /&gt;
    return np.exp(-(t-lat)**2/(2*30**2))&lt;br /&gt;
Fs = 1&lt;br /&gt;
N = 100&lt;br /&gt;
t = np.arange(0,700)&lt;br /&gt;
f = np.zeros((N,700))&lt;br /&gt;
f_sr = np.zeros(t.shape)&lt;br /&gt;
for i in range(N):&lt;br /&gt;
    f[i,:] = fun(t,lat = 300 + 30* np.random.randn())&lt;br /&gt;
for i in range(3):&lt;br /&gt;
    plot(t,f[i,:], 'b')&lt;br /&gt;
plot(t,f.mean(0),'r')&lt;br /&gt;
show()--&amp;gt;&lt;br /&gt;
Zmienność latencji prowadzi do:&lt;br /&gt;
* zmniejszenia amplitudy &amp;lt;math&amp;gt;\bar x&amp;lt;/math&amp;gt;&lt;br /&gt;
* wzrostu rozciągłości czasowej załamka&lt;br /&gt;
&lt;br /&gt;
O tych konsekwencjach zmienności latencji należy w szczególności pamiętać porównując średnie potencjały uzyskane w różnych warunkach eksperymentalnych. Gdy zauważymy, że średnie potencjały różnią się amplitudą należy rozważyć możliwość, że w istocie warunki eksperymentalne wpływają na różnice w wariancji latencji. &lt;br /&gt;
&lt;br /&gt;
Naturalne jest, że zmienność latencji jest bardziej widoczna w przypadku załamków trwających krótko niż w przypadku załamków trwających długo. Wariancja latencji rożnie wraz z jej wartością, stąd wśród późnych składowych potencjałów wywołanych nie obserwuje się komponentów krótkotrwałych.&lt;br /&gt;
====Uśrednianie metodą Woody'ego ====&lt;br /&gt;
&lt;br /&gt;
Model potencjału ze zmienną latencją i sposób na jego efektywniejsze uśrednianie zaproponował Woody (1967). Model ten zakłada, że w każdej realizacji występuje komponent addytywny &amp;lt;math&amp;gt;s_i(t)\;&amp;lt;/math&amp;gt;, który co do kształtu jest stały, a pomiędzy realizacjami różni się tylko latencją:&lt;br /&gt;
: &amp;lt;math&amp;gt; s_i(t) = s(t +\Delta t_i)\;&amp;lt;/math&amp;gt;&lt;br /&gt;
Woody zaproponował aby &amp;lt;math&amp;gt;\Delta t_i\;&amp;lt;/math&amp;gt; szacować na podstawie maksimum funkcji korelacji wzajemnej pomiędzy ''i''-tą realizacją a wzorcem. W pierwszym kroku wzorcem jest średni potencjał uzyskany przez proste uśrednienie realizacji.  Następnie w sposób iteracyjny dokonuje się:&lt;br /&gt;
* poprawek w wyrównaniu poszczególnych realizacji,&lt;br /&gt;
* obliczenia nowego wzorca poprzez uśrednienie realizacji po korekcie wyrównania,&lt;br /&gt;
* obliczenia nowych poprawek do wyrównania realizacji.&lt;br /&gt;
&lt;br /&gt;
===Habituacja ===&lt;br /&gt;
Zmienność w odpowiedziach na kolejno występujące po sobie bodźce można podzielić na komponent stochastyczny i deterministyczny. Komponent deterministyczny odzwierciedla zmianę czułości  układu nerwowego  na kolejne bodźce. Nowy bodziec często wywołuje reakcje pobudzenia widoczną w wielu parametrach takich jak przewodnictwo skóry, rytm serca i reaktywność kory mózgowej. Powszechnie obserwowanym zjawiskiem jest spadek reaktywności na powtarzające się bodźce zwany habituacją. Niekiedy obserwuje się także zjawisko przeciwne &amp;amp;mdash; wzrost reaktywności na bodziec &amp;amp;mdash; zwane sensytyzacją. &lt;br /&gt;
&lt;br /&gt;
Klasycznym sposobem na badanie tych zjawisk w potencjałach wywołanych jest uśrednianie w podzbiorach lub  uśrednianie blokowe. Wymaga ono  zmiany paradygmatu rejestracji danych. Załóżmy, że interesującym nas bodźcem jest błysk światła. Chcemy zaobserwować ewentualne zmiany amplitudy i latencji w ciągu 100 potencjałów będących reakcją na błysk powtarzający się co 500 ms.&lt;br /&gt;
====Uśrednianie w podzbiorach ====&lt;br /&gt;
W metodzie tej musimy założyć, że proces habituacji jest powolny, tzn. zmiany pomiędzy kolejnymi reakcjami są bardzo małe. W takim przypadku możemy podzielić długą serię bodźców na ciąg pod-serii i uśrednienie przeprowadzić dla każdej pod-serii osobno.&lt;br /&gt;
[[Plik:Usrednianie_podzbiory.svg‎|640px|thumb|center|Ilustracja uśredniania w podzbiorach]]&lt;br /&gt;
&lt;br /&gt;
====Uśrednianie blokowe====&lt;br /&gt;
W tym celu eksperyment wykonujemy w wielu seriach. Jedna seria składa się ze 100 błysków powtarzanych co 500 ms.  Po serii następuje przerwa trwająca np. 5 s (długość przerwy wyraża nasze oszacowanie czasu potrzebnego na zanik habituacji). Po przerwie seria jest powtarzana. Powtórzeń serii wykonujemy ''N''.&lt;br /&gt;
Następnie uśredniamy fragmenty sygnałów odpowiadające sobie w kolejnych seriach. &lt;br /&gt;
&lt;br /&gt;
W tym paradygmacie zakładamy, że każda seria rejestrowana jest w tych samych warunkach. Zaniedbujemy efekty związane ze zmęczeniem i zmianami w np. stopniu koncentracji badanego.&lt;br /&gt;
[[Plik:Usrednianie blokowe.svg|Usrednianie blokowe.svg|640px|thumb|center|Ilustracja uśredniania w blokach]]&lt;br /&gt;
&lt;br /&gt;
===Załamki w krzywej potencjału wywołanego vs ukryte komponenty===&lt;br /&gt;
Komponenta potencjału wywołanego to bardzo ważne ale jednocześnie źle określone pojęcie. Krzywa otrzymana w wyniku uśredniania potencjałów wywołanych przedstawia serię załamków dodatnich i ujemnych, ale trzeba być świadomym, że ten przebieg napięcia rejestrowany przez elektrody przedstawia tak naprawdę sumę potencjałów pochodzących od wielu dość niezależnie działających źródeł w mózgu. Przyczynek pochodzący od jednego funkcjonalnego źródła będziemy określać jako komponentę. &lt;br /&gt;
&lt;br /&gt;
Komentarza wymaga też pojęcie źródła funkcjonalnego. Czynność elektryczną synchronicznie działających neuronów piramidalnych w określonym fragmencie kory mózgowej z pewnej odległości można przybliżyć potencjałem dipola prądowego. Taki aktywny fragment kory stanowi źródło dające przyczynek do mierzonego na powierzchni głowy potencjału. W najprostszej sytuacji taki przyczynek może być obserwowany jako komponenta. Mózg jest jednak obiektem niezwykle złożonym i gęsto połączonym. Wiele obszarów korowych może być funkcjonalnie połączonych i aktywowanych synchronicznie w celu realizacji określonego zadania &amp;amp;mdash; o takim funkcjonalnym zespole też możemy myśleć jako o pojedynczym źródle, choć może ono mieć złożoną strukturę przestrzenną. Często zatem myślimy o komponentach ukrytych potencjału wywołanego jako o aktywności takich funkcjonalnych zespołów. &lt;br /&gt;
&lt;br /&gt;
Po tym wstępie widać już chyba, że do zrozumienia co dzieje się w czasie reakcji na bodziec, którą obserwujemy w potencjale wywołanym, bardziej pożądane byłoby badanie komponent ukrytych niż poszczególnych załamków krzywej potencjału wywołanego, która stanowi ważoną sumę owych komponentów. Zanim przejdziemy do omówienia technik służących &amp;amp;bdquo;wyłuskiwaniu&amp;amp;rdquo; komponent prześledźmy kilka symulacji i wnioski z nich płynące.&lt;br /&gt;
&lt;br /&gt;
==== Załamki i komponenty nie są tym samym.====&lt;br /&gt;
Tę samą krzywą można otrzymać na nieskończenie wiele sposobów  przez sumowanie rożnych kombinacji domniemanych komponentów. Przykładowy rysunek pokazuje, jak tę samą krzywą można złożyć z dwóch rożnych zestawów komponentów (kod wytwarzający przykładową symulację pokazany jest poniżej).&lt;br /&gt;
[[Plik:Sumowanie_komponentow1.png|center|thumb|600px| Panel a) przedstawia hipotetyczną krzywą ERP, panel b) jedna z możliwych dekompozycji sygnału w panelu a), panel c) inna możliwa dekompozycja sygnału z panelu a) ]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
from __future__ import division&lt;br /&gt;
import numpy as np&lt;br /&gt;
from matplotlib.pyplot import plot, show ,subplot, figure, title, xlabel, ylabel, ylim&lt;br /&gt;
&lt;br /&gt;
Fs = 1&lt;br /&gt;
t = np.arange(0,700)&lt;br /&gt;
&lt;br /&gt;
C1 = np.exp(-(t-100)**2/(2*30**2))&lt;br /&gt;
C2 = np.exp(-(t-200)**2/(2*50**2))&lt;br /&gt;
C3 = np.exp(-(t-350)**2/(2*100**2))&lt;br /&gt;
ERP = 0.5*C1-C2+C3&lt;br /&gt;
&lt;br /&gt;
C2p = np.concatenate((C2[0:200], np.ones(30), C2[200:700-30] ))&lt;br /&gt;
C3p = ERP - 0.5*C1 + C2p&lt;br /&gt;
ERP_v2 = 0.5*C1-C2p+C3p&lt;br /&gt;
&lt;br /&gt;
subplot(3,1,1)&lt;br /&gt;
plot(t,ERP, t[::10],ERP_v2[::10],'g.')&lt;br /&gt;
ylabel('a)',rotation='horizontal')&lt;br /&gt;
ylim([-1, 1.5])&lt;br /&gt;
&lt;br /&gt;
subplot(3,1,2)&lt;br /&gt;
plot(t,0.5*C1,t,-C2,t,C3)&lt;br /&gt;
ylabel('b)',rotation='horizontal')&lt;br /&gt;
ylim([-1, 1.5])&lt;br /&gt;
&lt;br /&gt;
subplot(3,1,3)&lt;br /&gt;
plot(t,0.5*C1,t,-C2p,t,C3p)&lt;br /&gt;
ylabel('c)',rotation='horizontal')&lt;br /&gt;
ylim([-1, 1.5])&lt;br /&gt;
&lt;br /&gt;
show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Zmiana jednej komponenty może powodować zmiany w amplitudzie i latencji więcej niż jednego załamka.====&lt;br /&gt;
Poniższy rysunek przedstawia sytuację gdy zmiana amplitudy jednego komponentu może znacząco wpływać na amplitudę i latencję innych załamków.&lt;br /&gt;
&lt;br /&gt;
[[Plik:Sumowanie_komponentow2.png|center|thumb|768px| Panel a) przedstawia dwie hipotetyczne krzywe ERP, panel b) panel b i c komponenty z których powstały owe krzywe. Zmiana amplitudy komponentu oznaczonego kolorem powoduje zmianę amplitudy oznaczonych załamków ale także zmianę latencji wcześniejszego załamka. ]]&lt;br /&gt;
Poniżej kod odtwarzający powyższy przykład:&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
from __future__ import division&lt;br /&gt;
import numpy as np&lt;br /&gt;
from matplotlib.pyplot import plot, show, subplot, figure, title, xlabel, ylabel, ylim&lt;br /&gt;
&lt;br /&gt;
Fs = 1&lt;br /&gt;
t = np.arange(0,700)&lt;br /&gt;
&lt;br /&gt;
C1 = np.exp(-(t-100)**2/(2*30**2))&lt;br /&gt;
C2 = np.exp(-(t-200)**2/(2*50**2))&lt;br /&gt;
C3 = np.exp(-(t-350)**2/(2*100**2))&lt;br /&gt;
ERP1 = 0.5*C1-C2+C3&lt;br /&gt;
ERP2 = 0.5*C1-C2+1.5*C3&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
subplot(3,1,1)&lt;br /&gt;
plot(t,ERP1,'b', t,ERP2,'g')&lt;br /&gt;
plot(t[np.argmin(ERP1)],np.min(ERP1),'r.' )&lt;br /&gt;
plot(t[np.argmax(ERP1)],np.max(ERP1),'m.' )&lt;br /&gt;
plot(t[np.argmin(ERP2)],np.min(ERP2),'r.' )&lt;br /&gt;
plot(t[np.argmax(ERP2)],np.max(ERP2),'m.' )&lt;br /&gt;
&lt;br /&gt;
ylabel('a)',rotation='horizontal')&lt;br /&gt;
ylim([-1, 1.6])&lt;br /&gt;
&lt;br /&gt;
subplot(3,1,2)&lt;br /&gt;
plot(t,0.5*C1,'k',t,-C2,'k',t,C3,'b')&lt;br /&gt;
ylabel('b)',rotation='horizontal')&lt;br /&gt;
ylim([-1, 1.6])&lt;br /&gt;
&lt;br /&gt;
subplot(3,1,3)&lt;br /&gt;
plot(t,0.5*C1,'k',t,-C2,'k',t,1.5*C3,'g')&lt;br /&gt;
ylabel('c)',rotation='horizontal')&lt;br /&gt;
ylim([-1, 1.6])&lt;br /&gt;
&lt;br /&gt;
show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Instrukcje do ćwiczeń =&lt;br /&gt;
&lt;br /&gt;
==Zadanie 1: uśrednianie symulowanych sygnałów==&lt;br /&gt;
w tym ćwiczeniu chcemy pokazać efekty:&lt;br /&gt;
# uśredniania sygnałów związanych fazowo z bodźcem i nieskorelowanych z bodźcem / wpływ liczby realizacji,&lt;br /&gt;
# uśredniania sygnałów z fluktuacją latencji,&lt;br /&gt;
# wpływ filtrów o różnych funkcjach odpowiedzi impulsowej na morfologię uśrednionego potencjału.&lt;br /&gt;
&lt;br /&gt;
===Sygnały testowe===&lt;br /&gt;
Proszę zaimplementować funkcje generujące następujące przebiegi czasowe (oznaczenia: ''F&amp;lt;sub&amp;gt;s&amp;lt;/sub&amp;gt;'' &amp;amp;mdash; częstość próbkowania, ''T'' &amp;amp;mdash; czas trwania w sekundach, [[%C4%86wiczenia_1#Sygna.C5.82y_testowe|analogicznie do tego]]):&lt;br /&gt;
* sinusoida o zadanej częstości ''f'' i fazie &amp;lt;math&amp;gt;\phi&amp;lt;/math&amp;gt;: &amp;lt;tt&amp;gt;y = sin(f, phi, Fs, T)&amp;lt;/tt&amp;gt;,&lt;br /&gt;
* funkcja Gaussa o zadanym położeniu i szerokości &amp;lt;tt&amp;gt;y = g_1(t0, sigma, Fs, T) &amp;lt;/tt&amp;gt;&lt;br /&gt;
: &amp;lt;math&amp;gt;g_1(t) = \exp\left(-\frac{(t-t_0)^2}{2 \sigma^2}\right)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* pochodną funkcji Gaussa o zadanym położeniu i szerokości &amp;lt;tt&amp;gt;y = g_2(t0, sigma, Fs, T)&amp;lt;/tt&amp;gt;,&lt;br /&gt;
* połowę funkcji Gaussa o zadanym położeniu i szerokości &amp;lt;tt&amp;gt;y = g_3(t0, sigma, Fs, T)&amp;lt;/tt&amp;gt;,&lt;br /&gt;
: &amp;lt;math&amp;gt;g_{3}(t) = \left\{ &lt;br /&gt;
\begin{array}{lll}&lt;br /&gt;
0 &amp;amp; \mathrm{dla}&amp;amp; t&amp;lt;t_0 \\&lt;br /&gt;
\exp\left(-\frac{(t-t_0)^2}{2 \sigma^2}\right)&amp;amp; \mathrm{dla}&amp;amp; t \ge t_0  &lt;br /&gt;
\end{array}&lt;br /&gt;
\right. &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
W dalszych zadaniach tej sekcji przyjmiemy:&lt;br /&gt;
* ''T'' = 1 s,&lt;br /&gt;
* ''F&amp;lt;sub&amp;gt;s&amp;lt;/sub&amp;gt;'' = 128 Hz,&lt;br /&gt;
* ''t''&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; = 0,3 s,&lt;br /&gt;
* &amp;amp;sigma; = 0,02 s.&lt;br /&gt;
&lt;br /&gt;
===Uśrednianie w modelu addytywnym: sygnał + szum===&lt;br /&gt;
Dla funkcji &amp;lt;math&amp;gt;g_1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;g_2&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;g_3&amp;lt;/math&amp;gt;  wykonaj ''N'' symulacji sygnału opisanego daną funkcją z dodanym szumem gaussowskim (&amp;lt;tt&amp;gt;numpy.random.randn&amp;lt;/tt&amp;gt;). Zaobserwuj zmianę wariancji uśrednianego sygnału wraz z ''N''.&lt;br /&gt;
&lt;br /&gt;
===Uśrednianie w modelu addytywnym: sygnał + szum + niezależna czynność rytmiczna===&lt;br /&gt;
Powtórz poprzednie symulacje dokładając w każdej realizacji sinusoidę o losowo wybranej fazie. Symulacje wykonaj dla różnych częstości sinusoidy, takich których połówka okresu zbliżona jest do szerokości funkcji Gaussa, oraz znacząco od niej różnych.&lt;br /&gt;
&lt;br /&gt;
===Uśrednianie w modelu z resetem fazy===&lt;br /&gt;
Zbuduj sygnał składający się z dwóch fragmentów sinusoidy o częstości ''f'': &lt;br /&gt;
* pierwszy fragment ma losową fazę,&lt;br /&gt;
* drugi fragment ma fazę równą 0.&lt;br /&gt;
Wykonaj ''N'' realizacji takiego sygnału, przy czym każda realizacja ma częstość losowaną z rozkładu Gaussa o średniej 10 i pewnej wariancji (czyli &amp;lt;math&amp;gt;f \in \mathrm{N}(10,\sigma)&amp;lt;/math&amp;gt;). &lt;br /&gt;
Uśrednij otrzymane realizacje. Zaobserwuj zależność średniej od liczby uśrednianych realizacji i od wariancji częstości.&lt;br /&gt;
&lt;br /&gt;
===Uśrednianie potencjału z fluktuacją latencji===&lt;br /&gt;
Wygeneruj sygnały składające się z funkcji &amp;lt;math&amp;gt;g_1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;g_2&amp;lt;/math&amp;gt; albo &amp;lt;math&amp;gt;g_3&amp;lt;/math&amp;gt; z fluktuującą latencją, tzn. z wartością &amp;lt;math&amp;gt;t_0&amp;lt;/math&amp;gt; pochodzącą z jakiegoś rozkładu prawdopodobieństwa. U nas dla ustalenia uwagi niech będzie to rozkład Gaussa. Wykonaj zestaw symulacji obrazujący zależność od liczby realizacji i od wielkości fluktuacji, mierzonej przez wariancję rozkładu. Czy jest związek pomiędzy wariancją fluktuacji &amp;lt;math&amp;gt;t_0&amp;lt;/math&amp;gt; a szerokością załamków?&lt;br /&gt;
&lt;br /&gt;
===Wpływ filtrów===&lt;br /&gt;
# Zaprojektuj następujące filtry (przyjmij częstość próbkowania 128 Hz):&lt;br /&gt;
#* dolnoprzepustowy: Butterwortha z częstością odcięcia: 30, 40, 50 Hz, i rzędach od 1 do 5 (funkcja butter w module scipy.signal),&lt;br /&gt;
#* górnoprzepustowy: Butterwortha z częstością odcięcia: 0,1, 0,5, 2 i 5 Hz, i rzędach od 1 do 5,&lt;br /&gt;
#* notch: Czybyszewa II rodzaju z pasmem zaporowym ustawionym na 50 Hz, i rzędach od 1 do 3 (funkcja cheby2),&lt;br /&gt;
# Zbadaj funkcję odpowiedzi impulsowej i funkcję przenoszenia tych filtrów (w skali dB). Zaobserwuj jak długa jest odpowiedź impulsowa i jak daleko od częstości odcięcia zaburzone jest pasmo przenoszenia.&lt;br /&gt;
# Zastosuj powyższe filtry do funkcji &amp;lt;math&amp;gt;g_1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;g_2&amp;lt;/math&amp;gt; albo &amp;lt;math&amp;gt;g_3&amp;lt;/math&amp;gt;. Filtrowanie przeprowadź w jedną (lfilter) oraz w dwie strony (filtfilt). Zaobserwuj związek między zniekształceniem wprowadzanym przez filtr a funkcją odpowiedzi impulsowej filtru.&lt;br /&gt;
# W ćwiczeniu tym posłuż się symulowanymi sygnałami uzyskanymi z modelu addytywnego: &amp;amp;bdquo;sygnał+szum&amp;amp;rdquo;. Dla funkcji &amp;lt;math&amp;gt;g_1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;g_2&amp;lt;/math&amp;gt; albo &amp;lt;math&amp;gt;g_3&amp;lt;/math&amp;gt;  wykonaj ''N'' = 60 realizacji sygnału opisanego daną funkcją z dodanym szumem gaussowskim (&amp;lt;tt&amp;gt;numpy.random.randn&amp;lt;/tt&amp;gt;). Każdą z realizacji przefiltruj, a następnie uśrednij uzyskane sygnały.&lt;br /&gt;
&lt;br /&gt;
==Zadanie 2: rejestracje i analiza potencjałów wzrokowych==&lt;br /&gt;
&lt;br /&gt;
===Synchronizacja występowania bodźców z sygnałem EEG===&lt;br /&gt;
&lt;br /&gt;
Rejestracja potencjałów wywołanych jest przykładem pomiaru czynności elektrycznej mózgu w odpowiedzi na określony bodziec. W przypadku tego rodzaju pomiarów konieczna jest synchronizacja momentu wystąpienia bodźca z sygnałem EEG. Wzmacniacze do pomiaru czynności elektrycznej mózgu wyposażone są w specjalne wejścia, na które można podawać sygnał odpowiadający pojawianiu się bodźca. Jak pamiętamy z zeszłego semestru, wejście to (jak i podawany na nie sygnał) nazywamy trigerem (ang. ''trigger'' &amp;amp;mdash; spust, cyngiel, wyzwalacz). W najprostszym przypadku, bodziec moglibyśmy wyświetlać na monitorze komputerowym, a sygnał związany z jego wystąpieniem wysyłać przez któryś z portów komputera (LPT, COM) na wzmacniacz EEG. Niestety, obecnie dostępne i popularne systemy operacyjne, takie jak Windows czy Linux nie są systemami czasu rzeczywistego (http://pl.wikipedia.org/wiki/System_operacyjny_czasu_rzeczywistego). Od momentu wyświetlania bodźca na ekranie, do pojawiania się sygnału odpowiednim porcie komputerowym może upłynąć kilkadziesiąt milisekund i co gorsza czas ten zwykle jest losowy. W przypadku gdy wzmacniacz próbkuje sygnał z częstością 1000 Hz, moment wystąpienia bodźca możemy określić z dokładnością 1 ms, jednakże wspomniane opóźnienia w systemie operacyjnym uniemożliwiają to. Ponadto, jak dowiedzieliśmy się w rozdziale wstępnym [http://brain.fuw.edu.pl/edu-wiki/action/edit/EEG:Potencja%C5%82y_wywo%C5%82ane?section=T-1], pierwsze załamki związane z potencjałami wywołanymi pojawiają się już 10 ms po wystąpieniu bodźca. W związku z tym, losowe, rzędu kilkudziesięciu milisekund opóźnienia sygnału określającego moment pojawienia się bodźca względem jego rzeczywistego wystąpienia są niedopuszczalne.&lt;br /&gt;
Istnieją pewne techniki programowania, dzięki którym opisywane opóźnienia można zmniejszyć, jednakże są one bardzo trudne  do realizacji. Ponadto, standardowe porty komputera, takie jak LPT, czy COM zostały zaprojektowane przede wszystkim do sterowania urządzeniami zewnętrznymi, a nie ich zasilania. Przykładowo, jedna linia portu drukarkowego (LPT) może być obciążona prądem nie większym niż 5 mA, podczas gdy do zapalenie zwykłej diody LED potrzeba około 10 mA. Taki pobór prądu możliwy jest do uzyskania z portu USB, jednakże  jest on  wyjątkowo trudny do oprogramowania.  &lt;br /&gt;
W celu ominięcia powyższych niedogodności w Zakładzie Fizyki Biomedycznej UW w przeprowadzanych eksperymentach wykorzystywane są  mikrokontrolery [http://pl.wikipedia.org/wiki/Mikrokontroler], w szczególności ATmega16 i ATmega32.  Mikrokontrolery te wyposażone są w procesory o architekturze RISC [http://pl.wikipedia.org/wiki/RISC] i mocy obliczeniowej porównywalnej z szeroko stosowanym kiedyś w komputerach ZX Spectrum, Commodore, Amiga i Atari procesorem Z80. Oprócz jednostki centralnej mikrokontrolery zawierają   stałą pamięć FLASH przeznaczoną do przechowywania kodu programu, pamięć  RAM i pamięć EEPROM, liczniki 8- i 16-bitowe, komparatory, przetworniki analogowo-cyfrowe, porty wejścia/wyjścia, łącze RS232 (popularnie nazywane portem szeregowym) i układy przerwań.&lt;br /&gt;
&lt;br /&gt;
Mikrokontrolery wchodzące w skład zestawów pomiarowych na Pracowni EEG zawierają program, który umożliwia komunikację z nimi poprzez port szeregowy. Obecnie, komputery są coraz rzadziej wyposażane w porty szeregowe. Standard komunikacji RS-232, opracowany w 1962 roku  nadal jest jednak popularny i często wykorzystywany do komunikacji miedzy urządzeniami.  W celu połączenia komputera posiadającego tylko porty USB z mikrokontrolerem zastosowano przejściówkę USB/RS-232. &lt;br /&gt;
&lt;br /&gt;
Jak każde urządzenie w systemie Linuks, przejściówka USB/RS-232 widoczna jest jako plik, znajdujący się w katalogu &amp;lt;tt&amp;gt;/dev&amp;lt;/tt&amp;gt;. Nazwy plików obsługujących urządzenia szeregowe to &amp;lt;tt&amp;gt;ttyXY&amp;lt;/tt&amp;gt;, gdzie &amp;lt;tt&amp;gt;XY&amp;lt;/tt&amp;gt; to kolejny numer przydzielony do urządzenia szeregowego.&lt;br /&gt;
Do komunikacji komputera z mikroknotrolerem  w Zakładzie Fizyki Biomedycznej UW została napisana prosta biblioteka.  Jej użycie jest następujące:&lt;br /&gt;
* Po podłączeniu przejściówki USB/RS232 do komputera mikrokontrolera sprawdź jaki plik w katalogu &amp;lt;tt&amp;gt;/dev&amp;lt;/tt&amp;gt; został utworzony i przydzielony do urządzenia. &lt;br /&gt;
* Zaimportuj bibliotekę do komunikacji z mikrokontrolerem: &lt;br /&gt;
: &amp;lt;tt&amp;gt;import SerialPort as SP&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Otwórz plik powiązany z urządzeniem zewnętrznym:&lt;br /&gt;
: &amp;lt;tt&amp;gt;sp = SP.SerialPort(nazwa_pliku) &amp;lt;/tt&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
: &amp;lt;tt&amp;gt;sp.open()&amp;lt;/tt&amp;gt;&lt;br /&gt;
W naszym przypadku prawidłowa nazwa pliku to &amp;lt;tt&amp;gt;/dev/ttyUSB0&amp;lt;/tt&amp;gt;.&lt;br /&gt;
* Po włączeniu zasilania mikrokontrolera, diody podłączone do niego i wykorzystywane w eksperymencie z potencjałami wywołanymi będą zapalone. Następujące polecenie zgasi obydwie diody:&lt;br /&gt;
: &amp;lt;tt&amp;gt;sp.blinkP300([0, 0])&amp;lt;/tt&amp;gt;&lt;br /&gt;
* Wydanie poniższego polecenia spowoduje, iż mikrokontroler zapali podłączoną do niego diodę numer 1 na czas 100 ms, zaś diodę numer 2 na 200 ms. Jednocześnie, w momencie włączenia jak i wyłączenia diody, sygnał z mikrokontrolera zostanie wysłany na 5-stykowe wejście AUX mikrokontrolera:&lt;br /&gt;
: &amp;lt;tt&amp;gt;sp.blinkP300([100, 200])&amp;lt;/tt&amp;gt;&lt;br /&gt;
* Jeśli chcemy zapalić tylko diodę numer dwa, np. na czas 500 ms w programie podajemy następującą instrukcję:&lt;br /&gt;
: &amp;lt;tt&amp;gt;sp.blinkP300([0, 500])&amp;lt;/tt&amp;gt;&lt;br /&gt;
* Jeśli chcemy zakończyć komunikację z mikrokontrolerem piszemy:&lt;br /&gt;
: &amp;lt;tt&amp;gt;sp.close()&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Kod biblioteki do komunikacji z mikrokontrolerem:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;!--  Kod w Pythonie 2&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# -*- coding: cp1250 -*-&lt;br /&gt;
import serial&lt;br /&gt;
import logging&lt;br /&gt;
import sys&lt;br /&gt;
import os&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def to_hex_word(a):&lt;br /&gt;
    '''encodes a decimal number hexadecimally on two bytes'''&lt;br /&gt;
    return chr(a%256) + chr(a/256)&lt;br /&gt;
&lt;br /&gt;
class SerialPort(object):&lt;br /&gt;
    def __init__(self, port_name):&lt;br /&gt;
        import serial&lt;br /&gt;
        try:&lt;br /&gt;
            self.port = serial.Serial(&lt;br /&gt;
                port=port_name,&lt;br /&gt;
                baudrate=9600,&lt;br /&gt;
                bytesize=serial.EIGHTBITS,&lt;br /&gt;
                parity=serial.PARITY_NONE,&lt;br /&gt;
                stopbits=serial.STOPBITS_ONE,&lt;br /&gt;
                xonxoff=False&lt;br /&gt;
                )&lt;br /&gt;
        except serial.SerialException as e:&lt;br /&gt;
            print(&amp;quot;Nieprawidłowa nazwa portu lub port zajęty.&amp;quot;)&lt;br /&gt;
            raise e&lt;br /&gt;
        self.close()&lt;br /&gt;
        &lt;br /&gt;
    def open(self):&lt;br /&gt;
        self.port.open()&lt;br /&gt;
&lt;br /&gt;
    def close(self):&lt;br /&gt;
        self.port.close()&lt;br /&gt;
&lt;br /&gt;
    def send(self, value):&lt;br /&gt;
        self.port.write(value)&lt;br /&gt;
                           &lt;br /&gt;
    def blinkSSVEP(self,d, p1, p2):&lt;br /&gt;
        '''&lt;br /&gt;
        d = list of frequencies;&lt;br /&gt;
        p1:p2 = ratio LED_on_time/LED_off_time&lt;br /&gt;
        if you want i-th LED to be OFF all the time send  d[i] = 0&lt;br /&gt;
        if you want i-th LED to be ON all the time send  d[i] = -1&lt;br /&gt;
        in these two cases p1 and p2 do not matter&lt;br /&gt;
        '''&lt;br /&gt;
        clock  = 62500&lt;br /&gt;
        factor = float(p1) / float(p1 + p2)&lt;br /&gt;
    &lt;br /&gt;
        str = chr(3) # 'SSVEP_RUN'&lt;br /&gt;
&lt;br /&gt;
        for i in range(len(d)):&lt;br /&gt;
            # i-th LED OFF&lt;br /&gt;
            if d[i] == 0:                       &lt;br /&gt;
                str += to_hex_word(0) + to_hex_word(255) &lt;br /&gt;
            # i-th LED ON&lt;br /&gt;
            elif d[i] == -1:&lt;br /&gt;
                str += to_hex_word(255) + to_hex_word(0)&lt;br /&gt;
                #str = 'S'&lt;br /&gt;
                # i-th LED blinks d[i] times per second&lt;br /&gt;
                # p1:p2 = on_time:off_time in one blink&lt;br /&gt;
            else:&lt;br /&gt;
                period = clock/d[i]&lt;br /&gt;
                bright = int((clock/d[i]) * factor)&lt;br /&gt;
                dark = period - bright&lt;br /&gt;
                str += to_hex_word(bright) + to_hex_word(dark)&lt;br /&gt;
&lt;br /&gt;
        self.send(str)&lt;br /&gt;
&lt;br /&gt;
    def blinkP300(self,d):&lt;br /&gt;
        clock  = 62500&lt;br /&gt;
        str = chr(4) # 'P300_RUN'&lt;br /&gt;
&lt;br /&gt;
        for i in range(len(d)):&lt;br /&gt;
            period = int(clock*d[i]/1000.0)&lt;br /&gt;
            str += to_hex_word(period)&lt;br /&gt;
            print(period)&lt;br /&gt;
&lt;br /&gt;
        self.send(str)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
--&amp;gt; &amp;lt;!-- Kod w Pythonie 3 --&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# -*- coding: cp1250 -*-&lt;br /&gt;
import serial&lt;br /&gt;
import logging&lt;br /&gt;
import sys&lt;br /&gt;
import os&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
def to_hex_word(a):&lt;br /&gt;
    '''encodes a decimal number hexadecimally on two bytes'''&lt;br /&gt;
    return a.to_bytes(2,byteorder=sys.byteorder)&lt;br /&gt;
 &lt;br /&gt;
class SerialPort(object):&lt;br /&gt;
    def __init__(self, port_name):&lt;br /&gt;
        import serial&lt;br /&gt;
        try:&lt;br /&gt;
            self.port = serial.Serial(&lt;br /&gt;
                port=port_name,&lt;br /&gt;
                baudrate=9600,&lt;br /&gt;
                bytesize=serial.EIGHTBITS,&lt;br /&gt;
                parity=serial.PARITY_NONE,&lt;br /&gt;
                stopbits=serial.STOPBITS_ONE,&lt;br /&gt;
                xonxoff=False&lt;br /&gt;
                )&lt;br /&gt;
        except serial.SerialException as e:&lt;br /&gt;
            print(&amp;quot;Nieprawidłowa nazwa portu lub port zajęty.&amp;quot;)&lt;br /&gt;
            raise e&lt;br /&gt;
        self.close()&lt;br /&gt;
 &lt;br /&gt;
    def open(self):&lt;br /&gt;
        self.port.open()&lt;br /&gt;
 &lt;br /&gt;
    def close(self):&lt;br /&gt;
        self.port.close()&lt;br /&gt;
 &lt;br /&gt;
    def send(self, value):&lt;br /&gt;
        self.port.write(value)&lt;br /&gt;
 &lt;br /&gt;
    def blinkSSVEP(self,d, p1, p2):&lt;br /&gt;
        '''&lt;br /&gt;
        d = list of frequencies;&lt;br /&gt;
        p1:p2 = ratio LED_on_time/LED_off_time&lt;br /&gt;
        if you want i-th LED to be OFF all the time send  d[i] = 0&lt;br /&gt;
        if you want i-th LED to be ON all the time send  d[i] = -1&lt;br /&gt;
        in these two cases p1 and p2 do not matter&lt;br /&gt;
        '''&lt;br /&gt;
        clock  = 62500&lt;br /&gt;
        factor = float(p1) / float(p1 + p2)&lt;br /&gt;
 &lt;br /&gt;
        str = (3).to_bytes(1,byteorder=sys.byteorder) # 'SSVEP_RUN'&lt;br /&gt;
 &lt;br /&gt;
        for i in range(len(d)):&lt;br /&gt;
            # i-th LED OFF&lt;br /&gt;
            if d[i] == 0:                       &lt;br /&gt;
                str += to_hex_word(0) + to_hex_word(255) &lt;br /&gt;
            # i-th LED ON&lt;br /&gt;
            elif d[i] == -1:&lt;br /&gt;
                str += to_hex_word(255) + to_hex_word(0)&lt;br /&gt;
                #str = 'S'&lt;br /&gt;
                # i-th LED blinks d[i] times per second&lt;br /&gt;
                # p1:p2 = on_time:off_time in one blink&lt;br /&gt;
            else:&lt;br /&gt;
                period = clock/d[i]&lt;br /&gt;
                bright = int((clock/d[i]) * factor)&lt;br /&gt;
                dark = int(period - bright)&lt;br /&gt;
                str += to_hex_word(bright) + to_hex_word(dark)&lt;br /&gt;
 &lt;br /&gt;
        self.send(str)&lt;br /&gt;
 &lt;br /&gt;
    def blinkP300(self,d):&lt;br /&gt;
        clock  = 62500&lt;br /&gt;
        str = (4).to_bytes(1,byteorder=sys.byteorder) # 'P300_RUN'&lt;br /&gt;
 &lt;br /&gt;
        for i in range(len(d)):&lt;br /&gt;
            period = int(clock*d[i]/1000.0)&lt;br /&gt;
            str += to_hex_word(period)&lt;br /&gt;
 &lt;br /&gt;
        self.send(str)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Zestaw eksperymentalny===&lt;br /&gt;
Zestaw składa się ze:&lt;br /&gt;
* wzmacniacza,&lt;br /&gt;
* stymulatora &amp;amp;mdash; układ zapalający i gaszący diodę w kontrolowany sposób,  &lt;br /&gt;
* izolowanego galwanicznie układu generującego impulsy odpowiadające gaszeniu i zapalaniu diody,  o wartościach dopasowanych do akceptowalnych przez wejścia AUX wzmacniacza,&lt;br /&gt;
* komputera: w tym eksperymencie komputer będzie służył do zaprogramowania stymulatora i do rejestracji sygnałów.&lt;br /&gt;
&lt;br /&gt;
===Wersja 1: obserwacja błyskającej diody  ===&lt;br /&gt;
&amp;lt;!--Proszę zapoznać się ze standardami rejestracji wzrokowych potencjałów wywołanych [http://www.gcu.ac.uk/media/gcalwebv2/theuniversity/academicschools/sls/psytimetables/SLS%20-%20VEP_Standard_2010.pdf] --&amp;gt;&lt;br /&gt;
Proszę zapoznać się z typowym wyglądem załamków w przypadku potencjałów wzrokowych, jaki jest przedstawiony na [https://static-content.springer.com/image/art%3A10.1007%2Fs10633-009-9195-4/MediaObjects/10633_2009_9195_Fig4_HTML.gif tym rysunku] (cały artykuł jest dostępny [http://link.springer.com/article/10.1007%2Fs10633-009-9195-4 tu]).&lt;br /&gt;
&amp;lt;!--[[Plik:Fig 4 VEP.jpg|thumb|320px|right|&amp;lt;figure id=&amp;quot;fig:zalamki_VEP&amp;quot;&amp;gt;&amp;lt;/figure&amp;gt;&lt;br /&gt;
&amp;lt;xr id=&amp;quot;fig:zalamki_VEP&amp;quot;&amp;gt;Rys. %i.&amp;lt;/xr&amp;gt; Schemat załamków rozpoznawanych we wzrokowych potencjach wywołanych (z pracy: J. V. Odom i in. &amp;amp;bdquo;ISCEV standard for clinical visual evoked potentials&lt;br /&gt;
(2009 update)&amp;amp;rdquo;, Doc Ophthalmol (2010), 120:111–119).]]&lt;br /&gt;
--&amp;gt; &lt;br /&gt;
&lt;br /&gt;
==== Rejestracja ====&lt;br /&gt;
* Paradygmat: z odległości około 40 cm badany obserwuje błyski diody. Błyski powtarzają się co 1&amp;amp;plusmn;0,1 sekundy. Każdy błysk trwa 20 ms. Rejestrujemy 2 serie po 100 błysków. Częstość próbkowania 512 Hz.&lt;br /&gt;
** W pierwszej serii błyskamy tylko jedną diodą.&lt;br /&gt;
** W drugiej serii błyskamy dwiema diodami. &lt;br /&gt;
Pomiędzy seriami badany odpoczywa około 2 min. Diody powinny być ustawione na jednakową jasność błysków.&lt;br /&gt;
&lt;br /&gt;
* Pomiar&lt;br /&gt;
**Zakładamy czepek i elektrody w systemie 10-20, dbamy o to by opory pomiędzy elektrodami były poniżej 5 k&amp;amp;Omega; i różnice pomiędzy oporami różnych elektrod nie przekraczały 20%. [[Plik:Glowka10-20 ERPy.svg|thumb|600px|right]]&lt;br /&gt;
** Elektrodę GND mocujemy w otworze czepka odpowiadającym pozycji AFz (na linii centralnej 10% w stronę nosa od elektrody Fz) &lt;br /&gt;
** Montujemy także elektrodę FCz (na linii centralnej pomiędzy Fz a Cz), będziemy jej używać w montażu i w czasie analizy jako referencji.&lt;br /&gt;
&lt;br /&gt;
==== Analiza ====&lt;br /&gt;
# Filtrujemy sygnał w paśmie 1-20 Hz.&lt;br /&gt;
# Z ciągłego zapisu wycinamy fragmenty od &amp;amp;minus;300 ms do +400 ms (zero oznacza moment wystąpienia bodźca). W czasie wycinania badamy wycinane fragmenty pod względem zakresu amplitudy (wszystkie kanały powinny mieć amplitudę w granicach &amp;amp;plusmn;75 &amp;amp;mu;V) i zawartości artefaktów od mrugania (w tym celu trzeba oglądając sygnał w SVAROG-u ustalić próg na amplitudę sygnału w kanałach Fp1 i Fp2).&lt;br /&gt;
# Uśredniamy wycięte sygnały.&lt;br /&gt;
# Rysujemy średni potencjał we wszystkich kanałach.&lt;br /&gt;
# Identyfikujemy załamki N2 i P2. Mierzymy amplitudę P2 jako różnicę między ekstremalną wartością załamka P2 a ekstremalną wartością załamka N2. &lt;br /&gt;
&lt;br /&gt;
[[Plik:ZalamkiN2_P2.png‎|thumb|600px|right|  Uśredniony potencjał wywołany dla serii 1 i 2 na kanale T5 z zaznaczonymi załamkami N2 i P2. Na osi poziomej czas [s] natomiast na pionowej amplituda [μV].]]&lt;br /&gt;
Pomiar wykonujemy dla obu serii błysków.&lt;br /&gt;
&lt;br /&gt;
Pytanie: Czy intensywność bodźca wpływa na amplitudę potencjału P2?&lt;br /&gt;
Jak stwierdzić czy amplitudy załamków P2 istotnie różnią się pomiędzy seriami?&lt;br /&gt;
&lt;br /&gt;
Musimy przeprowadzić test statystyczny. Możemy skonstruować go np. tak:&lt;br /&gt;
Mamy dwa warunki I i II. Jako statystykę przyjmiemy różnicę pomiędzy amplitudą załamka zmierzoną w serii z dwoma diodami (P2&amp;lt;sub&amp;gt;II&amp;lt;/sub&amp;gt;) a amplitudą zmierzoną w serii z jedną diodą (P2&amp;lt;sub&amp;gt;I&amp;lt;/sub&amp;gt;):&lt;br /&gt;
: ''S'' = P2&amp;lt;sub&amp;gt;II&amp;lt;/sub&amp;gt; &amp;amp;minus; P2&amp;lt;sub&amp;gt;I&amp;lt;/sub&amp;gt;&lt;br /&gt;
Postawmy hipotezę zerową, że nie ma różnicy w amplitudzie pomiędzy warunkiem II a I oraz hipotezę alternatywną, że różnica taka występuje.&lt;br /&gt;
: H&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;: ''S'' = 0&lt;br /&gt;
: H&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;: ''S'' &amp;amp;ne; 0&lt;br /&gt;
Zgodnie z H&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; dla wartości ''S'' nie ma różnicy czy realizacja została zarejestrowana w warunkach I czy II, zatem można losowo poprzypisywać numery warunków do realizacji i w ten sposób uzyskać rozkład statystyki ''S'' pod warunkiem prawdziwości H&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;, czyli obliczyć średnie potencjały dla &amp;amp;bdquo;pomieszanych&amp;amp;rdquo; tagów, wyliczyć średnie potencjały dla sztucznie wygenerowaych grup, i wyliczyć różnicę amplitud dla tych średnich, czyli wartość statystyki dla hipotezy H&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Zaimplementuj test permutacyjny zgodny z powyższą koncepcją.&lt;br /&gt;
&lt;br /&gt;
===Wersja 2: obserwacja habituacji / uśrednianie w blokach ===&lt;br /&gt;
==== Rejestracja ====&lt;br /&gt;
# Paradygmat: &lt;br /&gt;
#* z odległości około 40 cm badany obserwuje błyski diody. &lt;br /&gt;
#* Błyski powtarzają się co 0,5 sekundy. &lt;br /&gt;
#* Rejestrujemy 60 serii po 15 błysków.  &lt;br /&gt;
#* Pomiędzy seriami badany odpoczywa około 10 sekund.&lt;br /&gt;
# Zakładamy czepek i elektrody w systemie 10-20, dbamy o to by opory pomiędzy elektrodami były poniżej 5 k&amp;amp;Omega; i różnice pomiędzy oporami różnych elektrod nie przekraczały 20%.&lt;br /&gt;
#* Elektrodę GND mocujemy w otworze czepka odpowiadającym pozycji AFz (na linii centralnej 10% w stronę nosa od elektrody Fz) &lt;br /&gt;
#* Montujemy także elektrodę FCz (na linii centralnej pomiędzy Fz a Cz), będziemy jej używać w montażu i w czasie analizy jako referencji.&lt;br /&gt;
#* Częstość próbkowania 512 Hz.&lt;br /&gt;
&lt;br /&gt;
==== Analiza ====&lt;br /&gt;
# Filtrujemy sygnał w paśmie 0,1-20 Hz.&lt;br /&gt;
# Z ciągłego zapisu wycinamy fragmenty od &amp;amp;minus;300 ms do +600 ms (zero oznacza moment wystąpienia bodźca). W czasie wycinania badamy wycinane fragmenty pod względem zakresu amplitudy (wszystkie kanały powinny mieć amplitudę w granicach &amp;amp;plusmn;75 &amp;amp;mu;V) i zawartości artefaktów od mrugania (w tym celu trzeba oglądając sygnał w SVAROG-u ustalić próg na amplitudę sygnału w kanałach Fp1 i Fp2).&lt;br /&gt;
# Uśredniamy wycięte sygnały o tym samym numerze wewnątrz serii.&lt;br /&gt;
# Rysujemy serie 15 uśrednionych potencjałów dla tego kanału, który wykazywał najsilniejszy potencjał w pierwszej wersji eksperymentu.&lt;br /&gt;
&lt;br /&gt;
==Zadanie 3: rejestracja i analiza potencjału P3 ==&lt;br /&gt;
==== Rejestracja ====&lt;br /&gt;
# Paradygmat: &lt;br /&gt;
#* z odległości około 40 cm badany obserwuje błyski diody. &lt;br /&gt;
#* Błyski diody nr 1 powtarzają się co 1&amp;amp;plusmn;0,1 sekundy. &lt;br /&gt;
#* W losowych realizacjach zapalana jest także dioda nr 2. &lt;br /&gt;
#* Proporcja pomiędzy liczbą błysków pojedynczych i podwójnych powinna wynosić 10:2, przy czym błyski podwójne muszą być odseparowane co najmniej jednym błyskiem pojedynczym. &lt;br /&gt;
#* Czas zapalenia diod, tak jak w poprzednich eksperymentach, wynosi 20 ms. &lt;br /&gt;
#* Zadaniem badanego jest liczenie liczby błysków podwójnych.&lt;br /&gt;
#* Wykonujemy tyle realizacji aby zarejestrować 50 powtórzeń podwójnych błysków. &lt;br /&gt;
# Zakładamy czepek i elektrody w systemie 10-20, dbamy o to by opory pomiędzy elektrodami były poniżej 5 k&amp;amp;Omega; i różnice pomiędzy oporami różnych elektrod nie przekraczały 20%.&lt;br /&gt;
#* Elektrodę GND mocujemy w otworze czepka odpowiadającym pozycji AFz (na linii centralnej 10% w stronę nosa od elektrody Fz) &lt;br /&gt;
#* Montujemy także elektrody M1 i M2, będziemy ich używać w montażu i w czasie analizy jako referencji typu połączone uszy.&lt;br /&gt;
#* Częstość próbkowania 512 Hz.&lt;br /&gt;
&lt;br /&gt;
==== Analiza ====&lt;br /&gt;
# Filtrujemy sygnał w paśmie 0,1-20 Hz.&lt;br /&gt;
# Z ciągłego zapisu wycinamy fragmenty od &amp;amp;minus;300 ms do +600 ms (zero oznacza moment wystąpienia bodźca). W czasie wycinania badamy wycinane fragmenty pod względem zakresu amplitudy (wszystkie kanały powinny mieć amplitudę w granicach &amp;amp;plusmn;75 &amp;amp;mu;V) i zawartości artefaktów od mrugania (w tym celu trzeba oglądając sygnał w SVAROG-u ustalić próg na amplitudę sygnału w kanałach Fp1 i Fp2).&lt;br /&gt;
# Uśredniamy osobno realizacje błysków pojedynczych i błysków podwójnych.&lt;br /&gt;
# Nakładamy na siebie na rysunkach oba typy średnich.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Ćwiczenie dodatkowe: P300 BCI==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wykorzystujemy elektrody z systemu 10-10 umieszczone nad korą wzrokową: P07, O1, O2, PO8, PO3, PO4, Pz, Cz.&lt;br /&gt;
&lt;br /&gt;
Uruchamiamy &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
obci_gui --presets eeg_workshop&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
i z guzika &amp;amp;bdquo;select amplifier&amp;amp;rdquo; wybieramy właściwy wzmacniacz.&lt;br /&gt;
&lt;br /&gt;
Do kontroli jakości sygnału możemy uruchomić Svaroga.&lt;br /&gt;
&lt;br /&gt;
Dane z kalibracji zapisują się w pliku test1 w katalogu domowym użytkownika, z labiryntu w pliku test2.&lt;br /&gt;
&lt;br /&gt;
Po zakończeniu kalibracji pojawia się napis &amp;amp;bdquo;Trwają obliczenia&amp;amp;rdquo; lub podobny. Odczekujemy kilka minut, aż skończy się peer &amp;amp;bdquo;Calibration&amp;amp;rdquo; (widoczny w obci_gui) i zamykamy okienko klawiszami Alt-F4 lub zatrzymując scenariusz guzikiem &amp;amp;bdquo;Stop&amp;amp;rdquo;. W katalogu domowym pojawi się plik z wynikami kalibracji, co pozwala na uruchomienie scenariusza &amp;amp;bdquo;labirynt&amp;amp;rdquo;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Po zebraniu danych, przed wczytaniem ich do Svaroga należy w tym samym katalogu uruchomić skrypt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
#!/usr/bin/env python&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
&lt;br /&gt;
from obci.analysis.obci_signal_processing.tags import tags_file_writer&lt;br /&gt;
from obci.analysis.obci_signal_processing.read_manager import ReadManager&lt;br /&gt;
&lt;br /&gt;
def main(): &lt;br /&gt;
	file_name = 'test1'&lt;br /&gt;
	&lt;br /&gt;
	mgr = ReadManager(&lt;br /&gt;
		file_name + '.obci.xml',&lt;br /&gt;
		file_name + '.obci.raw',&lt;br /&gt;
		file_name + '.obci.tag')&lt;br /&gt;
	&lt;br /&gt;
	tags = mgr.get_tags()&lt;br /&gt;
	for i in xrange(0, len(tags)):&lt;br /&gt;
		if tags[i]['desc']['index'] == tags[i]['desc']['target']:&lt;br /&gt;
			tags[i]['name'] = 'blink_target'&lt;br /&gt;
		else:&lt;br /&gt;
			tags[i]['name'] = 'blink'&lt;br /&gt;
			&lt;br /&gt;
	tags_writer = tags_file_writer.TagsFileWriter(file_name + '.obci.tag')&lt;br /&gt;
	for tag in tags:&lt;br /&gt;
		tags_writer.tag_received(tag)		&lt;br /&gt;
	tags_writer.finish_saving(0)	&lt;br /&gt;
 &lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Aduszyk</name></author>
		
	</entry>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=Pracownia_EEG/Potencja%C5%82y_wywo%C5%82ane&amp;diff=8965</id>
		<title>Pracownia EEG/Potencjały wywołane</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=Pracownia_EEG/Potencja%C5%82y_wywo%C5%82ane&amp;diff=8965"/>
		<updated>2022-11-08T09:57:03Z</updated>

		<summary type="html">&lt;p&gt;Aduszyk: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Pracownia EEG|Pracownia EEG]] / Potencjały wywołane&lt;br /&gt;
&lt;br /&gt;
=Wstęp=&lt;br /&gt;
==Potencjały wywołane==&lt;br /&gt;
=== Wstęp ===&lt;br /&gt;
Potencjały wywołane EEG (ang. ''evoked potentials'', EP) są śladami odpowiedzi mózgu na bodźce. W przypadku MEG poprawnie mówi się o polach wywołanych (ang. ''evoked fields'', EF).&lt;br /&gt;
Zwykle reakcja ta jest mała (wyjątek stanowią [[Elektroencefalografia/Metody_analizy_sygnałów_EEG_-_analiza_w_dziedzinie_czasu |kompleksy K]]) i w zapisie pojedynczej realizacji reakcji na bodziec najczęściej niewidoczna wśród czynności pochodzącej od wielu innych procesów zachodzących w tym samym czasie w mózgu. &lt;br /&gt;
Ich wyodrębnienie z tak zwanego tła EEG/MEG, czyli manifestacji elektrycznej innych, trwających w tym samym czasie w mózgu procesów (aktywny prąd niezależny), wymaga w dniu dzisiejszym zapisu odpowiedzi na szereg powtórzeń tego samego bodźca (&amp;lt;xr id=&amp;quot;fig:EP&amp;quot;&amp;gt;rys. %i&amp;lt;/xr&amp;gt;). Pierwsze potencjały wywołane pokazał pod koniec lat 40-tych Dawson (Dawson 1947) wykonując superpozycję pojedynczych realizacji na kliszy fotograficznej.&lt;br /&gt;
Z czasem skomplikowane urządzenia analogowe zastąpione zostały przez cyfrowe uśrednianie kolejnych fragmentów EEG, zsynchronizowanych według momentu wystąpienia bodźca, łatwo realizowane za pomocą komputera.&lt;br /&gt;
&lt;br /&gt;
[[Grafika:EP.png|thumb|640px|center|&amp;lt;figure id=&amp;quot;fig:EP&amp;quot;&amp;gt;&amp;lt;/figure&amp;gt;&lt;br /&gt;
Uśrednianie potencjałów wywołanych. a) ciągły zapis EEG z wyróżnionymi momentami wystąpienia bodźca (w tym przypadku słuchowego) b) kilkadziesiąt kolejnych odcinków, wyciętych jako sekunda EEG od momentu wystąpienia kolejnych bodźców, ustawione jeden pod drugim c) uśredniony potencjał wywołany &amp;amp;mdash; widać m. in. załamek P300 ok. 300 milisekund po bodźcu]]&lt;br /&gt;
&lt;br /&gt;
Techniki te opierają się na założeniu, że zawarta w EEG odpowiedź mózgu na każdy z kolejnych bodźców jest niezmienna, a EEG odzwierciedlające pozostałe procesy traktowane jest jak nieskorelowany z nią proces stochastyczny. Zależnie od rodzaju potencjałów wywołanych, założenia te są mniej lub bardziej nieuzasadnione; podważa je choćby powszechnie znany efekt habituacji, polegający na osłabieniu późnych potencjałów wywołanych kolejnymi powtórzeniami bodźca.&lt;br /&gt;
&lt;br /&gt;
Istota potencjałów wywołanych jest przedmiotem otwartej dyskusji i dziesiątków prac, dotykających od lat podstawowych w tej dziedzinie pytań: czym jest potencjał wywołany, który widzimy w uśrednionym przebiegu? Czy naprawdę wynika z deterministycznie powtarzanej, jednakowej odpowiedzi pojawiającej się po każdym powtórzeniu bodźca niezależnie od &amp;amp;bdquo;tła&amp;amp;rdquo;, czy może wynika z reorganizacji faz tego właśnie &amp;amp;bdquo;tła&amp;amp;rdquo; EEG, czy może kombinacji tych dwóch efektów? Jest to wspaniałe pole dla zastosowań zaawansowanych metod modelowania i analizy sygnałów. W ostatnich latach powstają dziesiątki prac na ten temat, a od czasu do czasu również krytyczne artykuły wykazujące, że dotychczasowe odkrycia są raczej artefaktami stosowanych metod a nie wynikają z własności analizowanych danych (Yeung et al., 2004). Jak widać jest tu wciąż bardzo wiele do zrobienia, gdyż zrozumienie tego mechanizmu stoi na drodze do &amp;amp;bdquo;świętego Graala&amp;amp;rdquo;, którym w tej dziedzinie jest wyodrębnienie pojedynczych potencjałów wywołanych.&lt;br /&gt;
&lt;br /&gt;
Niezależnie od tego, w neurofizjologii klinicznej nazwą potencjał wywołany określa się krzywą widoczną po uśrednieniu odpowiedzi na kilkanaście do kilku tysięcy bodźców (Szelenberger 2000). Gromadzona od dziesięcioleci wiedza o behawioralnych i klinicznych korelatach potencjałów wywołanych opiera się na rozpoznawaniu w przebiegach uśrednionych tak zwanych załamków, czyli przejściowych wzrostów lub spadków potencjału (na przykład na &amp;lt;xr id=&amp;quot;fig:EP&amp;quot;&amp;gt;rys. %i&amp;lt;/xr&amp;gt; widać załamek P300). Nazwy załamków składają się zwykle z litery &amp;amp;bdquo;P&amp;amp;rdquo; (od ang. ''positive''), jeśli wychylenie jest dodatnie, lub &amp;amp;bdquo;N&amp;amp;rdquo; (od ang. ''negative''), jeśli wychylenie jest ujemne, oraz liczby. Uwaga: &lt;br /&gt;
* Nie ma niestety jednej ustalonej konwencji prezentacji potencjałów koniecznie trzeba więc zwracać uwagę na orientację wykresu, a wykonując wykres samemu - zamieszczać informację o orientacji kierunku dodatniego,gdyż kierunek dodatni może być wykresie skierowany do góry lub do dołu. &lt;br /&gt;
* Liczba następująca po N lub P określa przybliżoną liczbę milisekund od wystąpienia bodźca, czyli tak zwaną latencję. Nie można jednak ścisłego związku między tą liczbą a liczbą milisekund np. potencjał P300 w zależności od szczegółów paradygmatu doświadczalnego może wystąpić znacznie później. np. w eksperymentach językowych zdarza się że P300 występuje później niż N400 :-).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;xr id=&amp;quot;fig:zalamki&amp;quot;&amp;gt;Rys. %i&amp;lt;/xr&amp;gt; przedstawia schematycznie najważniejsze załamki rozpoznawane w potencjałach słuchowych, czyli wywoływanych bodźcem dźwiękowym. Dla potencjałów wzrokowych i somatosensorycznych istnieją podobne klasyfikacje.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Grafika:Zalamki.png|thumb|320px|right|&amp;lt;figure id=&amp;quot;fig:zalamki&amp;quot;&amp;gt;&amp;lt;/figure&amp;gt;&lt;br /&gt;
Orientacyjny schemat załamków rozpoznawanych w słuchowych potencjach wywołanych, na podstawie (Szelenberger 2000). Skala czasu logarytmiczna. Najszybsze (do 12 ms) składowe egzogenne to potencjały pniowe (BAEP), oznaczane jako fale I-VII. Litery &amp;amp;bdquo;P&amp;amp;rdquo; i &amp;amp;bdquo;N&amp;amp;rdquo; oznaczają dodatnie i ujemne wychylenia związane z dalszymi załamkami]]&lt;br /&gt;
&lt;br /&gt;
Najszybsze (czyli o najmniejszej latencji) składowe to potencjały egzogenne, odzwierciedlające wstępne fazy przekazu informacji. W potencjałach słuchowych są to potencjały pnia (ang. ''brainstem auditory evoked potentials'', BAEP), składające się z siedmiu fal występujących pomiędzy 1 a 12 ms od bodźca. Są one generowane np. w nerwie słuchowym czy pniu mózgu, i wykorzystywane w klinicznej diagnostyce integralności dróg słuchowych. Podobnie jak inne wczesne potencjały o latencjach poniżej 100 ms, są praktycznie niezależne od stanu uwagi.&lt;br /&gt;
&lt;br /&gt;
Po potencjałach o średniej  (między 12 a 50 ms) zaczynają się późne potencjały słuchowe, odzwierciedlające bardziej złożone reakcje na bodziec. Na przykład amplituda załamka N100 wzrasta w stanie skupienia uwagi czy pobudzenia emocjonalnego. Około 200 milisekund po bodźcu pojawia się załamek odzwierciedlający modną ostatnio ''falę niezgodności'' (ang. ''mismatch negativity''). Jest on wyrazem nieświadomej i automatycznej reakcji na zmianę bodźca &amp;amp;mdash; na przykład na pojawiające się stosunkowo rzadko dźwięki o innej częstości w serii dźwięków o jednakowej wysokości. Wreszcie pierwszy i najpopularniejszy całkowicie endogenny załamek to P300, pojawiający się po rozpoznaniu bodźca oczekiwanego, na którym skupiamy uwagę: na przykład, jeśli w serii pojawiających się losowo liter mamy zliczać wystąpienia jednej z nich, to na średniej odpowiedzi na pojawienie się tej litery pojawi się załamek P300.&lt;br /&gt;
&lt;br /&gt;
=== Uśrednianie w dziedzinie czasu ===&lt;br /&gt;
Jak już było wspomniane powyżej podstawową techniką stosowaną do analizy potencjałów wywołanych jest uśrednianie wielu realizacji odpowiedzi na bodziec wyrównanych względem jakiegoś charakterystycznego zdarzenia, np. momentu podania bodźca albo momentu behawioralnej reakcji na bodziec (np. wciśnięcie przycisku). Podejście to bazuje na trzech założeniach:&lt;br /&gt;
* Reakcja jest czasowo związana z bodźcem. Tzn. w kolejnych realizacjach występuje ona zawsze z tym samym opóźnieniem.&lt;br /&gt;
* Reakcja na bodziec skutkuje zawsze pojawieniem się w sygnale składowej o stałym kształcie (mówimy o stałej morfologii).&lt;br /&gt;
* Spontaniczna czynność EEG &amp;amp;mdash; ta która nie dotyczy przetwarzania interesującego nas bodźca &amp;amp;mdash; jest niezależnym, stacjonarnym szumem o średniej zero.&lt;br /&gt;
&lt;br /&gt;
Zgodnie z powyższymi założeniami mierzony w ''i''-tej realizacji sygnał można wyrazić jako:&lt;br /&gt;
: &amp;lt;math&amp;gt;x_i(t) = s(t) + n_i(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
Uśrednianie po ''N'' realizacjach daje:&lt;br /&gt;
: &amp;lt;math&amp;gt;\bar x (t) = \frac{1}{N} \sum_{i=1}^N x_i(t) = \frac{1}{N} \left(N s(t) + \sum_{i=1}^N n_i(t) \right) &amp;lt;/math&amp;gt;&lt;br /&gt;
Wartość oczekiwana średniego sygnału wynosi:&lt;br /&gt;
: &amp;lt;math&amp;gt;\mathrm{E}\left[ \bar x(t) \right] = s(t) &amp;lt;/math&amp;gt;&lt;br /&gt;
gdyż dla szumu o średniej zero mamy:&lt;br /&gt;
: &amp;lt;math&amp;gt;\mathrm{E}\left[\frac{1}{N} \sum_{i=1}^N n_i(t)\right] = 0&amp;lt;/math&amp;gt;.&lt;br /&gt;
Wariancja &amp;lt;math&amp;gt;\bar x(t)&amp;lt;/math&amp;gt; wynosi:&lt;br /&gt;
: &amp;lt;math&amp;gt;\sigma^2_{\bar x(t)} = \mathrm{E} \left[  \left( \frac{1}{N} \sum_{i=1}^N n_i(t)\right)^2 \right] \approx \frac{1}{N} \sigma^2_{n(t)}&amp;lt;/math&amp;gt;&lt;br /&gt;
gdyż &amp;lt;math&amp;gt;s(t)&amp;lt;/math&amp;gt; jest deterministyczne. &lt;br /&gt;
&lt;br /&gt;
Dla potencjałów pojawiających się w pierwszych kilkudziesięciu milisekundach po bodźcu model ten można uznać za poprawny, gdyż wykazują one zależność głównie od parametrów fizycznych bodźca. Dla późniejszych składowych staje się on coraz bardziej wątpliwy ze względu na występujące korelacje ze stanem (np. uwagi) badanego.&lt;br /&gt;
&lt;br /&gt;
Dla późniejszych składowych można by postulować bardziej ogólną wersję modelu potencjału wywołanego:&lt;br /&gt;
: &amp;lt;math&amp;gt;x_i(t) = s_i(t) + n_i(t)&amp;lt;/math&amp;gt;&lt;br /&gt;
Ten model uwidacznia, że do opisu potencjału wywołanego potrzebna jest nie tylko średnia, ale i wyższe momenty rozkładu (np. drugi moment centralny czyli wariancja).&lt;br /&gt;
&lt;br /&gt;
====Wariancja w przypadku szumu skorelowanego ====&lt;br /&gt;
W poprzednim paragrafie pokazaliśmy, że w przypadku niezależnego szumu wariancja uśrednionego sygnału (w danej chwili czasu) maleje jak  &amp;lt;math&amp;gt;\frac{1}{N}&amp;lt;/math&amp;gt;. Jednak w przypadku gdy kolejne próbki szumu są skorelowane (np. występuje silna aktywność rytmiczna alfa) sytuacja się komplikuje. Intuicyjnie łatwo możemy to sobie wyobrazić w granicznym przypadku. Załóżmy, że tło dla  potencjałów o stałej morfologii   stanowi sinusoida. Jeśli będziemy podawać bodźce w odstępach będących wielokrotnością okresu tej sinusoidy to w uśrednianych fragmentach sygnału owa sinusoida jest tak samo powtarzalna jak badany potencjał i uśrednianie nie prowadzi do poprawy stosunku amplitudy sygnału do amplitudy tła. &lt;br /&gt;
&lt;br /&gt;
Stopień zależności pomiędzy próbkami można zmierzyć przy pomocy funkcji autokorelacji. &lt;br /&gt;
Jeśli funkcję autokorelacji przybliżymy przez:&lt;br /&gt;
: &amp;lt;math&amp;gt;R_{xx}(\tau) = \sigma^2 \exp(-\beta |\tau|) \cos(2 \pi f_0 \tau)&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\sigma^2&amp;lt;/math&amp;gt; jest wariancją szumu, &amp;lt;math&amp;gt;f_0&amp;lt;/math&amp;gt; jest średnią częstością aktywności rytmicznej, &amp;lt;math&amp;gt;\beta/ \pi&amp;lt;/math&amp;gt; jest szerokością pasma tej czynności, zaś &amp;lt;math&amp;gt;\tau&amp;lt;/math&amp;gt; opóźnieniem, to wariancję potencjału wywołanego można wyrazić jako&amp;lt;!-- \cite{Spekreijse_1976}--&amp;gt;:&lt;br /&gt;
: &amp;lt;math&amp;gt;\sigma^2_{\bar x(t)} = \frac{\sigma^2}{N} \left[ \frac{1-\exp(-2 \beta T)}{1 - 2 \exp(- \beta T) \cos(2 \pi f_0 T) +\exp(-2 \beta T)} \right]&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; jest odstępem między bodźcami. &lt;br /&gt;
Widać stąd, że obecność czynności rytmicznej w tle wpływa na stosunek sygnału do szumu. Z powyższego równania widać, że stosunek wariancji dąży do &amp;lt;math&amp;gt;\frac{\sigma^2}{N}&amp;lt;/math&amp;gt; gdy &amp;lt;math&amp;gt;\beta T&amp;lt;/math&amp;gt; staje się duże.  &lt;br /&gt;
&lt;br /&gt;
Periodyczna stymulacja może ponadto prowadzić do wzbudzenia czynności rytmicznej o częstości równej częstości pobudzania bądź jej harmonicznej.&lt;br /&gt;
&lt;br /&gt;
===Wariancja latencji===&lt;br /&gt;
&lt;br /&gt;
Jedną z form zmienności potencjału wywołanego w pojedynczych realizacjach jest wariancja latencji. &lt;br /&gt;
[[Grafika:Wariancja_latencji.png|thumb|500px|right|&lt;br /&gt;
Czerwona linia: Uśrednianie 100 potencjałów wywołanych o latncjach z rozkładu normalnego N(300,30 ), Niebieskie linie: przykładowe pojedyncze realizacje wzięte do średniej]]&amp;lt;!--# -*- coding: utf-8 -*-&lt;br /&gt;
from __future__ import division&lt;br /&gt;
import numpy as np&lt;br /&gt;
from matplotlib.pyplot import plot, show ,subplot, figure, title, xlabel, ylabel, ylim&lt;br /&gt;
 &lt;br /&gt;
def fun(t,lat=100):&lt;br /&gt;
    return np.exp(-(t-lat)**2/(2*30**2))&lt;br /&gt;
Fs = 1&lt;br /&gt;
N = 100&lt;br /&gt;
t = np.arange(0,700)&lt;br /&gt;
f = np.zeros((N,700))&lt;br /&gt;
f_sr = np.zeros(t.shape)&lt;br /&gt;
for i in range(N):&lt;br /&gt;
    f[i,:] = fun(t,lat = 300 + 30* np.random.randn())&lt;br /&gt;
for i in range(3):&lt;br /&gt;
    plot(t,f[i,:], 'b')&lt;br /&gt;
plot(t,f.mean(0),'r')&lt;br /&gt;
show()--&amp;gt;&lt;br /&gt;
Zmienność latencji prowadzi do:&lt;br /&gt;
* zmniejszenia amplitudy &amp;lt;math&amp;gt;\bar x&amp;lt;/math&amp;gt;&lt;br /&gt;
* wzrostu rozciągłości czasowej załamka&lt;br /&gt;
&lt;br /&gt;
O tych konsekwencjach zmienności latencji należy w szczególności pamiętać porównując średnie potencjały uzyskane w różnych warunkach eksperymentalnych. Gdy zauważymy, że średnie potencjały różnią się amplitudą należy rozważyć możliwość, że w istocie warunki eksperymentalne wpływają na różnice w wariancji latencji. &lt;br /&gt;
&lt;br /&gt;
Naturalne jest, że zmienność latencji jest bardziej widoczna w przypadku załamków trwających krótko niż w przypadku załamków trwających długo. Wariancja latencji rożnie wraz z jej wartością, stąd wśród późnych składowych potencjałów wywołanych nie obserwuje się komponentów krótkotrwałych.&lt;br /&gt;
====Uśrednianie metodą Woody'ego ====&lt;br /&gt;
&lt;br /&gt;
Model potencjału ze zmienną latencją i sposób na jego efektywniejsze uśrednianie zaproponował Woody (1967). Model ten zakłada, że w każdej realizacji występuje komponent addytywny &amp;lt;math&amp;gt;s_i(t)\;&amp;lt;/math&amp;gt;, który co do kształtu jest stały, a pomiędzy realizacjami różni się tylko latencją:&lt;br /&gt;
: &amp;lt;math&amp;gt; s_i(t) = s(t +\Delta t_i)\;&amp;lt;/math&amp;gt;&lt;br /&gt;
Woody zaproponował aby &amp;lt;math&amp;gt;\Delta t_i\;&amp;lt;/math&amp;gt; szacować na podstawie maksimum funkcji korelacji wzajemnej pomiędzy ''i''-tą realizacją a wzorcem. W pierwszym kroku wzorcem jest średni potencjał uzyskany przez proste uśrednienie realizacji.  Następnie w sposób iteracyjny dokonuje się:&lt;br /&gt;
* poprawek w wyrównaniu poszczególnych realizacji,&lt;br /&gt;
* obliczenia nowego wzorca poprzez uśrednienie realizacji po korekcie wyrównania,&lt;br /&gt;
* obliczenia nowych poprawek do wyrównania realizacji.&lt;br /&gt;
&lt;br /&gt;
===Habituacja ===&lt;br /&gt;
Zmienność w odpowiedziach na kolejno występujące po sobie bodźce można podzielić na komponent stochastyczny i deterministyczny. Komponent deterministyczny odzwierciedla zmianę czułości  układu nerwowego  na kolejne bodźce. Nowy bodziec często wywołuje reakcje pobudzenia widoczną w wielu parametrach takich jak przewodnictwo skóry, rytm serca i reaktywność kory mózgowej. Powszechnie obserwowanym zjawiskiem jest spadek reaktywności na powtarzające się bodźce zwany habituacją. Niekiedy obserwuje się także zjawisko przeciwne &amp;amp;mdash; wzrost reaktywności na bodziec &amp;amp;mdash; zwane sensytyzacją. &lt;br /&gt;
&lt;br /&gt;
Klasycznym sposobem na badanie tych zjawisk w potencjałach wywołanych jest uśrednianie w podzbiorach lub  uśrednianie blokowe. Wymaga ono  zmiany paradygmatu rejestracji danych. Załóżmy, że interesującym nas bodźcem jest błysk światła. Chcemy zaobserwować ewentualne zmiany amplitudy i latencji w ciągu 100 potencjałów będących reakcją na błysk powtarzający się co 500 ms.&lt;br /&gt;
====Uśrednianie w podzbiorach ====&lt;br /&gt;
W metodzie tej musimy założyć, że proces habituacji jest powolny, tzn. zmiany pomiędzy kolejnymi reakcjami są bardzo małe. W takim przypadku możemy podzielić długą serię bodźców na ciąg pod-serii i uśrednienie przeprowadzić dla każdej pod-serii osobno.&lt;br /&gt;
[[Plik:Usrednianie_podzbiory.svg‎|640px|thumb|center|Ilustracja uśredniania w podzbiorach]]&lt;br /&gt;
&lt;br /&gt;
====Uśrednianie blokowe====&lt;br /&gt;
W tym celu eksperyment wykonujemy w wielu seriach. Jedna seria składa się ze 100 błysków powtarzanych co 500 ms.  Po serii następuje przerwa trwająca np. 5 s (długość przerwy wyraża nasze oszacowanie czasu potrzebnego na zanik habituacji). Po przerwie seria jest powtarzana. Powtórzeń serii wykonujemy ''N''.&lt;br /&gt;
Następnie uśredniamy fragmenty sygnałów odpowiadające sobie w kolejnych seriach. &lt;br /&gt;
&lt;br /&gt;
W tym paradygmacie zakładamy, że każda seria rejestrowana jest w tych samych warunkach. Zaniedbujemy efekty związane ze zmęczeniem i zmianami w np. stopniu koncentracji badanego.&lt;br /&gt;
[[Plik:Usrednianie blokowe.svg|Usrednianie blokowe.svg|640px|thumb|center|Ilustracja uśredniania w blokach]]&lt;br /&gt;
&lt;br /&gt;
===Załamki w krzywej potencjału wywołanego vs ukryte komponenty===&lt;br /&gt;
Komponenta potencjału wywołanego to bardzo ważne ale jednocześnie źle określone pojęcie. Krzywa otrzymana w wyniku uśredniania potencjałów wywołanych przedstawia serię załamków dodatnich i ujemnych, ale trzeba być świadomym, że ten przebieg napięcia rejestrowany przez elektrody przedstawia tak naprawdę sumę potencjałów pochodzących od wielu dość niezależnie działających źródeł w mózgu. Przyczynek pochodzący od jednego funkcjonalnego źródła będziemy określać jako komponentę. &lt;br /&gt;
&lt;br /&gt;
Komentarza wymaga też pojęcie źródła funkcjonalnego. Czynność elektryczną synchronicznie działających neuronów piramidalnych w określonym fragmencie kory mózgowej z pewnej odległości można przybliżyć potencjałem dipola prądowego. Taki aktywny fragment kory stanowi źródło dające przyczynek do mierzonego na powierzchni głowy potencjału. W najprostszej sytuacji taki przyczynek może być obserwowany jako komponenta. Mózg jest jednak obiektem niezwykle złożonym i gęsto połączonym. Wiele obszarów korowych może być funkcjonalnie połączonych i aktywowanych synchronicznie w celu realizacji określonego zadania &amp;amp;mdash; o takim funkcjonalnym zespole też możemy myśleć jako o pojedynczym źródle, choć może ono mieć złożoną strukturę przestrzenną. Często zatem myślimy o komponentach ukrytych potencjału wywołanego jako o aktywności takich funkcjonalnych zespołów. &lt;br /&gt;
&lt;br /&gt;
Po tym wstępie widać już chyba, że do zrozumienia co dzieje się w czasie reakcji na bodziec, którą obserwujemy w potencjale wywołanym, bardziej pożądane byłoby badanie komponent ukrytych niż poszczególnych załamków krzywej potencjału wywołanego, która stanowi ważoną sumę owych komponentów. Zanim przejdziemy do omówienia technik służących &amp;amp;bdquo;wyłuskiwaniu&amp;amp;rdquo; komponent prześledźmy kilka symulacji i wnioski z nich płynące.&lt;br /&gt;
&lt;br /&gt;
==== Załamki i komponenty nie są tym samym.====&lt;br /&gt;
Tę samą krzywą można otrzymać na nieskończenie wiele sposobów  przez sumowanie rożnych kombinacji domniemanych komponentów. Przykładowy rysunek pokazuje, jak tę samą krzywą można złożyć z dwóch rożnych zestawów komponentów (kod wytwarzający przykładową symulację pokazany jest poniżej).&lt;br /&gt;
[[Plik:Sumowanie_komponentow1.png|center|thumb|600px| Panel a) przedstawia hipotetyczną krzywą ERP, panel b) jedna z możliwych dekompozycji sygnału w panelu a), panel c) inna możliwa dekompozycja sygnału z panelu a) ]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
from __future__ import division&lt;br /&gt;
import numpy as np&lt;br /&gt;
from matplotlib.pyplot import plot, show ,subplot, figure, title, xlabel, ylabel, ylim&lt;br /&gt;
&lt;br /&gt;
Fs = 1&lt;br /&gt;
t = np.arange(0,700)&lt;br /&gt;
&lt;br /&gt;
C1 = np.exp(-(t-100)**2/(2*30**2))&lt;br /&gt;
C2 = np.exp(-(t-200)**2/(2*50**2))&lt;br /&gt;
C3 = np.exp(-(t-350)**2/(2*100**2))&lt;br /&gt;
ERP = 0.5*C1-C2+C3&lt;br /&gt;
&lt;br /&gt;
C2p = np.concatenate((C2[0:200], np.ones(30), C2[200:700-30] ))&lt;br /&gt;
C3p = ERP - 0.5*C1 + C2p&lt;br /&gt;
ERP_v2 = 0.5*C1-C2p+C3p&lt;br /&gt;
&lt;br /&gt;
subplot(3,1,1)&lt;br /&gt;
plot(t,ERP, t[::10],ERP_v2[::10],'g.')&lt;br /&gt;
ylabel('a)',rotation='horizontal')&lt;br /&gt;
ylim([-1, 1.5])&lt;br /&gt;
&lt;br /&gt;
subplot(3,1,2)&lt;br /&gt;
plot(t,0.5*C1,t,-C2,t,C3)&lt;br /&gt;
ylabel('b)',rotation='horizontal')&lt;br /&gt;
ylim([-1, 1.5])&lt;br /&gt;
&lt;br /&gt;
subplot(3,1,3)&lt;br /&gt;
plot(t,0.5*C1,t,-C2p,t,C3p)&lt;br /&gt;
ylabel('c)',rotation='horizontal')&lt;br /&gt;
ylim([-1, 1.5])&lt;br /&gt;
&lt;br /&gt;
show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Zmiana jednej komponenty może powodować zmiany w amplitudzie i latencji więcej niż jednego załamka.====&lt;br /&gt;
Poniższy rysunek przedstawia sytuację gdy zmiana amplitudy jednego komponentu może znacząco wpływać na amplitudę i latencję innych załamków.&lt;br /&gt;
&lt;br /&gt;
[[Plik:Sumowanie_komponentow2.png|center|thumb|768px| Panel a) przedstawia dwie hipotetyczne krzywe ERP, panel b) panel b i c komponenty z których powstały owe krzywe. Zmiana amplitudy komponentu oznaczonego kolorem powoduje zmianę amplitudy oznaczonych załamków ale także zmianę latencji wcześniejszego załamka. ]]&lt;br /&gt;
Poniżej kod odtwarzający powyższy przykład:&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
from __future__ import division&lt;br /&gt;
import numpy as np&lt;br /&gt;
from matplotlib.pyplot import plot, show, subplot, figure, title, xlabel, ylabel, ylim&lt;br /&gt;
&lt;br /&gt;
Fs = 1&lt;br /&gt;
t = np.arange(0,700)&lt;br /&gt;
&lt;br /&gt;
C1 = np.exp(-(t-100)**2/(2*30**2))&lt;br /&gt;
C2 = np.exp(-(t-200)**2/(2*50**2))&lt;br /&gt;
C3 = np.exp(-(t-350)**2/(2*100**2))&lt;br /&gt;
ERP1 = 0.5*C1-C2+C3&lt;br /&gt;
ERP2 = 0.5*C1-C2+1.5*C3&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
subplot(3,1,1)&lt;br /&gt;
plot(t,ERP1,'b', t,ERP2,'g')&lt;br /&gt;
plot(t[np.argmin(ERP1)],np.min(ERP1),'r.' )&lt;br /&gt;
plot(t[np.argmax(ERP1)],np.max(ERP1),'m.' )&lt;br /&gt;
plot(t[np.argmin(ERP2)],np.min(ERP2),'r.' )&lt;br /&gt;
plot(t[np.argmax(ERP2)],np.max(ERP2),'m.' )&lt;br /&gt;
&lt;br /&gt;
ylabel('a)',rotation='horizontal')&lt;br /&gt;
ylim([-1, 1.6])&lt;br /&gt;
&lt;br /&gt;
subplot(3,1,2)&lt;br /&gt;
plot(t,0.5*C1,'k',t,-C2,'k',t,C3,'b')&lt;br /&gt;
ylabel('b)',rotation='horizontal')&lt;br /&gt;
ylim([-1, 1.6])&lt;br /&gt;
&lt;br /&gt;
subplot(3,1,3)&lt;br /&gt;
plot(t,0.5*C1,'k',t,-C2,'k',t,1.5*C3,'g')&lt;br /&gt;
ylabel('c)',rotation='horizontal')&lt;br /&gt;
ylim([-1, 1.6])&lt;br /&gt;
&lt;br /&gt;
show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Instrukcje do ćwiczeń =&lt;br /&gt;
&lt;br /&gt;
==Zadanie 1: uśrednianie symulowanych sygnałów==&lt;br /&gt;
w tym ćwiczeniu chcemy pokazać efekty:&lt;br /&gt;
# uśredniania sygnałów związanych fazowo z bodźcem i nieskorelowanych z bodźcem / wpływ liczby realizacji,&lt;br /&gt;
# uśredniania sygnałów z fluktuacją latencji,&lt;br /&gt;
# wpływ filtrów o różnych funkcjach odpowiedzi impulsowej na morfologię uśrednionego potencjału.&lt;br /&gt;
&lt;br /&gt;
===Sygnały testowe===&lt;br /&gt;
Proszę zaimplementować funkcje generujące następujące przebiegi czasowe (oznaczenia: ''F&amp;lt;sub&amp;gt;s&amp;lt;/sub&amp;gt;'' &amp;amp;mdash; częstość próbkowania, ''T'' &amp;amp;mdash; czas trwania w sekundach, [[%C4%86wiczenia_1#Sygna.C5.82y_testowe|analogicznie do tego]]):&lt;br /&gt;
* sinusoida o zadanej częstości ''f'' i fazie &amp;lt;math&amp;gt;\phi&amp;lt;/math&amp;gt;: &amp;lt;tt&amp;gt;y = sin(f, phi, Fs, T)&amp;lt;/tt&amp;gt;,&lt;br /&gt;
* funkcja Gaussa o zadanym położeniu i szerokości &amp;lt;tt&amp;gt;y = g_1(t0, sigma, Fs, T) &amp;lt;/tt&amp;gt;&lt;br /&gt;
: &amp;lt;math&amp;gt;g_1(t) = \exp\left(-\frac{(t-t_0)^2}{2 \sigma^2}\right)&amp;lt;/math&amp;gt;,&lt;br /&gt;
* pochodną funkcji Gaussa o zadanym położeniu i szerokości &amp;lt;tt&amp;gt;y = g_2(t0, sigma, Fs, T)&amp;lt;/tt&amp;gt;,&lt;br /&gt;
* połowę funkcji Gaussa o zadanym położeniu i szerokości &amp;lt;tt&amp;gt;y = g_3(t0, sigma, Fs, T)&amp;lt;/tt&amp;gt;,&lt;br /&gt;
: &amp;lt;math&amp;gt;g_{3}(t) = \left\{ &lt;br /&gt;
\begin{array}{lll}&lt;br /&gt;
0 &amp;amp; \mathrm{dla}&amp;amp; t&amp;lt;t_0 \\&lt;br /&gt;
\exp\left(-\frac{(t-t_0)^2}{2 \sigma^2}\right)&amp;amp; \mathrm{dla}&amp;amp; t \ge t_0  &lt;br /&gt;
\end{array}&lt;br /&gt;
\right. &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
W dalszych zadaniach tej sekcji przyjmiemy:&lt;br /&gt;
* ''T'' = 1 s,&lt;br /&gt;
* ''F&amp;lt;sub&amp;gt;s&amp;lt;/sub&amp;gt;'' = 128 Hz,&lt;br /&gt;
* ''t''&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; = 0,3 s,&lt;br /&gt;
* &amp;amp;sigma; = 0,02 s.&lt;br /&gt;
&lt;br /&gt;
===Uśrednianie w modelu addytywnym: sygnał + szum===&lt;br /&gt;
Dla funkcji &amp;lt;math&amp;gt;g_1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;g_2&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;g_3&amp;lt;/math&amp;gt;  wykonaj ''N'' symulacji sygnału opisanego daną funkcją z dodanym szumem gaussowskim (&amp;lt;tt&amp;gt;numpy.random.randn&amp;lt;/tt&amp;gt;). Zaobserwuj zmianę wariancji uśrednianego sygnału wraz z ''N''.&lt;br /&gt;
&lt;br /&gt;
===Uśrednianie w modelu addytywnym: sygnał + szum + niezależna czynność rytmiczna===&lt;br /&gt;
Powtórz poprzednie symulacje dokładając w każdej realizacji sinusoidę o losowo wybranej fazie. Symulacje wykonaj dla różnych częstości sinusoidy, takich których połówka okresu zbliżona jest do szerokości funkcji Gaussa, oraz znacząco od niej różnych.&lt;br /&gt;
&lt;br /&gt;
===Uśrednianie w modelu z resetem fazy===&lt;br /&gt;
Zbuduj sygnał składający się z dwóch fragmentów sinusoidy o częstości ''f'': &lt;br /&gt;
* pierwszy fragment ma losową fazę,&lt;br /&gt;
* drugi fragment ma fazę równą 0.&lt;br /&gt;
Wykonaj ''N'' realizacji takiego sygnału, przy czym każda realizacja ma częstość losowaną z rozkładu Gaussa o średniej 10 i pewnej wariancji (czyli &amp;lt;math&amp;gt;f \in \mathrm{N}(10,\sigma)&amp;lt;/math&amp;gt;). &lt;br /&gt;
Uśrednij otrzymane realizacje. Zaobserwuj zależność średniej od liczby uśrednianych realizacji i od wariancji częstości.&lt;br /&gt;
&lt;br /&gt;
===Uśrednianie potencjału z fluktuacją latencji===&lt;br /&gt;
Wygeneruj sygnały składające się z funkcji &amp;lt;math&amp;gt;g_1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;g_2&amp;lt;/math&amp;gt; albo &amp;lt;math&amp;gt;g_3&amp;lt;/math&amp;gt; z fluktuującą latencją, tzn. z wartością &amp;lt;math&amp;gt;t_0&amp;lt;/math&amp;gt; pochodzącą z jakiegoś rozkładu prawdopodobieństwa. U nas dla ustalenia uwagi niech będzie to rozkład Gaussa. Wykonaj zestaw symulacji obrazujący zależność od liczby realizacji i od wielkości fluktuacji, mierzonej przez wariancję rozkładu. Czy jest związek pomiędzy wariancją fluktuacji &amp;lt;math&amp;gt;t_0&amp;lt;/math&amp;gt; a szerokością załamków?&lt;br /&gt;
&lt;br /&gt;
===Wpływ filtrów===&lt;br /&gt;
# Zaprojektuj następujące filtry (przyjmij częstość próbkowania 128 Hz):&lt;br /&gt;
#* dolnoprzepustowy: Butterwortha z częstością odcięcia: 30, 40, 50 Hz, i rzędach od 1 do 5 (funkcja butter w module scipy.signal),&lt;br /&gt;
#* górnoprzepustowy: Butterwortha z częstością odcięcia: 0,1, 0,5, 2 i 5 Hz, i rzędach od 1 do 5,&lt;br /&gt;
#* notch: Czybyszewa II rodzaju z pasmem zaporowym ustawionym na 50 Hz, i rzędach od 1 do 3 (funkcja cheby2),&lt;br /&gt;
# Zbadaj funkcję odpowiedzi impulsowej i funkcję przenoszenia tych filtrów (w skali dB). Zaobserwuj jak długa jest odpowiedź impulsowa i jak daleko od częstości odcięcia zaburzone jest pasmo przenoszenia.&lt;br /&gt;
# Zastosuj powyższe filtry do funkcji &amp;lt;math&amp;gt;g_1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;g_2&amp;lt;/math&amp;gt; albo &amp;lt;math&amp;gt;g_3&amp;lt;/math&amp;gt;. Filtrowanie przeprowadź w jedną (lfilter) oraz w dwie strony (filtfilt). Zaobserwuj związek między zniekształceniem wprowadzanym przez filtr a funkcją odpowiedzi impulsowej filtru.&lt;br /&gt;
# W ćwiczeniu tym posłuż się symulowanymi sygnałami uzyskanymi z modelu addytywnego: &amp;amp;bdquo;sygnał+szum&amp;amp;rdquo;. Dla funkcji &amp;lt;math&amp;gt;g_1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;g_2&amp;lt;/math&amp;gt; albo &amp;lt;math&amp;gt;g_3&amp;lt;/math&amp;gt;  wykonaj ''N'' = 60 realizacji sygnału opisanego daną funkcją z dodanym szumem gaussowskim (&amp;lt;tt&amp;gt;numpy.random.randn&amp;lt;/tt&amp;gt;). Każdą z realizacji przefiltruj, a następnie uśrednij uzyskane sygnały.&lt;br /&gt;
&lt;br /&gt;
==Zadanie 2: rejestracje i analiza potencjałów wzrokowych==&lt;br /&gt;
&lt;br /&gt;
===Synchronizacja występowania bodźców z sygnałem EEG===&lt;br /&gt;
&lt;br /&gt;
Rejestracja potencjałów wywołanych jest przykładem pomiaru czynności elektrycznej mózgu w odpowiedzi na określony bodziec. W przypadku tego rodzaju pomiarów konieczna jest synchronizacja momentu wystąpienia bodźca z sygnałem EEG. Wzmacniacze do pomiaru czynności elektrycznej mózgu wyposażone są w specjalne wejścia, na które można podawać sygnał odpowiadający pojawianiu się bodźca. Jak pamiętamy z zeszłego semestru, wejście to (jak i podawany na nie sygnał) nazywamy trigerem (ang. ''trigger'' &amp;amp;mdash; spust, cyngiel, wyzwalacz). W najprostszym przypadku, bodziec moglibyśmy wyświetlać na monitorze komputerowym, a sygnał związany z jego wystąpieniem wysyłać przez któryś z portów komputera (LPT, COM) na wzmacniacz EEG. Niestety, obecnie dostępne i popularne systemy operacyjne, takie jak Windows czy Linux nie są systemami czasu rzeczywistego (http://pl.wikipedia.org/wiki/System_operacyjny_czasu_rzeczywistego). Od momentu wyświetlania bodźca na ekranie, do pojawiania się sygnału odpowiednim porcie komputerowym może upłynąć kilkadziesiąt milisekund i co gorsza czas ten zwykle jest losowy. W przypadku gdy wzmacniacz próbkuje sygnał z częstością 1000 Hz, moment wystąpienia bodźca możemy określić z dokładnością 1 ms, jednakże wspomniane opóźnienia w systemie operacyjnym uniemożliwiają to. Ponadto, jak dowiedzieliśmy się w rozdziale wstępnym [http://brain.fuw.edu.pl/edu-wiki/action/edit/EEG:Potencja%C5%82y_wywo%C5%82ane?section=T-1], pierwsze załamki związane z potencjałami wywołanymi pojawiają się już 10 ms po wystąpieniu bodźca. W związku z tym, losowe, rzędu kilkudziesięciu milisekund opóźnienia sygnału określającego moment pojawienia się bodźca względem jego rzeczywistego wystąpienia są niedopuszczalne.&lt;br /&gt;
Istnieją pewne techniki programowania, dzięki którym opisywane opóźnienia można zmniejszyć, jednakże są one bardzo trudne  do realizacji. Ponadto, standardowe porty komputera, takie jak LPT, czy COM zostały zaprojektowane przede wszystkim do sterowania urządzeniami zewnętrznymi, a nie ich zasilania. Przykładowo, jedna linia portu drukarkowego (LPT) może być obciążona prądem nie większym niż 5 mA, podczas gdy do zapalenie zwykłej diody LED potrzeba około 10 mA. Taki pobór prądu możliwy jest do uzyskania z portu USB, jednakże  jest on  wyjątkowo trudny do oprogramowania.  &lt;br /&gt;
W celu ominięcia powyższych niedogodności w Zakładzie Fizyki Biomedycznej UW w przeprowadzanych eksperymentach wykorzystywane są  mikrokontrolery [http://pl.wikipedia.org/wiki/Mikrokontroler], w szczególności ATmega16 i ATmega32.  Mikrokontrolery te wyposażone są w procesory o architekturze RISC [http://pl.wikipedia.org/wiki/RISC] i mocy obliczeniowej porównywalnej z szeroko stosowanym kiedyś w komputerach ZX Spectrum, Commodore, Amiga i Atari procesorem Z80. Oprócz jednostki centralnej mikrokontrolery zawierają   stałą pamięć FLASH przeznaczoną do przechowywania kodu programu, pamięć  RAM i pamięć EEPROM, liczniki 8- i 16-bitowe, komparatory, przetworniki analogowo-cyfrowe, porty wejścia/wyjścia, łącze RS232 (popularnie nazywane portem szeregowym) i układy przerwań.&lt;br /&gt;
&lt;br /&gt;
Mikrokontrolery wchodzące w skład zestawów pomiarowych na Pracowni EEG zawierają program, który umożliwia komunikację z nimi poprzez port szeregowy. Obecnie, komputery są coraz rzadziej wyposażane w porty szeregowe. Standard komunikacji RS-232, opracowany w 1962 roku  nadal jest jednak popularny i często wykorzystywany do komunikacji miedzy urządzeniami.  W celu połączenia komputera posiadającego tylko porty USB z mikrokontrolerem zastosowano przejściówkę USB/RS-232. &lt;br /&gt;
&lt;br /&gt;
Jak każde urządzenie w systemie Linuks, przejściówka USB/RS-232 widoczna jest jako plik, znajdujący się w katalogu &amp;lt;tt&amp;gt;/dev&amp;lt;/tt&amp;gt;. Nazwy plików obsługujących urządzenia szeregowe to &amp;lt;tt&amp;gt;ttyXY&amp;lt;/tt&amp;gt;, gdzie &amp;lt;tt&amp;gt;XY&amp;lt;/tt&amp;gt; to kolejny numer przydzielony do urządzenia szeregowego.&lt;br /&gt;
Do komunikacji komputera z mikroknotrolerem  w Zakładzie Fizyki Biomedycznej UW została napisana prosta biblioteka.  Jej użycie jest następujące:&lt;br /&gt;
* Po podłączeniu przejściówki USB/RS232 do komputera mikrokontrolera sprawdź jaki plik w katalogu &amp;lt;tt&amp;gt;/dev&amp;lt;/tt&amp;gt; został utworzony i przydzielony do urządzenia. &lt;br /&gt;
* Zaimportuj bibliotekę do komunikacji z mikrokontrolerem: &lt;br /&gt;
: &amp;lt;tt&amp;gt;import SerialPort as SP&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Otwórz plik powiązany z urządzeniem zewnętrznym:&lt;br /&gt;
: &amp;lt;tt&amp;gt;sp = SP.SerialPort(nazwa_pliku) &amp;lt;/tt&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
: &amp;lt;tt&amp;gt;sp.open()&amp;lt;/tt&amp;gt;&lt;br /&gt;
W naszym przypadku prawidłowa nazwa pliku to &amp;lt;tt&amp;gt;/dev/ttyUSB0&amp;lt;/tt&amp;gt;.&lt;br /&gt;
* Po włączeniu zasilania mikrokontrolera, diody podłączone do niego i wykorzystywane w eksperymencie z potencjałami wywołanymi będą zapalone. Następujące polecenie zgasi obydwie diody:&lt;br /&gt;
: &amp;lt;tt&amp;gt;sp.blinkP300([0, 0])&amp;lt;/tt&amp;gt;&lt;br /&gt;
* Wydanie poniższego polecenia spowoduje, iż mikrokontroler zapali podłączoną do niego diodę numer 1 na czas 100 ms, zaś diodę numer 2 na 200 ms. Jednocześnie, w momencie włączenia jak i wyłączenia diody, sygnał z mikrokontrolera zostanie wysłany na 5-stykowe wejście AUX mikrokontrolera:&lt;br /&gt;
: &amp;lt;tt&amp;gt;sp.blinkP300([100, 200])&amp;lt;/tt&amp;gt;&lt;br /&gt;
* Jeśli chcemy zapalić tylko diodę numer dwa, np. na czas 500 ms w programie podajemy następującą instrukcję:&lt;br /&gt;
: &amp;lt;tt&amp;gt;sp.blinkP300([0, 500])&amp;lt;/tt&amp;gt;&lt;br /&gt;
* Jeśli chcemy zakończyć komunikację z mikrokontrolerem piszemy:&lt;br /&gt;
: &amp;lt;tt&amp;gt;sp.close()&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Kod biblioteki do komunikacji z mikrokontrolerem:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;!--  Kod w Pythonie 2&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# -*- coding: cp1250 -*-&lt;br /&gt;
import serial&lt;br /&gt;
import logging&lt;br /&gt;
import sys&lt;br /&gt;
import os&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def to_hex_word(a):&lt;br /&gt;
    '''encodes a decimal number hexadecimally on two bytes'''&lt;br /&gt;
    return chr(a%256) + chr(a/256)&lt;br /&gt;
&lt;br /&gt;
class SerialPort(object):&lt;br /&gt;
    def __init__(self, port_name):&lt;br /&gt;
        import serial&lt;br /&gt;
        try:&lt;br /&gt;
            self.port = serial.Serial(&lt;br /&gt;
                port=port_name,&lt;br /&gt;
                baudrate=9600,&lt;br /&gt;
                bytesize=serial.EIGHTBITS,&lt;br /&gt;
                parity=serial.PARITY_NONE,&lt;br /&gt;
                stopbits=serial.STOPBITS_ONE,&lt;br /&gt;
                xonxoff=False&lt;br /&gt;
                )&lt;br /&gt;
        except serial.SerialException as e:&lt;br /&gt;
            print(&amp;quot;Nieprawidłowa nazwa portu lub port zajęty.&amp;quot;)&lt;br /&gt;
            raise e&lt;br /&gt;
        self.close()&lt;br /&gt;
        &lt;br /&gt;
    def open(self):&lt;br /&gt;
        self.port.open()&lt;br /&gt;
&lt;br /&gt;
    def close(self):&lt;br /&gt;
        self.port.close()&lt;br /&gt;
&lt;br /&gt;
    def send(self, value):&lt;br /&gt;
        self.port.write(value)&lt;br /&gt;
                           &lt;br /&gt;
    def blinkSSVEP(self,d, p1, p2):&lt;br /&gt;
        '''&lt;br /&gt;
        d = list of frequencies;&lt;br /&gt;
        p1:p2 = ratio LED_on_time/LED_off_time&lt;br /&gt;
        if you want i-th LED to be OFF all the time send  d[i] = 0&lt;br /&gt;
        if you want i-th LED to be ON all the time send  d[i] = -1&lt;br /&gt;
        in these two cases p1 and p2 do not matter&lt;br /&gt;
        '''&lt;br /&gt;
        clock  = 62500&lt;br /&gt;
        factor = float(p1) / float(p1 + p2)&lt;br /&gt;
    &lt;br /&gt;
        str = chr(3) # 'SSVEP_RUN'&lt;br /&gt;
&lt;br /&gt;
        for i in range(len(d)):&lt;br /&gt;
            # i-th LED OFF&lt;br /&gt;
            if d[i] == 0:                       &lt;br /&gt;
                str += to_hex_word(0) + to_hex_word(255) &lt;br /&gt;
            # i-th LED ON&lt;br /&gt;
            elif d[i] == -1:&lt;br /&gt;
                str += to_hex_word(255) + to_hex_word(0)&lt;br /&gt;
                #str = 'S'&lt;br /&gt;
                # i-th LED blinks d[i] times per second&lt;br /&gt;
                # p1:p2 = on_time:off_time in one blink&lt;br /&gt;
            else:&lt;br /&gt;
                period = clock/d[i]&lt;br /&gt;
                bright = int((clock/d[i]) * factor)&lt;br /&gt;
                dark = period - bright&lt;br /&gt;
                str += to_hex_word(bright) + to_hex_word(dark)&lt;br /&gt;
&lt;br /&gt;
        self.send(str)&lt;br /&gt;
&lt;br /&gt;
    def blinkP300(self,d):&lt;br /&gt;
        clock  = 62500&lt;br /&gt;
        str = chr(4) # 'P300_RUN'&lt;br /&gt;
&lt;br /&gt;
        for i in range(len(d)):&lt;br /&gt;
            period = int(clock*d[i]/1000.0)&lt;br /&gt;
            str += to_hex_word(period)&lt;br /&gt;
            print(period)&lt;br /&gt;
&lt;br /&gt;
        self.send(str)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
--&amp;gt; &amp;lt;!-- Kod w Pythonie 3 --&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# -*- coding: cp1250 -*-&lt;br /&gt;
import serial&lt;br /&gt;
import logging&lt;br /&gt;
import sys&lt;br /&gt;
import os&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
def to_hex_word(a):&lt;br /&gt;
    '''encodes a decimal number hexadecimally on two bytes'''&lt;br /&gt;
    return a.to_bytes(2,byteorder=sys.byteorder)&lt;br /&gt;
 &lt;br /&gt;
class SerialPort(object):&lt;br /&gt;
    def __init__(self, port_name):&lt;br /&gt;
        import serial&lt;br /&gt;
        try:&lt;br /&gt;
            self.port = serial.Serial(&lt;br /&gt;
                port=port_name,&lt;br /&gt;
                baudrate=9600,&lt;br /&gt;
                bytesize=serial.EIGHTBITS,&lt;br /&gt;
                parity=serial.PARITY_NONE,&lt;br /&gt;
                stopbits=serial.STOPBITS_ONE,&lt;br /&gt;
                xonxoff=False&lt;br /&gt;
                )&lt;br /&gt;
        except serial.SerialException as e:&lt;br /&gt;
            print(&amp;quot;Nieprawidłowa nazwa portu lub port zajęty.&amp;quot;)&lt;br /&gt;
            raise e&lt;br /&gt;
        self.close()&lt;br /&gt;
 &lt;br /&gt;
    def open(self):&lt;br /&gt;
        self.port.open()&lt;br /&gt;
 &lt;br /&gt;
    def close(self):&lt;br /&gt;
        self.port.close()&lt;br /&gt;
 &lt;br /&gt;
    def send(self, value):&lt;br /&gt;
        self.port.write(value)&lt;br /&gt;
 &lt;br /&gt;
    def blinkSSVEP(self,d, p1, p2):&lt;br /&gt;
        '''&lt;br /&gt;
        d = list of frequencies;&lt;br /&gt;
        p1:p2 = ratio LED_on_time/LED_off_time&lt;br /&gt;
        if you want i-th LED to be OFF all the time send  d[i] = 0&lt;br /&gt;
        if you want i-th LED to be ON all the time send  d[i] = -1&lt;br /&gt;
        in these two cases p1 and p2 do not matter&lt;br /&gt;
        '''&lt;br /&gt;
        clock  = 62500&lt;br /&gt;
        factor = float(p1) / float(p1 + p2)&lt;br /&gt;
 &lt;br /&gt;
        str = (3).to_bytes(1,byteorder=sys.byteorder) # 'SSVEP_RUN'&lt;br /&gt;
 &lt;br /&gt;
        for i in range(len(d)):&lt;br /&gt;
            # i-th LED OFF&lt;br /&gt;
            if d[i] == 0:                       &lt;br /&gt;
                str += to_hex_word(0) + to_hex_word(255) &lt;br /&gt;
            # i-th LED ON&lt;br /&gt;
            elif d[i] == -1:&lt;br /&gt;
                str += to_hex_word(255) + to_hex_word(0)&lt;br /&gt;
                #str = 'S'&lt;br /&gt;
                # i-th LED blinks d[i] times per second&lt;br /&gt;
                # p1:p2 = on_time:off_time in one blink&lt;br /&gt;
            else:&lt;br /&gt;
                period = clock/d[i]&lt;br /&gt;
                bright = int((clock/d[i]) * factor)&lt;br /&gt;
                dark = int(period - bright)&lt;br /&gt;
                str += to_hex_word(bright) + to_hex_word(dark)&lt;br /&gt;
 &lt;br /&gt;
        self.send(str)&lt;br /&gt;
 &lt;br /&gt;
    def blinkP300(self,d):&lt;br /&gt;
        clock  = 62500&lt;br /&gt;
        str = (4).to_bytes(1,byteorder=sys.byteorder) # 'P300_RUN'&lt;br /&gt;
 &lt;br /&gt;
        for i in range(len(d)):&lt;br /&gt;
            period = int(clock*d[i]/1000.0)&lt;br /&gt;
            str += to_hex_word(period)&lt;br /&gt;
 &lt;br /&gt;
        self.send(str)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Zestaw eksperymentalny===&lt;br /&gt;
Zestaw składa się ze:&lt;br /&gt;
* wzmacniacza,&lt;br /&gt;
* stymulatora &amp;amp;mdash; układ zapalający i gaszący diodę w kontrolowany sposób,  &lt;br /&gt;
* izolowanego galwanicznie układu generującego impulsy odpowiadające gaszeniu i zapalaniu diody,  o wartościach dopasowanych do akceptowalnych przez wejścia AUX wzmacniacza,&lt;br /&gt;
* komputera: w tym eksperymencie komputer będzie służył do zaprogramowania stymulatora i do rejestracji sygnałów.&lt;br /&gt;
&lt;br /&gt;
===Wersja 1: obserwacja błyskającej diody  ===&lt;br /&gt;
&amp;lt;!--Proszę zapoznać się ze standardami rejestracji wzrokowych potencjałów wywołanych [http://www.gcu.ac.uk/media/gcalwebv2/theuniversity/academicschools/sls/psytimetables/SLS%20-%20VEP_Standard_2010.pdf] --&amp;gt;&lt;br /&gt;
Proszę zapoznać się z typowym wyglądem załamków w przypadku potencjałów wzrokowych, jaki jest przedstawiony na [https://static-content.springer.com/image/art%3A10.1007%2Fs10633-009-9195-4/MediaObjects/10633_2009_9195_Fig4_HTML.gif tym rysunku] (cały artykuł jest dostępny [http://link.springer.com/article/10.1007%2Fs10633-009-9195-4 tu]).&lt;br /&gt;
&amp;lt;!--[[Plik:Fig 4 VEP.jpg|thumb|320px|right|&amp;lt;figure id=&amp;quot;fig:zalamki_VEP&amp;quot;&amp;gt;&amp;lt;/figure&amp;gt;&lt;br /&gt;
&amp;lt;xr id=&amp;quot;fig:zalamki_VEP&amp;quot;&amp;gt;Rys. %i.&amp;lt;/xr&amp;gt; Schemat załamków rozpoznawanych we wzrokowych potencjach wywołanych (z pracy: J. V. Odom i in. &amp;amp;bdquo;ISCEV standard for clinical visual evoked potentials&lt;br /&gt;
(2009 update)&amp;amp;rdquo;, Doc Ophthalmol (2010), 120:111–119).]]&lt;br /&gt;
--&amp;gt; &lt;br /&gt;
&lt;br /&gt;
==== Rejestracja ====&lt;br /&gt;
* Paradygmat: z odległości około 40 cm badany obserwuje błyski diody. Błyski powtarzają się co 1&amp;amp;plusmn;0,1 sekundy. Każdy błysk trwa 20 ms. Rejestrujemy 2 serie po 100 błysków. Częstość próbkowania 512 Hz.&lt;br /&gt;
** W pierwszej serii błyskamy tylko jedną diodą.&lt;br /&gt;
** W drugiej serii błyskamy dwiema diodami. &lt;br /&gt;
Pomiędzy seriami badany odpoczywa około 2 min. Diody powinny być ustawione na jednakową jasność błysków.&lt;br /&gt;
&lt;br /&gt;
* Pomiar&lt;br /&gt;
**Zakładamy czepek i elektrody w systemie 10-20, dbamy o to by opory pomiędzy elektrodami były poniżej 5 k&amp;amp;Omega; i różnice pomiędzy oporami różnych elektrod nie przekraczały 20%. [[Plik:Glowka10-20 ERPy.svg|thumb|600px|right]]&lt;br /&gt;
** Elektrodę GND mocujemy w otworze czepka odpowiadającym pozycji AFz (na linii centralnej 10% w stronę nosa od elektrody Fz) &lt;br /&gt;
** Montujemy także elektrodę FCz (na linii centralnej pomiędzy Fz a Cz), będziemy jej używać w montażu i w czasie analizy jako referencji.&lt;br /&gt;
&lt;br /&gt;
==== Analiza ====&lt;br /&gt;
# Filtrujemy sygnał w paśmie 1-20 Hz.&lt;br /&gt;
# Z ciągłego zapisu wycinamy fragmenty od &amp;amp;minus;300 ms do +400 ms (zero oznacza moment wystąpienia bodźca). W czasie wycinania badamy wycinane fragmenty pod względem zakresu amplitudy (wszystkie kanały powinny mieć amplitudę w granicach &amp;amp;plusmn;75 &amp;amp;mu;V) i zawartości artefaktów od mrugania (w tym celu trzeba oglądając sygnał w SVAROG-u ustalić próg na amplitudę sygnału w kanałach Fp1 i Fp2).&lt;br /&gt;
# Uśredniamy wycięte sygnały.&lt;br /&gt;
# Rysujemy średni potencjał we wszystkich kanałach.&lt;br /&gt;
# Identyfikujemy załamki N2 i P2. Mierzymy amplitudę P2 jako różnicę między ekstremalną wartością załamka P2 a ekstremalną wartością załamka N2. &lt;br /&gt;
&lt;br /&gt;
[[Plik:ZalamkiN2_P2.png‎|thumb|600px|right|  Uśredniony potencjał wywołany dla serii 1 i 2 na kanale T5 z zaznaczonymi załamkami N2 i P2. Na osi poziomej czas [s] natomiast na pionowej amplituda [μV].]]&lt;br /&gt;
Pomiar wykonujemy dla obu serii błysków.&lt;br /&gt;
&lt;br /&gt;
Pytanie: Czy intensywność bodźca wpływa na amplitudę potencjału P2?&lt;br /&gt;
Jak stwierdzić czy amplitudy załamków P2 istotnie różnią się pomiędzy seriami?&lt;br /&gt;
&lt;br /&gt;
Musimy przeprowadzić test statystyczny. Możemy skonstruować go np. tak:&lt;br /&gt;
Mamy dwa warunki I i II. Jako statystykę przyjmiemy różnicę pomiędzy amplitudą załamka zmierzoną w serii z dwoma diodami (P2&amp;lt;sub&amp;gt;II&amp;lt;/sub&amp;gt;) a amplitudą zmierzoną w serii z jedną diodą (P2&amp;lt;sub&amp;gt;I&amp;lt;/sub&amp;gt;):&lt;br /&gt;
: ''S'' = P2&amp;lt;sub&amp;gt;II&amp;lt;/sub&amp;gt; &amp;amp;minus; P2&amp;lt;sub&amp;gt;I&amp;lt;/sub&amp;gt;&lt;br /&gt;
Postawmy hipotezę zerową, że nie ma różnicy w amplitudzie pomiędzy warunkiem II a I oraz hipotezę alternatywną, że różnica taka występuje.&lt;br /&gt;
: H&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;: ''S'' = 0&lt;br /&gt;
: H&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;: ''S'' &amp;amp;ne; 0&lt;br /&gt;
Zgodnie z H&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; dla wartości ''S'' nie ma różnicy czy realizacja została zarejestrowana w warunkach I czy II, zatem można losowo poprzypisywać numery warunków do realizacji i w ten sposób uzyskać rozkład statystyki ''S'' pod warunkiem prawdziwości H&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;, czyli obliczyć średnie potencjały dla &amp;amp;bdquo;pomieszanych&amp;amp;rdquo; tagów, wyliczyć średnie potencjały dla sztucznie wygenerowaych grup, i wyliczyć różnicę amplitud dla tych średnich, czyli wartość statystyki dla hipotezy H&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Zaimplementuj test permutacyjny zgodny z powyższą koncepcją.&lt;br /&gt;
&lt;br /&gt;
===Wersja 2: obserwacja habituacji / uśrednianie w blokach ===&lt;br /&gt;
==== Rejestracja ====&lt;br /&gt;
# Paradygmat: &lt;br /&gt;
#* z odległości około 40 cm badany obserwuje błyski diody. &lt;br /&gt;
#* Błyski powtarzają się co 0,5 sekundy. &lt;br /&gt;
#* Rejestrujemy 60 serii po 15 błysków.  &lt;br /&gt;
#* Pomiędzy seriami badany odpoczywa około 10 sekund.&lt;br /&gt;
# Zakładamy czepek i elektrody w systemie 10-20, dbamy o to by opory pomiędzy elektrodami były poniżej 5 k&amp;amp;Omega; i różnice pomiędzy oporami różnych elektrod nie przekraczały 20%.&lt;br /&gt;
#* Elektrodę GND mocujemy w otworze czepka odpowiadającym pozycji AFz (na linii centralnej 10% w stronę nosa od elektrody Fz) &lt;br /&gt;
#* Montujemy także elektrodę FCz (na linii centralnej pomiędzy Fz a Cz), będziemy jej używać w montażu i w czasie analizy jako referencji.&lt;br /&gt;
#* Częstość próbkowania 512 Hz.&lt;br /&gt;
&lt;br /&gt;
==== Analiza ====&lt;br /&gt;
# Filtrujemy sygnał w paśmie 0,1-20 Hz.&lt;br /&gt;
# Z ciągłego zapisu wycinamy fragmenty od &amp;amp;minus;300 ms do +600 ms (zero oznacza moment wystąpienia bodźca). W czasie wycinania badamy wycinane fragmenty pod względem zakresu amplitudy (wszystkie kanały powinny mieć amplitudę w granicach &amp;amp;plusmn;75 &amp;amp;mu;V) i zawartości artefaktów od mrugania (w tym celu trzeba oglądając sygnał w SVAROG-u ustalić próg na amplitudę sygnału w kanałach Fp1 i Fp2).&lt;br /&gt;
# Uśredniamy wycięte sygnały o tym samym numerze wewnątrz serii.&lt;br /&gt;
# Rysujemy serie 15 uśrednionych potencjałów dla tego kanału, który wykazywał najsilniejszy potencjał w pierwszej wersji eksperymentu.&lt;br /&gt;
&lt;br /&gt;
==Zadanie 3: rejestracja i analiza potencjału P3 ==&lt;br /&gt;
==== Rejestracja ====&lt;br /&gt;
# Paradygmat: &lt;br /&gt;
#* z odległości około 40 cm badany obserwuje błyski diody. &lt;br /&gt;
#* Błyski diody nr 1 powtarzają się co 1&amp;amp;plusmn;0,1 sekundy. &lt;br /&gt;
#* W losowych realizacjach zapalana jest także dioda nr 2. &lt;br /&gt;
#* Proporcja pomiędzy liczbą błysków pojedynczych i podwójnych powinna wynosić 10:2, przy czym błyski podwójne muszą być odseparowane co najmniej jednym błyskiem pojedynczym. &lt;br /&gt;
#* Czas zapalenia diod, tak jak w poprzednich eksperymentach, wynosi 20 ms. &lt;br /&gt;
#* Zadaniem badanego jest liczenie liczby błysków podwójnych.&lt;br /&gt;
#* Wykonujemy tyle realizacji aby zarejestrować 50 powtórzeń podwójnych błysków. &lt;br /&gt;
# Zakładamy czepek i elektrody w systemie 10-20, dbamy o to by opory pomiędzy elektrodami były poniżej 5 k&amp;amp;Omega; i różnice pomiędzy oporami różnych elektrod nie przekraczały 20%.&lt;br /&gt;
#* Elektrodę GND mocujemy w otworze czepka odpowiadającym pozycji AFz (na linii centralnej 10% w stronę nosa od elektrody Fz) &lt;br /&gt;
#* Montujemy także elektrody M1 i M2, będziemy ich używać w montażu i w czasie analizy jako referencji typu połączone uszy.&lt;br /&gt;
#* Częstość próbkowania 512 Hz.&lt;br /&gt;
&lt;br /&gt;
==== Analiza ====&lt;br /&gt;
# Filtrujemy sygnał w paśmie 0,1-20 Hz.&lt;br /&gt;
# Z ciągłego zapisu wycinamy fragmenty od &amp;amp;minus;300 ms do +600 ms (zero oznacza moment wystąpienia bodźca). W czasie wycinania badamy wycinane fragmenty pod względem zakresu amplitudy (wszystkie kanały powinny mieć amplitudę w granicach &amp;amp;plusmn;75 &amp;amp;mu;V) i zawartości artefaktów od mrugania (w tym celu trzeba oglądając sygnał w SVAROG-u ustalić próg na amplitudę sygnału w kanałach Fp1 i Fp2).&lt;br /&gt;
# Uśredniamy osobno realizacje błysków pojedynczych i błysków podwójnych.&lt;br /&gt;
# Nakładamy na siebie na rysunkach oba typy średnich.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Ćwiczenie dodatkowe: P300 BCI==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wykorzystujemy elektrody z systemu 10-10 umieszczone nad korą wzrokową: P07, O1, O2, PO8, PO3, PO4, Pz, Cz.&lt;br /&gt;
&lt;br /&gt;
Uruchamiamy &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
obci_gui --presets eeg_workshop&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
i z guzika &amp;amp;bdquo;select amplifier&amp;amp;rdquo; wybieramy właściwy wzmacniacz.&lt;br /&gt;
&lt;br /&gt;
Do kontroli jakości sygnału możemy uruchomić Svaroga.&lt;br /&gt;
&lt;br /&gt;
Dane z kalibracji zapisują się w pliku test1 w katalogu domowym użytkownika, z labiryntu w pliku test2.&lt;br /&gt;
&lt;br /&gt;
Po zakończeniu kalibracji pojawia się napis &amp;amp;bdquo;Trwają obliczenia&amp;amp;rdquo; lub podobny. Odczekujemy kilka minut, aż skończy się peer &amp;amp;bdquo;Calibration&amp;amp;rdquo; (widoczny w obci_gui) i zamykamy okienko klawiszami Alt-F4 lub zatrzymując scenariusz guzikiem &amp;amp;bdquo;Stop&amp;amp;rdquo;. W katalogu domowym pojawi się plik z wynikami kalibracji, co pozwala na uruchomienie scenariusza &amp;amp;bdquo;labirynt&amp;amp;rdquo;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Po zebraniu danych, przed wczytaniem ich do Svaroga należy w tym samym katalogu uruchomić skrypt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
#!/usr/bin/env python&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
&lt;br /&gt;
from obci.analysis.obci_signal_processing.tags import tags_file_writer&lt;br /&gt;
from obci.analysis.obci_signal_processing.read_manager import ReadManager&lt;br /&gt;
&lt;br /&gt;
def main(): &lt;br /&gt;
	file_name = 'test1'&lt;br /&gt;
	&lt;br /&gt;
	mgr = ReadManager(&lt;br /&gt;
		file_name + '.obci.xml',&lt;br /&gt;
		file_name + '.obci.raw',&lt;br /&gt;
		file_name + '.obci.tag')&lt;br /&gt;
	&lt;br /&gt;
	tags = mgr.get_tags()&lt;br /&gt;
	for i in xrange(0, len(tags)):&lt;br /&gt;
		if tags[i]['desc']['index'] == tags[i]['desc']['target']:&lt;br /&gt;
			tags[i]['name'] = 'blink_target'&lt;br /&gt;
		else:&lt;br /&gt;
			tags[i]['name'] = 'blink'&lt;br /&gt;
			&lt;br /&gt;
	tags_writer = tags_file_writer.TagsFileWriter(file_name + '.obci.tag')&lt;br /&gt;
	for tag in tags:&lt;br /&gt;
		tags_writer.tag_received(tag)		&lt;br /&gt;
	tags_writer.finish_saving(0)	&lt;br /&gt;
 &lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Aduszyk</name></author>
		
	</entry>
</feed>